none
SQLServerのテーブルにデータをインポートした後、初回の起動に時間がかかる RRS feed

  • 質問

  • SQLServerのあるテーブルに大量のデータを一括インポートしました。

    その後、そのテーブルを最初に使用する時、動作にかなり時間がかかりました。
    次からは、普通に使えました。
    これは、キャッシュを設定しているからなのでしょうか。

    質問ですが、この初回の時間がかかる動作を個別に行うことは可能でしょうか。
    データインポート時に時間かかかる動作はまとめて行いたいと考えています。

    こちらで似た様な質問を見つけました。
    SQL Server Exprewwにて初回クエリが遅い

    https://social.msdn.microsoft.com/Forums/aspnet/ja-JP/031dfab6-da16-4596-8f9a-579bba7a59b0/sql-server-express-12395123902102122238124631245612522123643693312356?forum=sqlserverja


    2018年6月13日 5:50

すべての返信

  • タイトルに「初回の起動に時間がかかる」とありますが、何の時間がかかるのか、そこが不明では第三者には何もわかりません。

    本文は少し表現が変えられていて「そのテーブルを最初に使用する時、動作にかなり時間がかかりました」とのことですが、使用が何を表しているか曖昧です。SQL Serverにおける使用ですからクエリの実行時間ということでしょうか? 質問文は質問者しか知りえない情報ですので、明確にお願いします。

    SQL Serverでは統計情報を管理しています。そしてクエリでは統計情報を基にクエリプランが選択されます。統計情報により行数が少ない前提で組まれたクエリプランが、いざ実行してみると行数が多く効率が悪かった、という可能性が考えられます。

    この推測が正しい場合、UPDATE STATISTICSにより統計情報を更新してやることで、適切なクエリプランが選択されるようになり、パフォーマンスが改善されるかもしれません。

    2018年6月13日 6:05
  • 申し訳ありません。

    もう少し、調査してみます。

    2018年6月13日 11:55
  • マイクロンさん

    マイクロンさんが挙げている、似たような質問のリンクから抜粋しますが、下記はお試しになりましたでしょうか?

    >だとすると、単にアクセス対象のデータがキャッシュされているかいないかの違いだけかもしれません。

    >2回目のクエリ実行であっても、dbcc dropcleanbuffersを実行後に実行すると、1回目と同じぐらいの時間がかかりますか?

    >もし、そうだとすると、データがキャッシュされているかどうかの違いということになるかと思います。

    もし、上記を試してみて、2回目のクエリ実行であっても、dbcc dropcleanbuffersを実行後の実行で遅い場合は、データをキャッシュさせればOKということになります。

    ということで、もしその場合に「データインポート時に時間かかかる動作はまとめて行いたいと考えています。」ということであれば、

    データインポートの処理の最後に、そのテーブルに対してSELECTクエリを一度実行しておけば、キャッシュにデータが乗るので、それ以降高速に実行されると思います。

    ちなみに「キャッシュを設定している」という箇所ですが、SQLServerは必ずメモリに一度データをキャッシュする必要があります。そのため、メモリに乗っけるのをデータインポートの処理の最後に連続して行えばいいのでは、という発想です。

    ---------------------------------------------------------------------

    参考になった投稿には回答としてマークいただけると嬉しいです!

    2018年6月15日 2:50