1

レポートで使用されるクエリを最適化したいと考えています。残念ながら、レポートを変更することはできないため、特定の形式のデータセットを提供する必要があります。

したがって、次のようなテーブルがあるとしましょう (実際には、25 列と 20k 行があります)。

Name    Description           Price     MiscColumn1    MiscColumn2    
Tea      test description      10       misc1            misc2   
Coffee    test desc            20       misc3            misc4
Water      test                20       misc1            misc2

したがって、このデータセットを次のように変換する必要があります。

Type  Name    Description           Price     MiscColumn1    MiscColumn2 
  1    Tea     test description      NULL       NULL           NULL  
  1    Coffee   test desc            NULL       NULL           NULL 
  1    Water     test                NULL       NULL           NULL
  2    NULL      NULL                 10        NULL           NULL
  2    NULL      NULL                 20        NULL           NULL  
  3    NULL      NULL                NULL       misc1          misc2
  3    NULL      NULL                NULL       misc3          misc4  

したがって、基本的に必要なことは、3 つの異なるレコードのグループを選択してデータセットに戻すことです。

私が現在行っていることは次のとおりです。

Create #tempTable  

そして、次のように 3 つの個別の選択を行います。

insert into #tempTable (Name, Description)  
select distinct Name, DEscription from myTable  
 insert into #tempTable (Price)  
select distinct Price from myTable   

しかし、それは非常に遅く、データの処理を完了するのに最大 5 秒かかることがあります。

また、UNION を使用しようとしましたが、パフォーマンスの向上は得られませんでした。

4

1 に答える 1

4

次のように、単一のスキャンを含む単一のステートメントでこれを行うことができます。

SELECT DISTINCT
   X.*
FROM
   dbo.MyTable T
   CROSS APPLY (VALUES
      (1, T.Name, T.Description, NULL, NULL, NULL),
      (2, NULL, NULL, T.Price, NULL, NULL),
      (3, NULL, NULL, NULL, T.MiscColumn1, T.MiscColumn2)
   ) X (Type, Name, Description, Price, MiscColumn1, MiscColumn2)
;

SQL Fiddle でライブ デモを見る

一時テーブルは必要ないことに注意してください。15 回の結合をCROSS APPLY行ってから、各列の元のテーブルを参照するだけです。

それはポイントをもたらします。あなたのデータは 15 個のテーブルから来ています! 値のグループ化のいずれかがTypeテーブルの個別のサブセットに由来する場合、これはおそらく最良の方法ではありません! たとえば、とが、別のグループで表される列を持たない 2 つのテーブルから来ているMiscColumn1としましょう。その場合、これらの 2 つのテーブルをメイン クエリから削除し、これらのテーブルから2 つの列だけを個別MiscColumn2に削除する方がはるかに優れています。UNION ALL SELECT

私がこれを言っているのは、レポート プラットフォームがさまざまな関連データを独自に結合しようとしているという誤った印象に基づいている可能性があります。もしそうなら、すべてのデータの統一されたビューをまとめて、それを再び分解しようとするべきではありません. 上記のクエリでの の必要性は、DISTINCT必要なトリミングされた結果セットを具体化するために必要な追加のメモリ、I/O、および CPU を強調しています。それを回避する方法がある場合は、それを実行する必要があると思います。

于 2013-06-26T23:18:20.907 に答える