2017-08-11 8 views
0

現在のサブクエリが実行されています:実行には26秒です。私は、次のクエリをサブクエリとして別のコードの一部として使用しています。これは、データが返される1か月間に2分と25秒かかっています。SQLサブリングのサブクエリーが長すぎます

これより高速なクエリがありますか?現在のプロシージャIDにはアルファベットと数字が含まれています。私は、ProcedureIDの先頭を数字で始めるだけです。

SELECT DISTINCT 
ProcedureID 
FROM Transactions 
WHERE Substring(ProcedureID,1,1) NOT LIKE '[A-z]%' 
+2

あなたがここに部分文字列を使用する必要があるようにそれは見ていないようではないREGEXPを使用しているようです。あなたは 'WHERE ProcedureID NOT LIKE '[A-z]%''を実行することができます。最初の文字が文字かどうかをチェックし、残りの文字は無視します。また、ProcedureIDがインデックスされていることを確認してください! – RToyo

+0

肯定的なチェックを使用します。負の条件には時間がかかります。 – Amit

+0

「LIKE」パターンの構文に基づいてSQL Serverタグを追加しました。 –

答えて

2

実行計画を有効にしてクエリを実行します。それは、役に立つかもしれないインデックスを特定するはずです。さらに、1文字長の新しい列を追加してProcedureIDの最初の文字を挿入し、その列にインデックスを追加すると、substring()クエリではなくその列に基づいてクエリを実行するとパフォーマンスが向上するはずですあなたは使っています。

0

これを試してみてください: WHERE IsNumeric関数(サブストリング(ProcedureID、1、1))=

あなたが十分な頻度でこれを行う場合は1が、それはProcedureIDのちょうど最初の文字が含まれている計算列を作成する価値があるかもしれません。

2

まず、問題は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)になります。

+0

これは簡単ですか? 'A 'と' z 'の間にはないWHERE ProcedureID – RToyo

+0

@RobbieToyota 。 。いいえ、「za」はその条件を満たすでしょう。 –

0

あなたは

SELECT DISTINCT 
    ProcedureID 
    FROM Transactions 
    WHERE Substring(ProcedureID,1,1) NOT REGEXP '^[A-z]' 
関連する問題