0

更新されず、めったに挿入されないテーブルがあります。日付列と nvachar(32) をすばやくクエリできるように、このテーブルを最適化する必要があります。

テーブルにインデックスを追加していますが、日付列を年、月、日の個別の列などの個別の列に分割するか、日付列をそのままにしておくのがパフォーマンスに最適かどうかはわかりません。

クエリは、基本的に nvarchar 列と year 列に対して行われるか、年、月、日が含まれる場合があります。

私が実際にやろうとしているのは、姓の列と日付の列に対して SOUNDEX 句を実行することです

例:

SELECT DISTINCT [Surname]
FROM [dbo].[sometable]
WHERE YEAR(Datecolumn) = 2011 AND SOUNDEX(Surname) = SOUNDEX('smith')

パフォーマンスには何が最適でしょうか?

4

2 に答える 2

2

それがフィルターを行う方法である場合、それらの列に関数を適用しているため、インデックスは役に立ちません。DateColumnあなたができることのために

DateColumn >= '20110101' AND DateColumn < 20120101

本当に必要な場合は、年と月を使用して計算列を作成し、それらの列にインデックスを作成することもできます。Surnameやることはあまりないと思う列については、SOUNDEX検索が遅くなり、使用している方法でインデックスを使用しません。SOUNDEXに適用された関数の結果を使用して永続化された計算列をSurname作成し、その列にインデックスを作成し、計算列を使用してフィルターを実行することを引き続き検討できます。これにより、クエリが高速化されます。

于 2013-03-01T12:24:42.780 に答える
0

datetime 列の場合、 where 句を次のように使用できます。

WHERE DateColumn BETWEEN '01/01/2011'  AND '01/01/2012'

ただし、where 句のインデックスの列に対して何らかの操作を行う場合は、役に立ちません。私が提供できるのは、姓の事前計算されたSOUNDEX値を別の列に保存することです

于 2013-03-01T12:25:57.553 に答える