需要帮助调优SQL语句

时间:2010-03-31 16:29:04

标签: sql performance subquery

我有一个表有两个需要从查询中搜索的字段(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秒才能返回数据。它可以被重写以更快地工作吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

此外,在您提出的解决方案中,您将针对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 != '') 

答案 2 :(得分:0)

这呼吁正确的正常化。如果您有同一帐单的多个客户,则它们应位于相关表中。当你有像custno,custno2这样的字段时,你通常会遇到需要修复的设计问题。