WHERE
句に表示される列にインデックスを作成する必要があります。この規則にはいくつかの例外があります。
- 列に一意の値が 1 つまたは 2 つしかない場合 (これの標準的な例は「性別」です。可能な値は「男性」と「女性」のみであり、ここではインデックスの意味がありません)。一般に、処理する必要がある行をかなりの数だけ制限できるインデックスが必要です (たとえば、検索スペースを 50% 削減するだけのインデックスは価値がありませんが、99% 削減するインデックスは価値がありません)。 %は) です。
- 検索している場合
x LIKE '%something'
、インデックスの意味はありません。インデックスが行の特定の順序x
を指定していると考える場合、「%something」を検索する場合の並べ替えは役に立ちません。とにかくすべての行をスキャンする必要があります。
では、「キーワード「会計」」で検索している場合を見てみましょう。結果ページによると、これが生成する SQL は次のとおりです。
SELECT
*
FROM (
SELECT TOP 10
ROW_NUMBER() OVER (ORDER BY sq.name) AS Row,
sq.*
FROM (
SELECT
c.*,
p.providername,
p.school,
p.website,
p.type
FROM
cpd_COURSES c, cpd_PROVIDERS p
WHERE
c.providerid = p.providerid AND
c.activatedYN = 'Y' AND
(
c.name like '%accounting%' OR
c.title like '%accounting%' OR
c.keywords like '%accounting%'
)
) sq
) AS temp
WHERE
Row >= 1 AND Row <= 10
この場合、それcpd_COURSES.providerid
は外部キーであると仮定します。この場合cpd_PROVIDERS.providerid
、インデックスは必要ありません。既にインデックスがあるためです。
さらに、このactivatedYN
列は T/F 列であり、(可能な値を 50% だけに制限するという上記のルールに従って) T/F 列にもインデックスを付けるべきではありません。
最後に、x LIKE '%accounting%'
クエリで検索するため、名前、タイトル、またはキーワードのインデックスも必要ありません。使用されることはないためです。
したがって、この場合に行う必要がある主なことは、 がcpd_COURSES.providerid
実際にの外部キーであることを確認することですcpd_PROVIDERS.providerid
。
SQL Server 固有
SQL Server を使用しているため、Management Studio には、インデックスを配置する必要がある場所を決定するのに役立つツールが多数用意されています。「インデックス チューニング ウィザード」を使用すると、実際には、パフォーマンスを向上させる方法を教えてくれるのが非常に優れています。クエリをカットアンドペーストするだけで、追加するインデックスの推奨事項が返されます。
追加するインデックスには少し注意する必要があります。インデックスが多いほど、INSERT
s とUPDATE
s が遅くなるためです。そのため、インデックスを統合する必要がある場合や、パフォーマンスが十分に向上しない場合は完全に無視する必要がある場合があります。ある程度の判断は必要です。