LoginSignup
1
3

More than 5 years have passed since last update.

重いクエリを調べる

Posted at

調査用クエリ

動的管理ビューを使用した SQL Azure の監視
「クエリ パフォーマンスの監視」を参照のこと。

調査用クエリ
SELECT TOP 5 query_stats.query_hash AS "Query Hash", 
    SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",
    MIN(query_stats.statement_text) AS "Statement Text"
FROM 
    (SELECT QS.*, 
    SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
    ((CASE statement_end_offset 
        WHEN -1 THEN DATALENGTH(st.text)
        ELSE QS.statement_end_offset END 
            - QS.statement_start_offset)/2) + 1) AS statement_text
     FROM sys.dm_exec_query_stats AS QS
     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;

以下蛇足

検証で使った材料です。
まずはテーブル。

テーブル
create table test01(
    ymd int not null,
    h int not null,
    m int not null,
    s int not null,
    primary key (ymd,h,m,s)
)

以下のSQLを実行すると60レコードが挿入されます。
(調査用クエリはCPU Timeで調査を行っているため、実データは少量で重いSQLを実行したい)

データ生成
declare @d as datetime
set @d = sysdatetime()
set @d = '2015-1-1'

begin transaction
while @d < '2015-1-1 0:01:00' 
begin
    insert into test02 values(year(@d) * 10000 + month(@d) * 100 + day(@d),
        datepart(hour,@d),datepart(minute,@d),datepart(second,@d));
    set @d = dateadd(second,1,@d)
end
commit transaction

そしてCPU Timeが大きくなるようなSQLです。

計測対象のSQL
select 2,count(*) from test02 a
 inner join test02 b on a.ymd=b.ymd
 inner join test02 c on a.ymd=c.ymd
 inner join test02 d on a.ymd=d.ymd
 inner join test02 e on a.ymd=e.ymd

実行時間が33秒。
なお、実行環境はWindows Azure、SQL DatabaseのBASICを使用しています。

001.PNG

Avg CPU Timeが1708400と出ています。

002.PNG

Azureポータルから確認するとDATA IOが0%でCPUがいっぱい回ってることが分かります。

003.png

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3