2016-11-02 2 views
0

をこの遅いネストされたSQLケースクエリを作成するにはどうすればDOBなど私も含まれ、こののSQLビューを作成しようとしていますが速く

を名前、姓、などの分野を含んでいる[連絡先]のテーブルを持っていますフィールドは「ProspectiveNews」と呼ばれます。このフィールドには、基本的に4つの分類コード(または空白)のうちの1つが含まれます。

連絡先には、別のYearLevelsを持つこの別のビューに多数のレコードを含めることができます。 [ContactID]または[ContactSpouseID]別の列、ReferenceTable <>「お問い合わせ」

は、その後いくつかのレコードReferenceTable =「お問い合わせがあります。ここで

この他のビューでは、連絡先IDは、2つの列のいずれかで表示される可能性'ここで、ContactID列にEnquiryIDが含まれているため、それを使用する必要があります。

したがって、3は各分類コードをチェックします。

は実行に約2分かかりますが、コードはここにあります。それは問題です。遅すぎます。これを早くするにはどうすればよいですか?

コードの要約:

問い合わせは(ある)である別のビューからレコードを持っている場合のみYearLevel 0 THEN 'K'

連絡先は、別のレコードを持っている場合連絡先レコード(複数可)(ある)である別のビューを形成している場合は(ある)のみYearLevel 1-6 THEN '1-6'

で見るYearLevel 7-12 THEN '7-12'

IF連絡先にYearLevelsにあるレコードがあります:

0 AND 1-6

OR

0 AND 7-12

OR

1-6と7-12

THEN '一般'

コード:

エンジンは驚異を行う必要があり、これらのサブクエリを最適化することができるようにインデックスを作成

SELECT 
 

 
C.ID as ContactID, 
 
ESC.ID as EnquiryID, 
 

 
CASE WHEN \t (\t C.ID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry') 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID) 
 
\t \t \t) 
 
\t \t \t OR 
 
\t \t \t (\t C.ID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry') 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID) 
 
\t \t \t) 
 
\t \t \t OR 
 
\t \t \t (\t ESC.ContactEnquiryID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable = 'Enquiry') 
 
\t \t \t AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID) 
 
\t \t \t) 
 
THEN 'K' 
 

 
ELSE 
 

 
CASE WHEN \t (\t C.ID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable <> 'Enquiry') 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID) 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID) 
 
\t \t \t) 
 
\t \t \t OR 
 
\t \t \t (\t C.ID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable <> 'Enquiry') 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID) 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID) 
 
\t \t \t) 
 
\t \t \t OR 
 
\t \t \t (\t ESC.ContactEnquiryID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable = 'Enquiry') 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID) 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID) 
 
\t \t \t) 
 
\t \t \t 
 
THEN '1-6' 
 

 
    ELSE 
 

 
CASE WHEN \t (\t C.ID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable <> 'Enquiry') 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID) 
 
\t \t \t) 
 
\t \t \t OR 
 
\t \t \t (\t C.ID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable <> 'Enquiry') 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID) 
 
\t \t \t) 
 
\t \t \t OR 
 
\t \t \t (\t ESC.ContactEnquiryID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable = 'Enquiry') 
 
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID) 
 
\t \t \t) 
 
THEN '7-6' 
 

 
    ELSE 
 

 
CASE WHEN \t (\t C.ID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable <> 'Enquiry') 
 
\t \t \t) 
 
\t \t \t OR 
 
\t \t \t (\t C.ID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable <> 'Enquiry') 
 
\t \t \t) 
 
\t \t \t OR 
 
\t \t \t (\t ESC.ContactEnquiryID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable = 'Enquiry') 
 
\t \t \t) 
 

 
THEN 'General' 
 

 
    ELSE '' END END 
 

 
\t END 
 
END AS ProspectiveNews

+0

パフォーマンスが低下するのは、[Table]から何回も選択しているためです。代わりに、[表]の候補リストに参加して、おそらく集約し、結合されたフィールドを使用してケースを使用します。もし時間があれば、後で例を書くでしょう。あなたがOUTER APPLYを使用したいかもしれないメインテーブルを参照するために参加する必要がある場合は、Itzik Ben-Ganからの良い投稿があるか、ここを見てください:https://sqlbits.com/Sessions/Event14/Boost_your_T-SQL_with_the_APPLY_Operator –

+0

ありがとう情報のために。後で時間があるなら、私はその例を見るのが大好きです。私はこれだけ新しいです。 – SSS

+0

スキーマ情報を追加してください。 C、ESCと[Table]の関係はどうですか? –

答えて

0

@UV

ありがとう:パフォーマンスの低下が原因あなたは[表]あまりにも多くの時間から選択されているという事実にあります。代わりに、[表]の候補リストに参加して、おそらく集約し、結合されたフィールドを使用してケースを使用します。もし時間があれば、後で例を書くでしょう。メインテーブルを参照するために参加する必要がある場合は、OUTER APPLYを使用したい場合があります。Itzik Ben-Ganからの投稿やここをクリックしてください:sqlbits.com/Sessions/Event14/... - UV

0

。あなたはこれらの複数のインデックスを作成してみなければならない:

+0

ありがとうございました。私は今まで「指数」について聞いたことがありません。私はそれらをこのコードに追加するのですか、それとも別の場所に作る必要があるのでしょうか? – SSS

+0

はい、別のものです。 SQL Server Management Studioに移動し、テーブルのデザインページに入力します。右ボタンメニューには、インデックス/キーオプションがあります。次に、これらのインデックスを追加するだけで済みます(各インデックスは、クエリを完全に最適化できるように、Columnsプロパティに複数のフィールドが必要です)。 –

+0

インデックスが役立つかもしれませんが、解決策ではありません。索引が多すぎると全体的にパフォーマンスが低下する可能性があります。すべてのパフォーマンスの問題は、まずサーバー構成を変更する前に照会の最適化を試みる必要があります。 –

0

パフォーマンスが遅い[Table]から何回も選択していることが原因です。代わりに、[表]の候補リストに参加して、おそらく集約し、結合されたフィールドを使用してケースを使用します。もし時間があれば、後で例を書くでしょう。メインテーブルを参照するために参加する必要がある場合は、OUTER APPLYを使用したい場合があります。Itzik Ben-Ganからの投稿やここをクリックしてください:sqlbits.com/Sessions/Event14/... - UV

Tahnk you @ SSS

関連する問題