2012-11-30 67 views
0

我运行SQL Server 2005我有我的观点放在一起的两个表一个极端的新手。第一个表格只有2列进入视图。一列是ID号,另一列是名称。第二个表是所有数据的位置。该表中的列是ID,日期,小时,价格类型,市场类型和价格。我的目标是有过滤PriceType是一个固定值的视图,然后采取价格的差异,当MarketType是DAM从与MarketType价格RTM。现在看起来像下面....优化SQL视图/自查询连接

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') 

这种观点并不这么长时间自己拿。有时候,我希望把它的另一个步骤,并有2次在那里我会运行联接上述观点,并采取价格where view1.CommonName=abc and view2.CommonName=xyz的差异查询之间的区别。当我运行该查询时,它需要运行10次,因为它本身运行简单视图。我假设如果我以最佳方式做事,它不会花费10倍的时间。我能做些什么来改善这一点吗?

+0

您可以提供的任何额外信息将非常有用 - 表结构,数据量,示例数据,第二个查询,您拥有的任何索引。最有可能的正确索引将加快速度。 – Laurence

+1

是需求的嵌套视图吗? – Tahbaza

回答

1

总体来说,您的查询看起来不错,但运行的观点,显然是不适合你的工作好。也就是说,我想对查询进行轻微的重构。将WHERE条件移入JOIN组件。

确保你对节点表上的CommonName索引您将应用过滤器对。在price_nodes表,对(节点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的条件VS B的联接是基于他们的“NODE_ID”的其余部分。由于node_id已经从pNodes到达da.node_id,因此我还将连接从“da”连接到“rt”,因此使用da.Node_id到rt.node_id。这可能是引擎停滞不前的一件事。