一時テーブルを使用することでどのような文を参照するには、SQLサーバー

一時テーブルを使用する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 / 128AS  [ MBで一時フリースペース]  
FROM sys.dm_db_file_space_usage。

 

2.クエリのTempDBどのように多くのリソースのバージョン管理付き

SELECT   SUM(version_store_reserved_pa​​ge_count)AS  [ 使用のTempDBバージョンストアページ] SUM(version_store_reserved_pa​​ge_count)* 1.0 / 128AS  [ MB内のTempDBバージョンストア空間]  
FROM sys.dm_db_file_space_usage。

 

内部オブジェクトによって使用されているどのように多くのリソース3.クエリのTempDB:

SELECT    SUM(internal_object_reserved_pa​​ge_count)AS  [TempDBのに使用される内部オブジェクトのページ] SUM(internal_object_reserved_pa​​ge_count)* 1.0 / 128AS  [TempDBのMB内部オブジェクト・スペース]  
FROM sys.dm_db_file_space_usage。

 

どのように多くのリソース4.クエリtempdbがユーザーレベルのオブジェクトによって使用されています。

SELECT  SUM(user_object_reserved_pa​​ge_count)AS  [ 使用のTempDBユーザオブジェクトページ] 
    (SUM(user_object_reserved_pa​​ge_count)* 1.0 / 128AS  [ 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 *  8AS  [ メモリー使用量(KB)] 
  、(user_objects_alloc_page_count *  8AS  [ (KBで)ユーザーオブジェクトに割り当てられたSPACE ] 
  、(user_objects_dealloc_page_count *  8AS  [ (KBでの)ユーザーオブジェクトの割り当て解除されたスペース] 
  (internal_objects_alloc_page_count、*  8AS  [ (KBで)内部オブジェクトに割り当てられるスペース]
  、(internal_objects_dealloc_page_count *  8AS  [ (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  LENCONVERTNVARCHARMAX)、ST。TEXT))*  2 
ELSE dmv_er.statement_end_offset
END  - dmv_er.statement_start_offset)/ 2AS 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の使用の場合のために、勧告を与えることができ、上記の情報はあなたに役立つことを願って:

  1. トリガーを使用した場合、トリガー、できるだけ小さく関連の操作を使用しないようにしてください。
  2. 十分なメモリリソースの場合は、CTEの置換変数を使用することができます。
  3. ソートテーブルとインデックスは一時的なソートの多数を避けるために、合理的な設計をしてみてください。
  4. 固定サイズに拡大した一時データベースファイルと成長モードの適切なサイズ。

 

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/wanghao4023030/p/11761688.html