2009-07-11 30 views
4

SQL Server 2005データベースチューニングアドバイザを実行すると、インデックスを作成するよう推奨されますが、既にインデックスが設定されている列をインデックスすることを推奨します。同じインデックスをもう一度作成することを推奨するのはなぜですか?あなたのクエリを実行し、すでにある指標を提案する必要があるかもしれませんデータベースチューニングアドバイザで既存のインデックスを作成することをお勧めします

SELECT t.name AS 'affected_table' 
    , 'Create NonClustered Index IX_' + t.name + '_' 
    + CAST(ddmid.index_handle AS VARCHAR(10)) 
    + ' On ' + ddmid.STATEMENT 
    + ' (' + IsNull(ddmid.equality_columns,'') 
    + CASE 
    WHEN ddmid.equality_columns IS NOT NULL 
      AND ddmid.inequality_columns IS NOT NULL 
    THEN ',' 
    ELSE '' 
    END 
    + ISNULL(ddmid.inequality_columns, '') 
    + ')' 
    + ISNULL(' Include (' + ddmid.included_columns + ');', ';') 
    AS sql_statement 
    , ddmigs.user_seeks 
    , ddmigs.user_scans 
    , CAST((ddmigs.user_seeks + ddmigs.user_scans) 
    * ddmigs.avg_user_impact AS INT) AS 'est_impact' 
    , ddmigs.last_user_seek 
FROM 
    sys.dm_db_missing_index_groups AS ddmig 
    INNER JOIN sys.dm_db_missing_index_group_stats AS ddmigs 
    ON ddmigs.group_handle = ddmig.index_group_handle 
    INNER JOIN sys.dm_db_missing_index_details AS ddmid 
    ON ddmig.index_handle = ddmid.index_handle 
    INNER Join sys.tables AS t 
    ON ddmid.OBJECT_ID = t.OBJECT_ID 
WHERE 
    ddmid.database_id = DB_ID() 
    AND CAST((ddmigs.user_seeks + ddmigs.user_scans) 
    * ddmigs.avg_user_impact AS INT) > 100 
ORDER BY 
    CAST((ddmigs.user_seeks + ddmigs.user_scans) 
    * ddmigs.avg_user_impact AS INT) DESC; 
+0

あなたは、現在のインデックス構造(すなわち、インデックスビルドステートメントのスクリプト)とDTAの勧告の両方の詳細をお知らせください。私はあなたが彼らが違うと気づくでしょう。 –

+0

[SQL Server 2005の動的管理ビューで、見つからないインデックスが見つからないと報告するのはなぜですか?](http://stackoverflow.com/questions/305524/why-does-sql-server-2005-dynamic-management- view-report-a-missing-index-when-it) –

答えて

7

「DESC」を別の方法で注文しようとしていますか?

これは、他の同様のSOの質問で働いていた... Why does SQL Server 2005 Dynamic Management View report a missing index when it is not?

+1

なぜこれがマークダウンされていますか? SQL Serverでは、同じ列でもソート順が異なるインデックスは「異なる」インデックスとみなされます。これは可能な解決策です。元のポスターは、現在のインデックス定義とDTAによって提案されたインデックスの両方を提供する必要があります。 –

+1

@ジョン:私は最後の5つの答えのための連続した5つの投票を持っています...私は誰かを怒らせるようです:-) – gbn

+0

+1 @gbn: –

0

は、ここに私のSQLです。

SELECT * FROM table WITH INDEX(IX_INDEX_SHOULD_BE_USED) WHERE x = y 

あり、インデックスはSQL Serverからとして有用であると考えていない可能性があります。インデックスの必要性を示すクエリを実行し、SQL Serverで実行パスを確認し、必要な他のインデックスを作成します。

+0

私はポスターが自分のクエリでインデックスを使用していないと言っているとは思わない。彼はSQL Serverが特定のテーブルに対してインデックスを生成することを示唆していると言っています。問題は、すでにそのテーブルにインデックスがあることです(彼が信じているフィールド)。 –

+1

インデックスSQLサーバーを特に指定していない場合は、そのアイテムに最も適したインデックスを使用してみます。それはそこにあるかもしれないが、SQLサーバはそれを無視しているので、SQLサーバはそれが同じインデックスを必要と考えると考える。 – AutomatedTester

+1

SELECT * FROMテーブルWITH(INDEX(IX_INDEX_SHOULD_BE_USED))WHERE x = y –

0

完全なインデックスがないという警告メッセージを表示してください。一般的に、テーブルのインデックスを作成するように求めていますが、テーブルのインデックスではなく特定のフィールドを返すようにしています。インデックスはデフォルトですべてのフィールドを返します。

0

は先に行くとスクリプト外の両方のあなたの現在のインデックスstrucutreの詳細をして、DTAによって作られたのreccomendationsにこれを比較します。

結果に構造的な違いがあると思われます。

関連する問題