web-dev-qa-db-ja.com

Azuredbデータベース 'tempdb'がサイズクォータに達しました

S3層でV12 Azureデータベースインスタンスを実行しています。データベースには、まだ約100GBの空き容量があります。別の非Azure SQLサーバーで実行されているSSISで85MBのXMLファイルをロードし、それをAzureデータベースに直接挿入すると、ターゲットデータベースで挿入がクラッシュし、次のエラーが発生します。

データベース 'tempdb'がサイズクォータに達しました。データをパーティション化または削除するか、インデックスを削除するか、可能な解決策についてドキュメントを参照してください。

Tempdbに制限はありますか?これがクラッシュする理由はありますか? 85MBのファイルがデータベースの残りのスペースを埋める方法はありません。 tempdbは何らかの形で隠されているようですが、その使用状況を監視するにはどうすればよいですか?

4
Jan

制限はサービストライアによって異なります。この状況では、データベースの場合は250 GB以上ですが、このデータベースに接続されたtempdbの場合は32 MBしかありません。ここで他の利用可能なリソース Azure SQLデータベースのリソース制限 とAzure tempdbに関する情報はこちら SQLデータベースのTempdbデータベース で確認できます。

Tempdbで何が行われているのかを調査できるオプションがいくつかあります。これは非表示ですが、sysオブジェクトにクエリを実行して、この種のデータベースに関する情報を取得できます。次のリソースを確認してください。

Tempdbリソースを消費しているものを見つけたら、それを修正するか、追加情報で質問を拡張できるはずです。

おっしゃったように、ファイルは85 MBであり、最大tempdbデータサイズを超えていることがわかります。一度に小さなデータチャンクで作業してみてください。このシナリオでは、一括挿入も検討する必要があります。

1
Paweł Tajs

以下を実行すると、(Azure V12データベース内の)Tempdbを使用しているタスクに関する情報を取得できます(userDBから実行)。

SELECT es.Host_name , es.login_name , es.program_name
     , st.dbid as QueryExecContextDBID, DB_NAME(st.dbid) as QueryExecContextDBNAME
     , st.objectid as ModuleObjectId
     , SUBSTRING(st.text, er.statement_start_offset/2 + 1
                        ,(CASE WHEN er.statement_end_offset = -1 
                               THEN LEN(CONVERT(nvarchar(max),st.text))*2 
                               ELSE er.statement_end_offset
                          END - er.statement_start_offset)/2
                ) as Query_Text
     , tsu.session_id ,tsu.request_id, tsu.exec_context_id
     , (tsu.user_objects_alloc_page_count - tsu.user_objects_dealloc_page_count) as OutStanding_user_objects_page_counts
     , (tsu.internal_objects_alloc_page_count - tsu.internal_objects_dealloc_page_count) as OutStanding_internal_objects_page_counts
     , er.start_time, er.command, er.open_transaction_count
     , er.percent_complete, er.estimated_completion_time
     , er.cpu_time, er.total_elapsed_time, er.reads,er.writes
     , er.logical_reads, er.granted_query_memory 
FROM tempdb.sys.dm_db_task_space_usage tsu  
JOIN sys.dm_exec_requests er 
    ON tsu.session_id = er.session_id 
   AND tsu.request_id = er.request_id  
JOIN sys.dm_exec_sessions es 
    ON tsu.session_id = es.session_id   
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) st 
WHERE (tsu.internal_objects_alloc_page_count 
      +tsu.user_objects_alloc_page_count) > 0 
ORDER BY (tsu.user_objects_alloc_page_count -
          tsu.user_objects_dealloc_page_count)
       + (tsu.internal_objects_alloc_page_count - 
          tsu.internal_objects_dealloc_page_count) DESC  
0
Subbu