SQL服务器查询运行速度极慢

时间:2013-01-16 19:30:57

标签: sql-server query-optimization

以下查询用于在商业智能仪表板中创建饼图。查询运行并返回正确的数据,但速度非常慢(约36秒)。任何人都可以看到优化此查询的方法吗?

SELECT 
Name,
Date,
Severity,
PMissing


FROM
(
SELECT
Name,
Date,
Severity,
PMissing,

DENSE_RANK() OVER (PARTITION BY Name ORDER BY ate DESC) AS Rnk

FROM PctbyP

WHERE (Name like '%front-%'
OR Name like '%back-%'
OR Name like '%ap-%'
OR Name like '%mps-%'
OR Name like '%mg-%')
)t
WHERE rnk=1
AND PMissing != '0'

2 个答案:

答案 0 :(得分:3)

在%pattern%形式的text列上执行模式匹配会强制扫描与外部WHERE条件匹配的所有记录(如果Name上有索引,则无论如何都无法使用它)。

我猜测你的WHERE标准不是很有选择性,这意味着正在扫描表中的大量行以查看它们是否符合LIKE标准。

如果我的假设是正确的,那么通过使用全文搜索而不是LIKE,您可能会看到显着的性能提升

http://msdn.microsoft.com/en-us/library/ms142571.aspx

  

针对大量非结构化文本数据的LIKE查询比针对相同数据的等效全文查询慢得多。对数百万行文本数据的LIKE查询可能需要几分钟才能返回;而对于相同的数据,全文查询只需几秒或更短时间,具体取决于返回的行数。

http://msdn.microsoft.com/en-us/library/ms142571.aspx#like

答案 1 :(得分:1)

创建索引视图:

CREATE VIEW
        V_PctbyP_Name
WITH SCHEMABINDING
AS
SELECT  Name, COUNT_BIG(*) AS Cnt
FROM    dbo.PctbyP
GROUP BY
        Name

CREATE UNIQUE CLUSTERED INDEX
        UX_V_PctbyP_Name
ON      V_PctbyP_Name (Name)

,然后在表格上创建一个索引:

CREATE INDEX
        IX_PctbyP_Name_Date
ON      PctbyP (Name, [Date])

,然后使用此查询:

SELECT  pa.*
FROM    V_PctbyP_Name vp
CROSS APPLY
        (
        SELECT  TOP 1 WITH TIES
                Name, [Date], Severity, PMissing
        FROM    PctbyP p
        WHERE   p.Name = vp.Name
        ORDER BY
                [Date] DESC
        ) pa
WHERE   (
        vp.Name LIKE '%front-%'
        OR
        vp.Name LIKE '%back-%'
        OR
        vp.Name LIKE '%ap-%'
        OR
        vp.Name LIKE '%mps-%'
        OR
        vp.Name LIKE '%mg-%'
        )
        AND pa.PMissing <> '0'