DBのデータ密度に役立つスクリプトを見つけようとしています。ポイントは私はすでにクエリを把握していますが、私は何が必要ですが、問題はクエリが永遠にかかることです。それは小さなDBのために働くが、それはあまり起こらない。 私は最適化や、私を助けるためのアイデアを探しています。 スクリプト:SQLクエリの最適化
DECLARE Cur CURSOR
FOR
SELECT DB_Name() AS DatabaseName
,s.[name] AS SchemaName
,t.[name] AS TableName
,c.[name] AS ColumnName
,'[' + DB_Name() + ']' + '.[' + s.NAME + '].' + '[' + T.NAME + ']' AS FullQualifiedTableName
,d.[name] AS DataType
FROM sys.schemas s
INNER JOIN sys.tables t ON s.schema_id = t.schema_id
INNER JOIN sys.columns c ON t.object_id = c.object_id
INNER JOIN sys.types d ON c.user_type_id = d.user_type_id
WHERE d.NAME LIKE '%int%'
OR d.NAME LIKE '%float%'
OR d.NAME LIKE '%decimal%'
OR d.NAME LIKE '%numeric%'
OR d.NAME LIKE '%real%'
OR d.NAME LIKE '%money%'
OR d.NAME LIKE '%date%'
OR d.NAME LIKE '%datetime%'
AND is_identity = 0
OPEN Cur
FETCH NEXT
FROM Cur
INTO @DatabaseName
,@SchemaName
,@TableName
,@ColumnName
,@FullyQualifiedTableName
,@DataType
WHILE @@FETCH_STATUS = 0 -- The FETCH statement was successful.
BEGIN
DECLARE @SQL VARCHAR(MAX) = NULL
SET @SQL = ' Select ''' + @DatabaseName + ''' AS DatabaseName, ''' +
@SchemaName + ''' AS TableName,
''' + @TableName + ''' AS SchemaName,
''' + @ColumnName + ''' AS ColumnName,
''' + @DataType + ''' AS ColumnName,
(Select MAX(' + @ColumnName + ') from ' + @FullyQualifiedTableName + ' with (nolock))
AS MaxValue,
(Select MIN(' + @ColumnName + ') from ' + @FullyQualifiedTableName + ' with (nolock))
AS MinValue,
(Select COUNT(*) from ' + @FullyQualifiedTableName + ' with (nolock))
AS CountValue,
(Select COUNT(*) from ' + @FullyQualifiedTableName + ' Where ' + @ColumnName + ' IS NOT NULL)
AS NotNULLCount,
(Select 0 from ' + @FullyQualifiedTableName + ')
AS DataDensity'
PRINT @SQL
次のスクリプトは、すべてのための私のMAX、MIN、COUNT、NotNULLCountとデータ密度を与えるだろうし、各列は上記の宣言された型を形成します。しかし、あなたは70のテーブルと各テーブルのDBが30-50の列を持っていると想像することができます.... このスクリプトを実行すると永遠にかかるでしょう。
質問は、スキーマをスクリプト大型しようとしているDDL、テストデータdata..ifテストと一緒に関与してテーブルのDMLを含める必要がありますし、:
あなたは自動的に使用して、これらの
DBCC
コマンドを生成することができますテーブルの統計情報( '右クリックデータベース - >スクリプト生成 - >特定のデータベースオブジェクトを選択 - >次の画面で詳細を選択し、統計情報を選択)'を選択し、問題に貼り付けます。サーバのバージョンを貼り付けることも実際には良い解決策です – TheGameiswar