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 に答える