想知道除了添加索引之外是否还有其他方法可以使后续的sql查询更有效

时间:2011-03-22 13:45:06

标签: sql sql-server

以下是查询:

SELECT DISTINCT patientid.acct
FROM   patientid,
       doc_table
WHERE  patientid.acct = doc_table.acct
       AND patientType IN ( 'I', '1', 'T' )
       AND fid IN ( '023' )
       AND ( dischargedate IS NULL
              OR dischargedate = ''
              OR dischargedate < '19000101' )
       AND dbcreate_date > DATEADD(hh, -24, GETDATE());  

我们将添加patientType,fid dischargeate和dbcreate_date的标记。但我想知道查询本身是否可以用不同的方式编写以使其更有效。

谢谢,

3 个答案:

答案 0 :(得分:1)

如果没有更多信息,很难成为规定性的,但总的来说:

1 - 您确定需要DISTINCT吗?对于较大的数据集,这可能是一项昂贵的操作。在没有它的情况下运行查询以查看结果是否不同。如果他们这样做,您可能想要更改结构以消除重复。

2 - 首先在您的WHERE子句中放入最严格的条件,然后按限制的降序排列。例如,如果您的patienttype过滤器将结果降至50%,但fid过滤器会将其降至20%,请先使用fid过滤器。

3 - 对于索引,请确保您的JOIN密钥已编入索引:patientid.acctdoc_table.acct这可能会对性能产生最大影响。

另一方面,使用显式JOIN语法,它更容易阅读和维护,尤其是在较长的查询上。修订版将是:

SELECT DISTINCT patientid.acct
FROM   patientid 
INNER JOIN  doc_table
    ON patientid.acct = doc_table.acct
WHERE patientType IN ( 'I', '1', 'T' )
...

答案 1 :(得分:0)

使用WHERE EXISTS代替JOIN并使用DISTINCT

删除重复项

答案 2 :(得分:0)

您应该考虑的一件事:修复列dischargedate的值并选择一个值null or '' or < '19000101',以便您可以摆脱or:a)它需要花费时间和b)数据库不应该是一团糟。