時間の経過とともにデータベースが増大する原因となっているテーブルを特定するにはどうすればよいですか?


8

SQL Server 2008には常に成長しているデータベースがあります。過去6か月間で最も成長を遂げたテーブルを知りたいのですが。


T-SQLとPowerShell-PowerShellを使用したテーブルの増加の監視の組み合わせを使用して、時間の経過に伴う監視と傾向分析を行うことができます。
Kin Shah

どのくらい前にバックアップがありますか?古いものを復元してテーブルを確認し、情報を記録して、それぞれを復元した後、その方法で比較できます。
Ali Razeghi、2015年

テーブルにはどのような情報がありますか?last_updated_atタイムスタンプのようなauditing-type-in​​foがたまたま含まれている場合は、知識に基づいた推測を行うことができます。
時計じかけのミューズ

スターターについては、この以前の回答を確認できます。しかし、おそらくアーロンのリストは、解決策を選び、それに基づいて構築する方法です。また、成長しているものを確認します。データファイルですか、それともログファイルですか。
マリアン

回答:


15

SQL Serverはこの情報を追跡しません。今後、テーブルスペースのスナップショットを長期にわたって保持する、何らかの監視(ツールであろうと自社開発であろうと)が必要になります。これは単純でも複雑でもかまいません。

  • レポートを表示すると、 @ Zaneが回答を強調表示、ファイルを頻繁に保存します。
  • 次のようなビューの独自の定期的なスナップショットを撮りますsys.dm_db_partition_stats
  • @Aliによって提案された、古いバックアップの復元されたコピーを見る-ただし、バックアップがどこまで進んでいるのか誰が知っているか、およびディスク領域が問題である場合は、並べて比較するためにそれらの多くを復元する余裕がないかもしれませんとにかく。
  • PowerShellなどの外部ツールを使用して自動化する(記事@Kinが指摘しているように)
  • スペース、断片化などを長期にわたって追跡する本格的な監視ツール使用します(免責事項:私はSQL Sentryで働いています)。

これらの方法の1つ以上をすでに実装しているか、誰かがタイムマシンを発明していない限り、テーブルが6か月前、2週間前、または20分前にどれほど大きいかを理解するための良い方法はありません。


13

これらのメトリックを何らかの方法でキャプチャして保存していない場合、履歴を表示する方法はありません。ただし、それが役立つ場合は、どのテーブルが最もディスクを使用しているかを簡単に確認できます。

右クリック


2

私はこれを顧客データベースで毎日実行して、個々のテーブルの成長を経時的に追跡します。

DECLARE @names TABLE (
 tableName VARCHAR(128)
 )

INSERT INTO @names
SELECT [name] FROM customerdb.dbo.sysobjects WHERE xtype='U'

WHILE (SELECT COUNT(tableName) FROM @names) > 0
BEGIN

    DECLARE @thisTable VARCHAR(128)
    SET @thisTable = (SELECT TOP 1 tableName FROM @names)
    INSERT INTO mydb.dbo.mytable ([name], [rows], [reserved], [data], [index_size], [unused])
    EXEC sp_spaceused @objname=@thisTable

    DELETE FROM @names
    WHERE tableName = @thisTable

END

1

毎週実行するジョブのSQLスクリプトスケジュールがあります。sp_spaceused、sys.schemas、sys.tablesからすべての情報を取得するスクリプトを作成してみてください。そして、それを作成日とともにテーブルに入れます。(そして将来の監視を開始できます)

しかし、前の月のテーブルの増加を知りたい場合や、スクリプトやジョブを設定しなかった場合は、テスト環境でバックアップを復元し、最も高いテーブルを調べて、どれだけ増加したかを比較する必要があるでしょう。時間をかけて。


5
スクリプトを共有してみませんか?
エリックダーリン

-2

追加のツールなしでMySQLでそれを行う方法:

「SHOW TABLE STATUS」のようなクエリを実行し、追加のタイムスタンプフィールドを含むテーブルに結果を保存します。

このデータを使用すると、各テーブルの履歴があり、データの長さ、行、または最大の差分についてテーブルを選択できます。時間とともに。

ステータスデータはバイト数が少ないため、毎日のcronジョブで実行できます。オンボードコマンドを使用して、完璧、簡単、無料で実行できます。

マリアンが以前に投稿したリンクと同じ手順。MS T-SQLコマンドは、「SELECT * FROM INFORMATION_SCHEMA.TABLES」のようにする必要があります-単にgoogle。私は数秒で2つの可能な解決策を見つけました:

データベース内のすべてのテーブルとその行数およびサイズのリスト:http : //www.sqlmatters.com/Articles/Listing%20all%20tables%20in%20a%20database%20and%20their%20row%20counts%20and%20sizes.aspx

SQL SERVER –各テーブルの行、列、ByteSizeの数を検索するクエリ:http ://blog.sqlauthority.com/2007/01/10/sql-server-query-to-find-number-rows-columns-bytesize- for-each-table-in-the-current-database-find-biggest-table-in-database /

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.