1

これは、Itzik Ben-Gan の著書「T-SQL Querying」から引用したクエリですが、2012 年のデータベースに対しては機能しないようですが、スクリプトにタイプミスがあるに違いないと思います。

-- Isolate top waits
WITH Waits AS
(
  SELECT    wait_type,
            wait_time_s = wait_time_ms / 1000.,
            pct     = 100. * wait_time_ms / SUM(wait_time_ms) OVER(),
            rn      = ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC)
  FROM      sys.dm_os_wait_stats o
  WHERE     wait_type NOT LIKE '%SLEEP%'
  -- filter out additional irrelevant waits
)
SELECT  W1.wait_type, 
        CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
        CAST(W1.pct AS DECIMAL(12, 2)) AS pct--,
        CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct --<<XXX
FROM    Waits AS W1
        JOIN Waits AS W2 --<<XXX
         ON W2.rn <= W1.rn --<<XXX
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING  SUM(W2.pct) - W1.pct < 90 -- percentage threshold  --<<XXX
ORDER BY W1.rn;
GO

マークされたセクションをコメントアウトすると、XXX期待どおりの結果が返されます。

ここに画像の説明を入力

クエリ全体を実行すると、次のようになり、重複があり、列が正しくありませんrunning_pct

ここに画像の説明を入力

これを修正するにはどうすればよいですか? 私は句に追加しようとしAND W2.wait_type <> W1.wait_typeましたON-これは役立ちますが、その後破棄するようですwait_type:CXPACKET


編集

W1.rn彼はGROUP BYセクションにいるべきですか?

4

1 に答える 1

0

Itzik に連絡したところ、彼は親切にも以下の電子メールで返信してくれました - これは正しいです:

ジェイソンさん、こんにちは。

クエリが機能しないという意味がわかりません。まず、あなたのクエリは、私が本で提供したものの修正版のようです。ここに本からのものがあります、そしてそれは私にとってはうまくいきます:

WITH Waits AS
(
  SELECT
    wait_type,
    wait_time_ms / 1000. AS wait_time_s,
    100. * wait_time_ms / SUM(wait_time_ms) OVER() AS pct,
    ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn,
    100. * signal_wait_time_ms / wait_time_ms as signal_pct
  FROM sys.dm_os_wait_stats
  WHERE wait_time_ms > 0
    AND wait_type NOT LIKE N'%SLEEP%'
)
SELECT
  W1.wait_type,
  CAST(W1.wait_time_s AS NUMERIC(12, 2)) AS wait_time_s,
  CAST(W1.pct AS NUMERIC(5, 2)) AS pct,
  CAST(SUM(W2.pct) AS NUMERIC(5, 2)) AS running_pct,
  CAST(W1.signal_pct AS NUMERIC(5, 2)) AS signal_pct
FROM Waits AS W1
  JOIN Waits AS W2
    ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct, W1.signal_pct
HAVING SUM(W2.pct) - W1.pct < 90 -- percentage threshold
    OR W1.rn <= 5
ORDER BY W1.rn;
GO

あなたのバージョンに関しては、AS pct の直後に行コメント指定子 (2 つのダッシュ) が間違って配置されているようです (以下の強調表示された部分を参照)。

WITH Waits AS
(
  SELECT    wait_type,
            wait_time_s = wait_time_ms / 1000.,
            pct     = 100. * wait_time_ms / SUM(wait_time_ms) OVER(),
            rn      = ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC)
  FROM      sys.dm_os_wait_stats o
  WHERE     wait_type NOT LIKE '%SLEEP%'
  -- filter out additional irrelevant waits
)
SELECT  W1.wait_type,
        CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
        CAST(W1.pct AS DECIMAL(12, 2)) AS pct--,
        CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct --<<XXX
FROM    Waits AS W1
        JOIN Waits AS W2 --<<XXX
         ON W2.rn <= W1.rn --<<XXX
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING  SUM(W2.pct) - W1.pct < 90 -- percentage threshold  --<<XXX
ORDER BY W1.rn;

削除すると、クエリは正常に実行されるようです。

WITH Waits AS
(
  SELECT    wait_type,
            wait_time_s = wait_time_ms / 1000.,
            pct     = 100. * wait_time_ms / SUM(wait_time_ms) OVER(),
            rn      = ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC)
  FROM      sys.dm_os_wait_stats o
  WHERE     wait_type NOT LIKE '%SLEEP%'
  -- filter out additional irrelevant waits
)
SELECT  W1.wait_type,
        CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
        CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
        CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct --<<XXX
FROM    Waits AS W1
        JOIN Waits AS W2 --<<XXX
         ON W2.rn <= W1.rn --<<XXX
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING  SUM(W2.pct) - W1.pct < 90 -- percentage threshold  --<<XXX
ORDER BY W1.rn;

それでも実行できない場合は、発生しているエラーをお知らせください。

乾杯、イツィク

于 2013-09-03T06:57:00.633 に答える