1

以下查询用于在商业智能仪表板中创建饼图。查询运行并返回正确的数据,但是速度非常慢(大约 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'
4

2 回答 2

3

以 %pattern% 形式对文本列进行模式匹配会强制扫描与外部 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

于 2013-01-16T19:37:10.980 回答
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'
于 2013-01-16T21:38:42.190 回答