2012-11-30 117 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。這可能是引擎停滯不前的一件事。