Question

yhaaaa on Thu, 03 Mar 2016 01:21:37


SQL Server Expressについての質問です。

SQL Serverのバージョンは以下の通りです。
Microsoft SQL Server 2014 - 12.0.4213.0 (X64)
Express Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

Windows Serverのバージョンは以下の通りです。
Windows Server 2012 R2 Datacenter

上記の環境でSQLServerを再起動後、あるクエリを実行すると処理に2分近くかかります。
再度、同じクエリを実行すると1秒程度で完了します。

Microsoft SQL Server 2012 Standard でデータ量を同じにして、
同様の検証を行った場合、初回も2度目以降も1秒程度で完了します。
該当のクエリの推定実行プランも確認しましたが問題が無いように見受けられます。

SQL Server ExpressにてSQL Serverログより以下の2つのログが頻繁に記録されています。

-----------------------
日付  2016/03/03 8:33:14
ログ  SQL Server (現在 - 2016/03/03 9:13:00)
ソース  spid57
メッセージ
Starting up database 'ReportServerTempDB'.
-----------------------
日付  2016/03/03 8:28:28
ログ  SQL Server (現在 - 2016/03/03 9:13:00)
ソース  spid52
メッセージ
Starting up database 'ReportServer'.
-----------------------

何かご存知の方がいらっしゃいましたら、ご教授頂ければと思います。
よろしくお願いいたします。


Sponsored



Replies

MKIII on Fri, 04 Mar 2016 05:11:46


データベースの autoclose オプションが有効になっていて、初回実行時にデータベースがオープンされ、2回目以降はオープンされた状態が保持されているから、ということはないでしょうか?

yhaaaa on Fri, 04 Mar 2016 11:57:54


ご回答ありがとうございます!

'ReportServerTempDB'、'ReportServer'のautocloseオプションは有効になっておりました。いづれも無効とし、再検証を行いましたが、結果は同じでした。

その他、SQL Server Expressの設定等で留意すべき点はございますでしょうか?

Microsoft Japan SQL Server Support Team on Mon, 07 Mar 2016 01:44:45


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

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

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

StandardとExpressでは、先行読み取りの動きが違うなどあるかもしれません。

yhaaaa on Mon, 07 Mar 2016 04:47:54


ご回答ありがとうございます!

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

→ dbcc dropcleanbuffersを実行後に同じクエリを実行した場合は、すぐに結果が返ってきました。

追加で以下の検証を行いました。

DBを再起動後、問題となっているクエリを実行し、その後に以下のクエリを実行し、初回クエリの実行時間(ミリ秒)を測定してみました。
---------------------------------------------------
select top 100
 total_worker_time / execution_count / 1000.0 as [Avg CPU ms ],
 total_elapsed_time / execution_count / 1000.0 as [Avg RUN ms ],
 execution_count,
 SUBSTRING
  ( text,
   ( statement_start_offset / 2 ) + 1,
   ( (
    case statement_end_offset
     when -1 then datalength( text )
     else statement_end_offset
    end
    - statement_start_offset
     ) / 2
   ) + 1
  ) as [SQL Statement]
 from sys.dm_exec_query_stats
  cross apply
   sys.dm_exec_sql_text ( sql_handle )
 order by 1 desc
---------------------------------------------------

結果は以下の通りでした。
Avg CPU ms = 406.245000 (ms)

Avg RUN ms = 453.125000 (ms)

execution_count = 1

実行時間は「453.125000 (ms)」と1秒以内で完了しています。SELECTした結果が結果として表示されるまでには2分程度かかります。

yhaaaa on Tue, 15 Mar 2016 04:54:58


 DBCC FREEPROCCACHE
 DBCC DROPCLEANBUFFERS

を実行した場合は2回目の実行であっても、1回目と同じぐらいの時間がかかりました。

クエリプランの作成に時間が掛かっているようなので、クエリを見直し、対応することとしました。

ご協力、ありがとうございました。