Sql server SQL Server性能调整-具有150万行数据的联合表

Sql server SQL Server性能调整-具有150万行数据的联合表,sql-server,Sql Server,我有一个存储过程,它联合两个表,每个表有150万行数据。为默认搜索字段VARCHAR255创建了全文索引,并在select/where子句中创建了覆盖列名的非聚集索引 此外,将应用分页,并仅从这两个目录中获取必要的列 桌子 在合并表后,我需要不同的记录,因此使用UNION 查询的响应时间从3秒到1分钟多不等。当筛选器文本仅包含两个字符时,它的速度太慢,但在重复执行时仍会更快地获取值 DECLARE @start INT, @length INT, @searchQuery VARCHAR(100

我有一个存储过程,它联合两个表,每个表有150万行数据。为默认搜索字段VARCHAR255创建了全文索引,并在select/where子句中创建了覆盖列名的非聚集索引

此外,将应用分页,并仅从这两个目录中获取必要的列 桌子

在合并表后,我需要不同的记录,因此使用UNION

查询的响应时间从3秒到1分钟多不等。当筛选器文本仅包含两个字符时,它的速度太慢,但在重复执行时仍会更快地获取值

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个字段。