我使用了以下主题中的解决方案(来自AdaTheDev),因为它与同一个问题有关: How to exclude records with certain values in sql select
但是,当将相同的查询应用于超过40,000条记录时,查询处理时间过长(> 30分钟)。是否有另一种方法可以查询具有特定值的某些记录(与上述stackoverflow线程中的问题相同)。我试图在下面使用这个,但仍然没有运气:
SELECT StoreId
FROM sc
WHERE StoreId NOT IN (
SELECT StoreId
FROM StoreClients
Where ClientId=5
);
谢谢 -
答案 0 :(得分:1)
您可以使用EXISTS
:
SELECT StoreId
FROM sc
WHERE NOT EXISTS (
SELECT 1
FROM StoreClients cl
WHERE sc.StoreId = cl.StoreId
AND cl.ClientId = 5
)
确保在StoreId
列上创建索引。您的查询也可以从ClientId
上的索引中受益。
答案 1 :(得分:1)
对于SQL Server,40,000行不是太大。另一个线程也提出了一些好的问题。如果我理解正确,你现在的问题就是表现。 要提高性能,您可能需要向表中添加新索引,或者只更新表中的统计信息。
如果您在SQL Server Management Studio中运行此查询以进行测试和性能调整,请确保选择"包含实际执行计划"。这将使查询执行时间更长,但执行计划结果可以帮助您花费时间。 它通常建议添加一些索引以提高性能,这很容易遵循。 如果无法添加新索引,那么您必须花一些时间阅读如何理解执行计划的图表并找到缓慢的区域。