0

私は SQL SERVER 2005 を実行する超初心者です。2 つのテーブルをビューにまとめています。最初のテーブルには、ビューに入る列が 2 つだけあります。1 つの列は ID 番号で、もう 1 つの列は名前です。2 番目のテーブルは、すべてのデータがある場所です。そのテーブルの列は、ID、Date、Hour、PriceType、MarketType、および Price です。私の目標は、PriceType をフィルター処理して固定値にし、MarketType が DAM の場合の Price と MarketType が RTM の場合の価格の差を取るビューを作成することです。今のところ、次のように見えます....

SELECT dbo.nodes.commonname,
       dbo.nodes.node_id,
       da.pricedate,
       da.hour,
       rt.price            AS rtm,
       da.price            AS dam,
       da.price - rt.price AS dart
FROM   dbo.pnodes
       INNER JOIN dbo.pnode_prices AS da
               ON dbo.pnodes.node_id = da.pnode_id
       INNER JOIN dbo.pnode_prices AS rt
               ON dbo.pnodes.node_id = rt.pnode_id
                  AND da.pricetype = rt.pricetype
                  AND da.pricedate = rt.pricedate
                  AND da.hour = rt.hour
WHERE  ( da.pricetype = 'LMP' )
       AND ( da.markettype = 'DAM' )
       AND ( rt.markettype = 'RTM' ) 

このビュー自体は、それほど時間はかかりません。場合によっては、別の一歩を踏み出し、上記のビューを結合して Price の差を取るクエリを実行する 2 つのビューの違いを知りたい場合がありますwhere view1.CommonName=abc and view2.CommonName=xyz。そのクエリを実行すると、単純なビューを単独で実行する場合の 10 倍の時間がかかります。最適にやれば10倍の時間はかからないと思います。これを改善するために簡単にできることはありますか?

4

1 に答える 1

1

全体的に、クエリは問題ないように見えましたが、ビューとして実行すると、明らかにうまく機能していません。とは言うものの、クエリのわずかな再構築を提供したいと思います。WHERE条件をJOINコンポーネントに移動します。

フィルタを適用するノードテーブルのCommonNameにインデックスがあることを確認してください。price_nodesテーブルで、(node_id、markettype、pricetype)に複合インデックスを設定します。

SELECT 
      N.commonname,
      N.node_id,
      da.pricedate,
      da.hour,
      rt.price            AS rtm,
      da.price            AS dam,
      da.price - rt.price AS dart
   FROM
      dbo.pnodes N

         INNER JOIN dbo.pnode_prices AS da
               ON N.node_id = da.pnode_id
              AND da.markettype = 'DAM'
              AND da.pricetype = 'LMP'

            INNER JOIN dbo.pnode_prices AS rt
               ON da.node_id = rt.pnode_id
              AND rt.markettype = 'RTM'
              AND da.pricetype = rt.pricetype
              AND da.pricedate = rt.pricedate
              AND da.hour = rt.hour

このように、where句はA社とB社の条件のみに依存できます。残りの結合は「node_id」に基づいています。また、node_idはすでにpNodesからda.node_idにあるため、「da」からリンクされた「rt」に結合しました。したがって、da.Node_idをrt.node_idに使用します。それはエンジンが動かなくなっていることの1つかもしれません。

于 2012-11-30T23:56:33.343 に答える