使用DISTINCT优化​​sql查询

时间:2014-05-06 01:36:45

标签: sql

我在表attr,data和extradata上有几个内连接的查询,如下所示:

SELECT DISTINCT TOP(10) a.ID 
   FROM attr AS a 
       INNER JOIN data AS X ON a.ID = X.ID
       INNER JOIN extradata XA ON X.dataID = XA.dataID    
   WHERE X.data = 'condition1' 
     and XA.dataID NOT IN (SELECT dataID FROM extradata WHERE XA.additionaldata = 'condition2')

对于仅返回前10个(TOP(10))记录的内容,查询大约需要15分钟才能完成。当我替换:

SELECT DISTINCT TOP(10) a.ID

使用

SELECT DISTINCT TOP(10) *

查询只需几秒钟。另外,我可能应该重写以下部分:

and XA.dataID NOT IN (SELECT dataID FROM extradata WHERE XA.additionaldata = 'condition2')

因为当我注释掉这一行时,查询再次只需几秒钟。到目前为止,我试过了:

and NOT EXISTS (SELECT dataID FROM extradata WHERE XA.additionaldata = 'condition2')

但没有用,查询仍然需要花费很多时间。仅供参考,所有表格均包含约100万条记录。

1 个答案:

答案 0 :(得分:1)

您可以通过删除两个额外的联接并使用not exists

来简化查询
SELECT DISTINCT TOP(10) X.ID 
FROM data X
WHERE X.data = 'condition1' AND
      NOT EXISTS (SELECT dataID
                  FROM extradata ed
                  WHERE XA.additionaldata = 'condition2' AND ed.dataId = X.dataID
                 );

这可能就足够了。对于此查询,您可以开始使用索引。我建议data(data, dataID, ID)extradata(dataID, additionaldata)

这假设连接不用于过滤,至少不是以相关方式。如果是这样,您可以在where子句中添加其他条件:

SELECT DISTINCT TOP(10) X.ID 
FROM data X
WHERE X.data = 'condition1' AND
      NOT EXISTS (SELECT 1
                  FROM extradata ed
                  WHERE XA.additionaldata = 'condition2' AND ed.dataId = X.dataID
                 ) AND
      EXISTS (SELECT 1 FROM attr a WHERE a.ID = X.ID);