SQL - 条件左连接计数性能很慢

时间:2013-11-19 02:21:41

标签: sql sql-server tsql count left-join

我正在使用SQL Server 2012。

我有三张桌子。建设者,地址和建设者地址。

我有以下查询用于向我提供分页期间的记录总数:

SELECT COUNT(*) FROM Builders
LEFT JOIN Addresses ON Addresses.AddressId IN 
(SELECT AddressId FROM BuilderAddresses WHERE  BuilderId = Builders.BuilderId AND IsPrimary = 1)
WHERE Builders.[Email] LIKE '%TEST'%
ORDER BY Builders.[Name]

当表中的记录接近100k +时,此查询特别慢。有没有人建议如何将此查询提交到执行得更快 ??

在具有120K记录的表格上,需要452ms来计算。当返回分页中使用的记录时,比方说100行,需要11ms。如果可以的话,我真的想改进这个。

如果我需要添加更多细节,请告诉我,我会编辑问题。

2 个答案:

答案 0 :(得分:2)

ORDER BY不需要COUNT,您可以直接加入IN删除BuilderAdresses验证。

尝试这样的事情:

SELECT COUNT(*)
FROM Builders b
LEFT JOIN BuilderAddresses ba ON ba.BuilderId = b.BuilderId AND isPrimary = 1
LEFT JOIN Addresses a ON a.AddressId = ba.AddressId
WHERE Builders.[Email] LIKE '%TEST' %

答案 1 :(得分:1)

问题最有可能是使用IN作为连接谓词的一部分。您需要做的是首先加入联结表BuilderAddresses,然后加入Addresses,这样的事情

SELECT COUNT(*) FROM Builders
JOIN BuilderAddresses ON BuilderAddresses.BuilderId = Builders.BuilderId AND isPrimary = 1
JOIN Addresses ON Addresses.AddressId = BuilderAddresses.AddressId
WHERE Builders.[Email] LIKE '%TEST%'
ORDER BY Builders.[Name]