まず、問題はsubstring()
ではありません。パフォーマンスホッグはselect distinct
です。
お客様はロジックを簡素化します。ような何か:
SELECT DISTINCT ProcedureID
FROM Transactions
WHERE ProcedureID < 'A' or ProcedureID >= '{' -- 'z' + 1
か:
WHERE ProcedureId >= '0' AND ProcedureId < ':' -- '9' + 1
魔法characacters '{'
と':'
は単に "Z" と "9" に続く文字のASCII値です。必要に応じて、CHR(ASCII('9') + 1)
などの式に置き換えることができます。
ただし、パフォーマンスに与える影響はほとんどありません。 Transactions(ProcedureID)
のインデックスは、クエリ/サブクエリをカバーするので役立ちます。
大きなクエリのヘルプが本当に必要な場合は、に別のという質問をして、実際に最適化したいクエリ(または、もっと簡単なバージョン)を入力する必要があります。
EDIT:
あなたが実際にこのようなバージョンは、はるかに高速右のインデックス付きであることを見つけるかもしれない:
SELECT p.ProcedureId
FROM Procedures p
WHERE p.ProcedureId >= '0' AND p.ProcedureId < ':' AND -- '9' + 1
EXISTS (SELECT 1 FROM Transactions t WHERE t.ProcedureId = p.ProcedureId);
これはProcedureId
が主キーとなっているテーブルを持っていることを前提としています。
パフォーマンスのために、インデックスはTransactions(ProcedureId)
になります。
あなたがここに部分文字列を使用する必要があるようにそれは見ていないようではないREGEXPを使用しているようです。あなたは 'WHERE ProcedureID NOT LIKE '[A-z]%''を実行することができます。最初の文字が文字かどうかをチェックし、残りの文字は無視します。また、ProcedureIDがインデックスされていることを確認してください! – RToyo
肯定的なチェックを使用します。負の条件には時間がかかります。 – Amit
「LIKE」パターンの構文に基づいてSQL Serverタグを追加しました。 –