この遅いネストされたSQLケースクエリを高速化する方法

SSS

名前、名前、DOBなどのフィールドを含む「連絡先」のテーブルがあります。

これのSQLビューを作成しようとしています。これには、「ProspectiveNews」というフィールドも含まれています。このフィールドには、別のビューの基準の一致に応じて、基本的に4つの分類コード(または空白)のいずれかが含まれます。

連絡先は、この他のビューに異なる年レベルの多数のレコードを持つことができます。

この他のビューでは、連絡先IDは[ContactID]または[ContactSpouseID]の2つの列のいずれかに表示される可能性があります。ここで、別の列、ReferenceTable <> 'Enquiry'

次に、ReferenceTable = 'Enquiry'のレコードがいくつかあり、ContactID列には代わりにEnquiryIDが含まれているため、それを使用する必要があります。

したがって、分類コードごとに3つのチェックが行われます。

実行には約2分かかりますが、これコードですそれが問題です-遅すぎます。これを速くするために何ができますか?

コードの概要:

連絡先に、YearLevel 0 THEN'K 'のみである別のビューからのレコードがある場合

連絡先に、YearLevel 1-6 THEN'1-6 'のみである別のビューからのレコードがある場合

連絡先が別のビューからのレコードを持っている場合、それは年レベル7-12 THEN '7-12'です。

連絡先にYearLevelsのレコードがある場合:

0および1-6

または

0および7-12

または

1-6および7-12

次に「一般」

コード:

SELECT

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

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

 ELSE 

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

  ELSE 

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

  ELSE 

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

 THEN 'General'

  ELSE ''  END END

	END 
END AS ProspectiveNews

SSS

@UV

ありがとう:パフォーマンスが遅いのは、[表]から何度も選択しているためです。代わりに、[テーブル]の候補リストを結合し、場合によっては集計し、結合されたフィールドを使用してユースケースを作成します。時間があれば、後で例を書きます。メインテーブルを参照するために参加する必要がある場合は、OUTER APPLYを使用することをお勧めします。ItzikBen-Ganからの良い投稿があります。または、こちらをご覧ください:sqlbits.com/Sessions/Event14/…– UV

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

groupbymultiindexのネストされたループを高速化する方法

分類Dev

groupbymultiindexのネストされたループを高速化する方法

分類Dev

ネストされたmongodbクエリを高速化

分類Dev

このパンダ操作を高速化する方法(ネストされたリストアイテムでグループ化)

分類Dev

遅い SQL クエリを高速化する方法

分類Dev

Pythonでネストされたforループを高速化する方法

分類Dev

Python DataFrameでネストされたループを高速化する方法は?

分類Dev

ネストされた行列マッチングとcolSumsのRでforループを高速化する方法

分類Dev

このSQLクエリを高速化する方法

分類Dev

適切なインデックスを使用して、この遅いクエリを高速化するにはどうすればよいですか?

分類Dev

Pythonでこのネストされたforループを高速化するにはどうすればよいですか?

分類Dev

Pythonのネストされたループを高速化

分類Dev

リンクされたドキュメントのインデックスに対するクエリを高速化する方法

分類Dev

このPyMongoクエリ/ループを高速化する方法

分類Dev

遅いクエリMYSQLを高速化する方法

分類Dev

このネストされたSQLSELECTクエリを最適化する方法

分類Dev

C ++でネストされたループを高速化する

分類Dev

関数をインポートせずにネストされた for ループを高速化する方法

分類Dev

APIリクエストを高速化する方法は?

分類Dev

不確実性のあるデータを集計するために、この非常に遅いシェルスクリプトを高速化するにはどうすればよいですか?

分類Dev

ネストされたループを高速化または置換する方法

分類Dev

レートを計算するSQLクエリの高速化

分類Dev

Pythonでネストされたforループを高速化する方法はありますか?

分類Dev

「友達リスト」のMySQLクエリを高速化するにはどうすればよいですか?

分類Dev

2つの単純なpostgresテーブル(macaddrデータ型を使用)でのネストされたループクエリの高速化

分類Dev

ベクトル化により、RでトリプルネストされたForループを高速化

分類Dev

このSQLインデックスクエリを高速化するにはどうすればよいですか?

分類Dev

Pythonスクリプトのforループを高速化する

分類Dev

Rでネストされたループを高速化

Related 関連記事

  1. 1

    groupbymultiindexのネストされたループを高速化する方法

  2. 2

    groupbymultiindexのネストされたループを高速化する方法

  3. 3

    ネストされたmongodbクエリを高速化

  4. 4

    このパンダ操作を高速化する方法(ネストされたリストアイテムでグループ化)

  5. 5

    遅い SQL クエリを高速化する方法

  6. 6

    Pythonでネストされたforループを高速化する方法

  7. 7

    Python DataFrameでネストされたループを高速化する方法は?

  8. 8

    ネストされた行列マッチングとcolSumsのRでforループを高速化する方法

  9. 9

    このSQLクエリを高速化する方法

  10. 10

    適切なインデックスを使用して、この遅いクエリを高速化するにはどうすればよいですか?

  11. 11

    Pythonでこのネストされたforループを高速化するにはどうすればよいですか?

  12. 12

    Pythonのネストされたループを高速化

  13. 13

    リンクされたドキュメントのインデックスに対するクエリを高速化する方法

  14. 14

    このPyMongoクエリ/ループを高速化する方法

  15. 15

    遅いクエリMYSQLを高速化する方法

  16. 16

    このネストされたSQLSELECTクエリを最適化する方法

  17. 17

    C ++でネストされたループを高速化する

  18. 18

    関数をインポートせずにネストされた for ループを高速化する方法

  19. 19

    APIリクエストを高速化する方法は?

  20. 20

    不確実性のあるデータを集計するために、この非常に遅いシェルスクリプトを高速化するにはどうすればよいですか?

  21. 21

    ネストされたループを高速化または置換する方法

  22. 22

    レートを計算するSQLクエリの高速化

  23. 23

    Pythonでネストされたforループを高速化する方法はありますか?

  24. 24

    「友達リスト」のMySQLクエリを高速化するにはどうすればよいですか?

  25. 25

    2つの単純なpostgresテーブル(macaddrデータ型を使用)でのネストされたループクエリの高速化

  26. 26

    ベクトル化により、RでトリプルネストされたForループを高速化

  27. 27

    このSQLインデックスクエリを高速化するにはどうすればよいですか?

  28. 28

    Pythonスクリプトのforループを高速化する

  29. 29

    Rでネストされたループを高速化

ホットタグ

アーカイブ