-4

MSSQL 2008 R2 を使用しています。膨大な数の行を持つテーブルがあります(テストテーブル)

次の SQL コードがあります。パフォーマンスを向上させるために、インデックス ヒント、強制シーク、またはその他の手段を使用できる場所を提案してください。

インデックス
1. 非クラスター化 - idx_id(id)
2. 非クラスター化 - idx_name(name)

SELECT DISTINCT
    p.id,
    p.name,
FROM 
    test p 
    LEFT OUTER JOIN 
    (
        SELECT 
            e.id 
        FROM 
            test e  
            INNER JOIN
            ( 
                SELECT 
                    c.id 
                FROM 
                    test c 
                GROUP BY 
                    c.id 
                HAVING 
                    COUNT(1) > 1 
            ) f 
            ON e.id = f.id
        WHERE 
            e.name = 'test_name'
    ) m 
    ON p.id = m.id
WHERE 
    m.id is null
4

3 に答える 3

1

前提条件: 主キーがあること

select distinct
    p.id
    , p.name
from test p 
where not exists (
    SELECT TOP(1)
        1
    FROM test e
    WHERE e.PrimaryKey <> p.PrimaryKey
    AND  e.id = p.id
    AND 'test_name' IN (e.name, p.name)
)
于 2013-05-31T12:52:45.410 に答える
1

テーブルにはいくつの列が含まれていますか? この 2 つの列しかない場合、非クラスター化インデックスを追加しても意味がありません。ID 列に CLUSTERED インデックスを作成する必要があります。それだけです。パフォーマンスが向上します。

列が多数ある場合は、次の 2 つのオプションを検討してください。

  1. NAME 列にクラスター化インデックスを作成し、ID 列に非クラスター化インデックスを作成します。
  2. ID 列に非クラスター化インデックスを作成し、INCLUDE NAME 列を作成します (その方法でカバリング インデックスを作成します)。
于 2013-05-31T12:53:09.950 に答える