none
Insertに時間がかかる RRS feed

  • 質問

  • 現在、3つのサーバを試験的に調査しており、

    下記のストアドを走らせると、時間差がすごくかかるものがあり、原因がつかめずにいます。

    サーバBが遅すぎるのですが、何か原因が考えられますでしょうか?

    サーバA Xeon2.4Ghz 4c SAS 300GB 10k回転*2 RAID1  2分30秒

    サーバB Xeon1.8Ghz 4c SAS 600GB 15k回転*3 RAID5 96分45秒

    サーバC Xeron 2.8Ghz 2c SAS 1000GB 7.2K回転*2 RAID1 2分58秒

    実行したストアド

    CreatePROCEDURE CreateData ASSET NOCOUNT ON DECLARE @Cnt INT SET @Cnt = 0 WHILE @Cnt < 1000000BEGININSERTINTO TestTable VALUES (@Cnt, 'DATA' + right('0000000000' + convert(varchar, @Cnt), 10)) SET @Cnt = @Cnt + 1

    END

    RETURN

    テーブルは、

    CREATE TABLE TestTable(
        ID int NOT NULL,
        KOUMOKU varchar(20) NOT NULL,

    CONSTRAINT PK_ID PRIMARY KEY CLUSTERED(ID)




    • 編集済み FakeBlue 2014年5月21日 4:27
    2014年5月21日 4:26

回答

  • あれ、ある特定の測定結果の要因分析がしたいのか、ある環境間の Disk パフォーマンスを測定したいのか、どちらが目的なんでしょう?
    それによって話の方向が変わってきてしまう気がします。

    ある特定の測定結果の要因分析がしたいのであれば、その測定結果での処理時間の内訳(何の待ちでいくら時間がかかり、何の処理でいくら時間がかかったか)が無いことには話が始まらないかと思います。
    例えば、定番ですが各環境毎のストアド実行前と実行後の sys.dm_os_wait_stats の数値の差か、パフォーマンスモニタでのストアド実行中の CPU や Disk Queue Length あたりの傾向か、なにかそういったデータが無いと勘に頼った話しか出来ないかと思います。
    色々都合があるかと思いますので、先ず最初は測定できるものであれば何でも構わないかと思います。

    あるいは環境間の SQL Server での Disk パフォーマンスということであれば、そもそもの話になってしまいますが SQLIO や SQLIOSIM で測定するのでは駄目なんでしょうか?
    http://engineermemo.wordpress.com/2013/04/30/sqlio-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF-io-%E3%81%AE%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF/
    http://engineermemo.wordpress.com/2012/05/17/sqliosim-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%AE%9F%E6%96%BD/#more-14874


    MCITP(Database Developer/Database Administrator)

    • 回答としてマーク FakeBlue 2014年5月21日 9:30
    • 回答としてマークされていない FakeBlue 2014年5月21日 9:30
    • 回答としてマーク FakeBlue 2014年5月21日 9:31
    2014年5月21日 7:51

すべての返信

  • 要因はいろいろありますから、利用状況モニタSQL Server Profilerなどを使用して原因を調査するといいでしょう。

    ところで実行されている処理内容ですが、CTEを使って一度にINSERTした方がいいのでは、と。

    WITH SEQ AS (
    	SELECT 0 AS NUM
    	UNION ALL
    	SELECT NUM + 1
    	FROM SEQ
    	WHERE NUM < 999999
    )
    INSERT INTO TestTable
    SELECT NUM, 'DATA0000' + RIGHT(CONVERT(varchar, 1000000 + NUM), 6)
    FROM SEQ

    # テストしたわけじゃないので動くかわかりませんが…。

    2014年5月21日 6:32
  • #本筋では無いところへの反応ですみません・・・。
    再帰数の上限にひっかかるはずなので、MAXRECURSION 0 (つまり無限) を付ければ動くかと。

    WITH SEQ AS (
    	SELECT 0 AS NUM
    	UNION ALL
    	SELECT NUM + 1
    	FROM SEQ
    	WHERE NUM < 999999
    )
    INSERT INTO TestTable
    SELECT NUM, 'DATA0000' + RIGHT(CONVERT(varchar, 1000000 + NUM), 6)
    FROM SEQ
    OPTION (MAXRECURSION 0) --これを追加
    


    MCITP(Database Developer/Database Administrator)


    2014年5月21日 6:37
  • 回答ありがとうございます。

    たしかにCTEを使えば、飛躍的に速度が向上します。

    どのサーバも5秒から10秒程度で終了します。

    ですが、RAIDやHDD回転数の違いでどの程度違うかを試験したかったので、

    今回は、計測幅の大きい単純なインサート文で試しました。

    同じインストール構成でここまで違うと、何か設定が間違っているのでしょうか?

    2014年5月21日 7:24
  • あれ、ある特定の測定結果の要因分析がしたいのか、ある環境間の Disk パフォーマンスを測定したいのか、どちらが目的なんでしょう?
    それによって話の方向が変わってきてしまう気がします。

    ある特定の測定結果の要因分析がしたいのであれば、その測定結果での処理時間の内訳(何の待ちでいくら時間がかかり、何の処理でいくら時間がかかったか)が無いことには話が始まらないかと思います。
    例えば、定番ですが各環境毎のストアド実行前と実行後の sys.dm_os_wait_stats の数値の差か、パフォーマンスモニタでのストアド実行中の CPU や Disk Queue Length あたりの傾向か、なにかそういったデータが無いと勘に頼った話しか出来ないかと思います。
    色々都合があるかと思いますので、先ず最初は測定できるものであれば何でも構わないかと思います。

    あるいは環境間の SQL Server での Disk パフォーマンスということであれば、そもそもの話になってしまいますが SQLIO や SQLIOSIM で測定するのでは駄目なんでしょうか?
    http://engineermemo.wordpress.com/2013/04/30/sqlio-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF-io-%E3%81%AE%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF/
    http://engineermemo.wordpress.com/2012/05/17/sqliosim-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%AE%9F%E6%96%BD/#more-14874


    MCITP(Database Developer/Database Administrator)

    • 回答としてマーク FakeBlue 2014年5月21日 9:30
    • 回答としてマークされていない FakeBlue 2014年5月21日 9:30
    • 回答としてマーク FakeBlue 2014年5月21日 9:31
    2014年5月21日 7:51
  • 回答ありがとうございます。

    ブラウザの調子が悪くて返信が遅くなりました。

    実施したいところは、サーバCの入れ替えを考えた時にどの程度のスペックのサーバが必要かを調べたかっただけなので、ある特定結果の要因分析ではなく、ある環境でのDISKパフォーマンスを調べたかっただけです。

    確かに一概に、パフォーマンス測定といってもいろいろな要因や制約があるとは思いますが、単純に、テスト用の再帰プロシジャを走らせた時にあまりにも違いが出てしまったので、ボトルネックはどこなのかを調査しようと思い、まずは、DISKから実施したところ、思いのほか差が出てしまったので、質問に至りました。

    確かに仰る通り、SQLIO や SQLIOSIMで測定したもので十分です。

    このツールを教えて頂きありがとうございました。

    2014年5月21日 9:27