我在表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万条记录。
答案 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);