0

我是一个运行 SQL SERVER 2005 的极端新手。我有两个表,我将它们放在一个视图中。第一个表只有 2 列进入视图。一列是 ID 号,另一列是名称。第二个表是所有数据所在的位置。该表中的列是 ID、日期、小时、价格类型、市场类型和价格。我的目标是有一个将 PriceType 过滤为固定值的视图,然后在 MarketType 为 DAM 时获取价格与 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 的差异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。这可能是引擎卡住的一件事。

于 2012-11-30T23:56:33.343 回答