一時テーブルを使用するSQL Serverのクエリ文
最近、毎日の仕事のパフォーマンステストで発見、IOは、データベース側では、データベースの比較的大きな、定期的な2-8M変動のバージョンで読み取りおよび書き込みSQLサーバー2008 SP3です。
主に一時テーブルからこれらのIO操作は、テストの前に、我々は追跡文の一部に資源の消費を持っています。
一時テーブルを使用していくつかのステートメントを変更し、確かに釣った魚が残っていました。さらに最適化するように、私たちは、スクリーニングする必要があります。
我々が開始する前に、我々は、一時テーブルに使用される操作の種類を理解するために開始します。
- ときにユーザーオブジェクトは、そのような一時テーブル、テーブル変数として(#の##、@変数の始まり)
- カーソル
- 内部印刷や仕分け業務の一部
- スナップショット分離制御機構のためのラインバージョン
- オンラインインデックスは、操作を再構築します
- 有効MARS(複数のアクティブな結果セット)機構や操作
- トリガー
上記のメカニズムや操作の一部は、一時テーブルスペースシステムを使用します。
私たちは、一時テーブルに関連するいくつかの情報を取得するには、次のステートメントを使用することができます。
1.一時的なデータベースクエリどのように多くの予備リソース:
SELECT SUM(unallocated_extent_page_count)AS [ 一時フリーページ] 、 (SUM(unallocated_extent_page_count)* 1.0 / 128)AS [ MBで一時フリースペース] FROM sys.dm_db_file_space_usage。
2.クエリのTempDBどのように多くのリソースのバージョン管理付き
SELECT SUM(version_store_reserved_page_count)AS [ 使用のTempDBバージョンストアページ] 、 (SUM(version_store_reserved_page_count)* 1.0 / 128)AS [ MB内のTempDBバージョンストア空間] FROM sys.dm_db_file_space_usage。
内部オブジェクトによって使用されているどのように多くのリソース3.クエリのTempDB:
SELECT SUM(internal_object_reserved_page_count)AS [TempDBのに使用される内部オブジェクトのページ] 、 (SUM(internal_object_reserved_page_count)* 1.0 / 128)AS [TempDBのMB内部オブジェクト・スペース] FROM sys.dm_db_file_space_usage。
どのように多くのリソース4.クエリtempdbがユーザーレベルのオブジェクトによって使用されています。
SELECT SUM(user_object_reserved_page_count)AS [ 使用のTempDBユーザオブジェクトページ] 、 (SUM(user_object_reserved_page_count)* 1.0 / 128)AS [ MB内のTempDBユーザオブジェクト空間] FROM sys.dm_db_file_space_usage。
上記のステートメントでは、SQL Serverの各ページのサイズは、データのM単位の値を取得するために128で割った値、8Kであるため、それは、値を取得するために128で割ったページをチェックアウトします。
私たちは、以下のいくつかのシステム管理テーブルを組み合わせて、現在のセッションのTempDBユースケースを取得することができます。
- dm_db_file_space_usage - それはtempdbのファイルの使用状況にスペースを返します。
- dm_db_session_space_usage - 割り当てるために、各セッションを返し、ページ数の無料配布
- dm_db_task_space_usage - タスクページの割り当てと解放の活動に戻ります
この文で、私たちは、tempdbのの全体的なリソース割り当てていることがわかります。
SELECT ssu.session_id、 ssu.internal_objects_alloc_page_count、 ssu.user_objects_alloc_page_count、 ssu.internal_objects_dealloc_page_count、 ssu.user_objects_dealloc_page_count、 ES。* FROM sys.dm_db_session_space_usage SSU、sys.dm_exec_sessions としてES ssu.session_id = es.session_id AND (ssu.internal_objects_alloc_page_count > 0 OR ssu.user_objects_alloc_page_count > 0 OR ssu.internal_objects_dealloc_page_count > 0 OR ssu.user_objects_dealloc_page_count > 0)
我々は、使用tempdbのSQL文で、現在のセッションを取得するには、次のステートメントを介しことができます。
SELECT ssu.session_id、 ST。テキスト FROM sys.dm_db_session_space_usage としてSSU、 sys.dm_exec_requests としてのER CROSSは sys.dm_exec_sql_text(er.sql_handle)を適用AS ST ssu.session_id = er.session_id と ssu.session_id > 0 AND (ssu.internal_objects_alloc_page_count > 0 OR ssu.user_objects_alloc_page_count > 0 OR ssu.internal_objects_dealloc_page_count > 0 OR ssu.user_objects_dealloc_page_count > 0)
私たちは、tempdbは使用されている現在のセッション、およびその他の情報を取得するには、次のステートメントを使用することができます。
SELECT sys.dm_exec_sessions.session_id AS [ セッションID ] 、DB_NAME(のdatabase_id)AS [ データベース名] 、HOST_NAME AS [ システム名] 、program_nameのAS [ プログラム名] 、login_nameにAS [ ユーザー名] 、地位 、CPU_TIME AS [ CPU時間((ミリ秒)で)] 、total_scheduled_time AS [ ((ミリ秒)で)合計予定時間] 、total_elapsed_timeAS [ ((ミリ秒)での)経過時間] 、(memory_usage * 8) AS [ メモリー使用量(KB)] 、(user_objects_alloc_page_count * 8)AS [ (KBで)ユーザーオブジェクトに割り当てられたSPACE ] 、(user_objects_dealloc_page_count * 8)AS [ (KBでの)ユーザーオブジェクトの割り当て解除されたスペース] (internal_objects_alloc_page_count、* 8)AS [ (KBで)内部オブジェクトに割り当てられるスペース] 、(internal_objects_dealloc_page_count * 8)AS [ (KBで)内部オブジェクトのスペース割り当て解除] 、CASEはis_user_process WHEN 1 THEN ' ユーザーセッション' WHEN 0 THEN ' システムセッション' END AS [ セッション・タイプ]、ROW_COUNT AS [ ROWカウント] FROM SYSを.dm_db_session_space_usage INNERは 参加 sys.dm_exec_sessionsを ON sys.dm_db_session_space_usage.session_id= sys.dm_exec_sessions.session_id ORDER BYステータスASC
最後に、外国人の牛へのオンラインコレクションは、より包括的資源の利用と組み合わせるSQLステートメントを、書かれていた:参考:Pinalデイブ(https://blog.sqlauthority.com
SELECT st.dbid AS QueryExecutionContextDBID、 DB_NAME(st.dbid)AS QueryExecContextDBNAME、 st.objectid AS ModuleObjectId、 SUBSTRING(ST。TEXTは、 dmv_er.statement_start_offset / 2 + 1 、 (CASE WHEN dmv_er.statement_end_offset = - 1 THEN LEN(CONVERT(NVARCHAR(MAX)、ST。TEXT))* 2 ELSE dmv_er.statement_end_offset END - dmv_er.statement_start_offset)/ 2)AS QUERY_TEXT、 dmv_tsu.session_id、 dmv_tsu.request_id、 dmv_tsu.exec_context_id、 (dmv_tsu.user_objects_alloc_page_count - dmv_tsu.user_objects_dealloc_page_count)AS OutStanding_user_objects_page_counts、 (dmv_tsu.internal_objects_alloc_page_count - dmv_tsu.internal_objects_dealloc_page_count)AS OutStanding_internal_objects_page_counts、 dmv_er。 START_TIME、 dmv_er.command、 dmv_er.open_transaction_count、 dmv_er.percent_complete、 dmv_er.estimated_completion_time、 dmv_er.cpu_time、 dmv_er.total_elapsed_time、 dmv_er.reads、dmv_er.writes、 dmv_er.logical_reads、 dmv_er.granted_query_memory、 dmv_es。HOST_NAME 、 dmv_es.login_nameは、 dmv_es.program_name FROM sys.dm_db_task_space_usage dmv_tsu インナー JOIN dmv_er sys.dm_exec_requestsを ON(dmv_tsu.session_id = dmv_er.session_id AND dmv_tsu.request_id = dmv_er.request_id) INNERは JOIN sys.dm_exec_sessionsのdmv_esを ON(dmv_tsu.session_id = dmv_es.session_id) CROSSsys.dm_exec_sql_text(dmv_er.sql_handle)ST APPLY (dmv_tsu.internal_objects_alloc_page_count + dmv_tsu.user_objects_alloc_page_count)> = 0 ORDER BY(dmv_tsu.user_objects_alloc_page_count - dmv_tsu.user_objects_dealloc_page_count)+(dmv_tsu.internal_objects_alloc_page_count - dmv_tsu.internal_objects_dealloc_page_count)DESC
私は次のように高いのtempdbの使用の場合のために、勧告を与えることができ、上記の情報はあなたに役立つことを願って:
- トリガーを使用した場合、トリガー、できるだけ小さく関連の操作を使用しないようにしてください。
- 十分なメモリリソースの場合は、CTEの置換変数を使用することができます。
- ソートテーブルとインデックスは一時的なソートの多数を避けるために、合理的な設計をしてみてください。
- 固定サイズに拡大した一時データベースファイルと成長モードの適切なサイズ。