2016-12-12 10 views
1

5つのテーブルがあり、結果を得るためにビューを作成しようとしています。既存のクエリの最適化

以下は、正常に動作しているビューです。

私は提案が必要です。この方法でこのクエリを書くのがよい方法ですか、それともより良い方法で最適化することができますか?

SELECT p.Pid, hc.hcid, hc.Accomodation, ghc.ghcid, ghc.ProductFeatures, wp.existing, wp.acute, mc.cardiaccover, mc.cardiaclimitationperiod 
FROM TableA p 
     LEFT JOIN TableB hc 
      ON p.pid = hc.pid 
     LEFT JOIN TableC ghc 
      ON p.pid = ghc.pid 
     LEFT JOIN (SELECT * 
       FROM (SELECT hcid, 
           title, 
           wperiodvalue + '-' + CASE WHEN 
           wperiodvalue > 1 THEN 
           unit + 
             's' ELSE 
           unit END wperiod 
         FROM TableD) d 
         PIVOT (Max(wperiod) 
           FOR title IN (acute, 
              existing 
              )) piv1) wp 
      ON hc.hcid = wp.hcid 
     LEFT JOIN (SELECT * 
       FROM (SELECT hcid, 
           title + col new_col, 
           value 
         FROM TableE 
           CROSS apply (VALUES (cover, 
              'Cover'), 
                (Cast(limitationperiod AS 
                  VARCHAR 
                  (10)), 
              'LimitationPeriod')) x (value, col 
              )) d 
         PIVOT (Max(value) 
           FOR new_col IN (cardiaccover, 
               cardiaclimitationperiod, 
               cataracteyelenscover, 
               cataracteyelenslimitationperiod 
              )) piv2) mc 
      ON hc.hcid = mc.hcid 

いずれかの提案があります。

おかげ

+0

使用しているDBMSにタグを付けます。 (異なるdbms製品は、異なる方法で最適化されます。) – jarlh

答えて

0

私の提案は1新しいテーブル内のデータをダンプし、そのテーブルの助けを借りて、あなたがビューを作成することができ、その後、一時テーブルを使用してクエリを打破するストアドプロシージャを作成することです:両方

ストア

SELECT p.Pid, 
    hc.hcid, 
    hc.Accomodation, 
    ghc.ghcid, 
    ghc.ProductFeatures, 
    wp.existing, 
    wp.acute, 
    mc.cardiaccover, 
    mc.cardiaclimitationperiod 
FROM TableA p 
LEFT JOIN TableB hc ON p.pid = hc.pid 
LEFT JOIN TableC ghc ON p.pid = ghc.pid 
LEFT JOIN #pvtInfo wp ON hc.hcid = wp.hcid 
LEFT JOIN #pvtInfoTwo mc ON hc.hcid = mc.hcid 

SELECT * INTO #pvtInfo FROM ( --first PIVOT query 
SELECT * INTO #pvtInfoTwo FROM ( --second PIVOT query 

として牽引別々の一時テーブルでPIVOT結果次に、あなたの最終的なクエリは、のようになります。

まず、SPとVIEWを試してみてください。

希望、それは役に立ちます。