【发布时间】:2014-04-26 06:30:59
【问题描述】:
我正在使用下面的查询来返回行数进行分页,它工作正常但需要很长时间才能返回,因为所有表都有数百万条记录。 目前它需要 7 秒才能返回行数,任何人都可以帮助我快速返回它。
我也尝试过使用#table 和@table 进行相同的查询,它们都很慢。 查询是
WITH cte_rowcount
AS (SELECT p.policyid
FROM resident (nolock) r
INNER JOIN resident_policy (nolock) rp
ON r.residentid = rp.residentid
INNER JOIN policy (nolock) p
ON p.policyid = rp.policyid
--INNER JOIN PolicySource (NOLOCK) psourse ON p.PolicySourceID = psourse.PolicySourceId
INNER JOIN policy_locations (nolock) pl
ON pl.policyid = p.policyid
INNER JOIN location (nolock) l
ON pl.locationid = l.locationid
--INNER JOIN Policy_Status (NOLOCK) ps ON ps.PolicyStatusId = p.PolicyStatusId
INNER JOIN property (nolock) pr
ON pr.propertyid = l.propertyid
--INNER JOIN dbo.States (NOLOCK) s ON s.StateId = pr.StateId
WHERE r.primary_resident = 0x1
AND ( ( @ResidentFirstName IS NULL )
OR R.firstname LIKE @ResidentFirstName + '%' )
AND ( ( @ResidentLastName IS NULL )
OR R.firstname LIKE @ResidentLastName + '%' )
AND ( @PropertyAddress IS NULL
OR pr.address LIKE @PropertyAddress + '%' )
AND ( @Policynumber IS NULL
OR p.policynumber LIKE @Policynumber + '%' )
AND ( @LocationAddress IS NULL
OR l.address2 LIKE @LocationAddress + '%' )
AND ( @City IS NULL
OR pr.city LIKE @City + '%' )
AND ( @ZipCode IS NULL
OR pr.zipcode = @ZipCode )
AND ( @StateId IS NULL
OR pr.stateid = @StateId )
AND ( @PolicyStatusId IS NULL
OR p.policystatusid = @PolicyStatusId ))
SELECT @rowcount = Count(*)
FROM cte_rowcount
【问题讨论】:
-
您想从包含数百万行的 6 个表的连接中计算行数,其中任何一个都有条件。即使有良好的索引,我也不会期待奇迹。这些看起来都像外键,如果这是真的,你应该拥有你需要的大部分索引。您应该在要过滤的列上添加索引(因为您匹配值的开头,这可能会有所帮助)。您还可以优化 SQL 动态地省略不需要的连接和过滤器(删除那些 @IS NULL 语法)。
-
你似乎也有一个错误,在那里你使用 @ResidentLastName 来匹配 R.firstname 列。
标签: sql sql-server tsql rowcount