sql >> データベース >  >> RDS >> Sqlserver

すべてのテーブルの個別の数を照会すると、Tempdb がいっぱいになる

    TempDb ファイルを追加する前に、常に競合を考慮する必要があります。 7 つの TempDb ファイルを追加しても、実際には役に立ちません。

    いいえ、そうすべきではありません。しかし、大量のデータを扱っていない、または SQL で他のプロセスを実行していないという確信はありますか?カーソル、Temp テーブル、さらにはテーブル変数でさえ、TempDb を広範囲に使用します。どのオブジェクトがより多くの TempDb スペースを消費しているかを確認します:

    SELECT
        SUM (user_object_reserved_page_count)*8 as usr_obj_kb,
        SUM (internal_object_reserved_page_count)*8 as internal_obj_kb,
        SUM (version_store_reserved_page_count)*8  as version_store_kb,
        SUM (unallocated_extent_page_count)*8 as freespace_kb,
        SUM (mixed_extent_page_count)*8 as mixedextent_kb
    FROM sys.dm_db_file_space_usage
    

    したがって、ユーザー オブジェクトと内部オブジェクトがそれ以上の場合は、カーソルと SQL Server の内部使用 (例:中間テーブル、ハッシュ結合、ハッシュ集計など) のために、TempDb 領域が不足していることを明確に意味します。

    以下のコードを使用して、すべてのデータベースのすべてのテーブルの数を取得できます

      DECLARE @Stats TABLE (DBNAME VARCHAR(40), NAME varchar(200), Rows INT)
    INSERT INTO @Stats
    EXECUTE sp_MSForEachDB 
            'USE ?; SELECT DB_NAME()AS DBName, 
            sysobjects.Name
        , sysindexes.Rows
    FROM
        sysobjects
        INNER JOIN sysindexes
        ON sysobjects.id = sysindexes.id 
    WHERE
        type = ''U''
        AND sysindexes.IndId < 2'
    
        SELECT * FROM @Stats
    

    TempDb に関する記事を書きました。おすすめ ;これを読んで、TempDb に影響を与える可能性のあるオブジェクトと、その一般的な問題を解決する方法を理解することをお勧めします。理想的には、TempDb の合計サイズは観察に基づいて計算する必要があります。この場合、24 GB を超えます。

    ** 編集 1**

    統計の更新が不明な場合は、以下のクエリを使用してすべてのテーブルの数を取得してください注:統計が不要なデータベースを置き換えてください

        DECLARE @ServerStats TABLE (DatabaseName varchar(200), TableName varchar(200), RowsCount INT)
    INSERT INTO @ServerStats
    exec sp_msforeachdb @command1='
    use #;
    if ''#'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'',''ReportServer'')
    begin
    print ''#''
    exec sp_MSforeachtable @command1=''
    SELECT ''''#'''' AS DATABASENAME, ''''?'''' AS TABLENAME, COUNT(*)  FROM ? ;
    ''
    end 
    ', @replacechar = '#'
    
    SELECT * FROM @ServerStats
    

    同様に、以下のクエリを使用して、すべてのデータベースのすべてのテーブルで個別を取ることができます

        DECLARE @ServerStatsDistinct TABLE (DatabaseName varchar(200), TableName varchar(200), RowsCount INT)
    INSERT INTO @ServerStatsDistinct
    exec sp_msforeachdb @command1='
    use #;
    if ''#''  NOT IN (''master'', ''model'', ''msdb'', ''tempdb'',''ReportServer'')
    begin
    print ''#''
    exec sp_MSforeachtable @command1=''
    SELECT ''''#'''' AS DATABASENAME, ''''?'''' AS TABLENAME, COUNT(*)  FROM  (
        SELECT DISTINCT *
        FROM ?
    ) a  ;
    ''
    end 
    ', @replacechar = '#'
    
    SELECT * FROM @ServerStatsDistinct
    



    1. Laravelビジターカウンター

    2. PHP PDOを使用してMySQLデータベースからオブジェクトデータを解析するにはどうすればよいですか?

    3. 一部のフィールドに改行文字がある場合に CSV から一括挿入する方法は?

    4. Oracleでチェック制約を使用する方法