【问题标题】:Need help tuning a SQL statement需要帮助调整 SQL 语句
【发布时间】:2010-03-31 16:29:04
【问题描述】:

我有一个表,其中包含需要从查询中搜索的两个字段(custno 和 custno2)。这张桌子不是我设计的,所以不要对我大喊大叫。 :-) 我需要找到 custno 或 custno2 与基于 titleno 的同一表上的查询返回的值匹配的所有记录。

换句话说,用户输入 1234 作为 titleno。我的查询搜索表以找到与 titleno 关联的 custno。它还查找该titleno 的custno2。然后,它需要在同一个表中搜索所有其他记录,这些记录在之前的搜索中返回 custno 或 custno2 字段中的 custno 或 custno2 字段。

这是我想出的:

SELECT BILLYR, BILLNO, TITLENO, VINID, TAXPAID, DUEDATE, DATEPIF, PROPDESC
FROM TRCDBA.BILLSPAID
WHERE CUSTNO IN
 (select custno from trcdba.billspaid where titleno = '1234'
  union select custno2 from trcdba.billspaid where titleno = '1234' and custno2 != '')
OR CUSTNO2 IN
 (select custno from trcdba.billspaid where titleno = '1234'
  union select custno2 from trcdba.billspaid where titleno = '1234' and custno2 != '')

查询返回数据大约需要 5-10 秒。可以重写以更快地工作吗?

【问题讨论】:

  • 对于什么数据库(版本也是)?
  • 表格可以同时填写custno和custno2吗?

标签: sql performance subquery


【解决方案1】:

一个简单的快速提升可能是将您的 'union' 更改为 'union all'(我是一个 sql server 人 - 这适用于其他 dbs 吗?)

否则,它可能需要一些特定于数据库的技巧 - 您使用的是哪个数据库?

【讨论】:

    【解决方案2】:

    此外,在您提出的解决方案中,您根据 titleno = 1234 过滤 BILLSPAID 表四次。根据您的数据库平台、重复 titleno 的项目数以及 titleno 是否被索引,使用临时表可能会显着提高。同样,根据您的平台,这可能类似于:

    SELECT * FROM TRCDBA.BILLSPAID INTO MyTempTable 
    WHERE titleno = '1234';
    
    SELECT BILLYR, BILLNO, TITLENO, VINID, TAXPAID, DUEDATE, DATEPIF, PROPDESC 
    FROM MyTempTable
    WHERE CUSTNO IN 
     (select custno from MyTempTable 
      union all select custno2 from MyTempTable where custno2 != '') 
    OR CUSTNO2 IN 
     (select custno from MyTempTable 
      union all select custno2 from MyTempTable where custno2 != '') 
    

    【讨论】:

    • 如果你要使用一个临时表,你最好输入不同的 custno 和 custno2 值来减少子查询到单个表选择。
    【解决方案3】:

    这需要适当的标准化。如果同一账单有多个客户,他们应该在相关表中。当您有诸如 custno、custno2 之类的字段时,您通常会遇到需要修复的设计问题。

    【讨论】:

    • 你正在向合唱团布道。这些不是我设计的。我只需要访问我的网络应用程序的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多