Sql server SQL Server性能调整-具有150万行数据的联合表
我有一个存储过程,它联合两个表,每个表有150万行数据。为默认搜索字段VARCHAR255创建了全文索引,并在select/where子句中创建了覆盖列名的非聚集索引 此外,将应用分页,并仅从这两个目录中获取必要的列 桌子 在合并表后,我需要不同的记录,因此使用UNION 查询的响应时间从3秒到1分钟多不等。当筛选器文本仅包含两个字符时,它的速度太慢,但在重复执行时仍会更快地获取值Sql server SQL Server性能调整-具有150万行数据的联合表,sql-server,Sql Server,我有一个存储过程,它联合两个表,每个表有150万行数据。为默认搜索字段VARCHAR255创建了全文索引,并在select/where子句中创建了覆盖列名的非聚集索引 此外,将应用分页,并仅从这两个目录中获取必要的列 桌子 在合并表后,我需要不同的记录,因此使用UNION 查询的响应时间从3秒到1分钟多不等。当筛选器文本仅包含两个字符时,它的速度太慢,但在重复执行时仍会更快地获取值 DECLARE @start INT, @length INT, @searchQuery VARCHAR(100
DECLARE @start INT, @length INT, @searchQuery VARCHAR(100) --Param
DECLARE @sortQuery VARCHAR(100)
SET @sortQuery = @searchQuery;
SET @searchQuery = ('"' + @searchQuery + '*"');
SELECT temp2.*
, t3.Name AS CountryName
, t5.Name AS CityName
, t4.Name AS StateProvinceName
, t4.Code AS StateProvinceCode
FROM
(SELECT temp1.* FROM
(SELECT ID
, Name
, ISNULL(Address1, '') AS AddressLine1
, ISNULL(Address2, '') AS AddressLine2
, ISNULL(CityID, 0) AS CityID
, ISNULL(CountryID, 0) AS CountryID
, ISNULL(StateProvinceID, 0) AS StateProvinceID
, ISNULL(PostalCode, '') AS PostalCode
FROM Table1
WHERE Deleted= 0 AND CONTAINS(Name, @searchQuery)
UNION
SELECT t2.EmployerID AS ID
, t2.DivisionName AS Name
, t2.Address1 AS AddressLine1
, t2.Address2 AS AddressLine2
, t2.CityID AS CityID
, t2.CountryID AS CountryID
, t2.StateProvinceID AS StateProvinceID
, t2.PostalCode AS PostalCode
FROM Table2 t2
JOIN Employer t1 ON t2.EmployerID = t1.ID
WHERE t2.Deleted= 0 AND t2.DivisionName IS NOT NULL AND t2.DivisionName <> ''
AND t1.Deleted = 0 AND t2.CountryID IS NOT NULL AND t2.Address1 IS NOT NULL AND t2.Address2 IS NOT NULL
AND CONTAINS(t2.DivisionName, @searchQuery)
) temp1
ORDER BY (CASE WHEN temp1.Name LIKE @sortQuery +'%' THEN 2 ELSE 1 END) DESC, temp1.Name
OFFSET @start ROWS
FETCH NEXT @length ROWS ONLY
) temp2
JOIN Table3 t3 ON C.ID = temp2.CountryID
JOIN Table4 t4 ON S.ID = temp2.StateProvinceID
JOIN Table5 t5 ON Ct.ID = temp2.CityID
ORDER BY temp2.Name
是否使用了该索引?您在查询计划中看到了吗?您的分页是如何工作的?是否将所有筛选的行都存储在临时表中?听起来可能是参数嗅探问题,或者该存储过程的缓存查询计划未优化。是否尝试使用UNION all而不是UNION?UNION消除了重复记录,而UNION只是将它们组合在一起。这些表中的数据经常更改吗?了解搜索中使用的模式和字段也很有用。Hello Ivan,我使用全文索引和非聚集索引,包括所选字段。分页是使用偏移量0行实现的,仅获取下一个10行。我不是使用临时表,而是使用内部查询来筛选所需的行,然后进行其他连接以获取更多信息。查询返回最终结果集中的12个字段。