2013-05-31 53 views
-4

我使用MSSQL 2008 R2表掃描和索引掃描。我有行數量巨大(測試表)如何避免鉅額表

我有以下SQL代碼,請建議我在哪裏可以使用索引提示,力尋求或任何其他手段來提高性能的表格。

指標
1.非羣集 - idx_id(ID)
2.非羣集 - idx_name(名稱)

SELECT DISTINCT 
    p.id, 
    p.name, 
FROM 
    test p 
    LEFT OUTER JOIN 
    (
     SELECT 
      e.id 
     FROM 
      test e 
      INNER JOIN 
      ( 
       SELECT 
        c.id 
       FROM 
        test c 
       GROUP BY 
        c.id 
       HAVING 
        COUNT(1) > 1 
      ) f 
      ON e.id = f.id 
     WHERE 
      e.name = 'test_name' 
    ) m 
    ON p.id = m.id 
WHERE 
    m.id is null 
+0

你能縮進您查詢一下?它幾乎看起來像是混淆的代碼。 – Serge

+0

你能告訴我們查詢計劃嗎? – iruvar

+0

新手在這裏,無法縮進,我試過了,不能提供執行計劃,但是,所有使用的都是索引掃描和左外連接表上的一個表掃描p – Nishad

回答

1

Prerequise:有一個主鍵

select distinct 
    p.id 
    , p.name 
from test p 
where not exists (
    SELECT TOP(1) 
     1 
    FROM test e 
    WHERE e.PrimaryKey <> p.PrimaryKey 
    AND e.id = p.id 
    AND 'test_name' IN (e.name, p.name) 
) 
1

如何你的桌子包含很多列嗎?如果只有這兩列,添加非聚集索引是沒有意義的。你應該在ID列上創建CLUSTERED索引,就是這樣 - 你會看到性能增加。

如果你有很多colums,可以考慮兩種選擇:

  1. 創建的NAME列和非聚集索引的ID列聚集索引。
  2. 創建的ID列非聚集索引,並且包括姓名欄(你會創建一個覆蓋索引方式)
+0

在選擇列表中有更多的列,但我showun只有其中兩個,並有複合priomary密鑰,並沒有用,因爲我不選擇這些列的數據 – Nishad

1

一般來說,關係數據庫(即關係)都寫在這樣一種方式來優化語句組合。在「ON」條件下使用「JOIN」子句時,數據庫引擎可以創建一個優化的執行計劃,將表結構,索引等考慮在內。當加入子選擇時,有時候相同的優化因素不可用,或者沒有以相同的方式考慮。這取決於你的模式,但它是一個好的經驗法則假設標準加入與「上」的條款將是更有效的比上一子選擇加入。

你的架構是非常模糊的,所以我甚至不能確定你所需要的連接,但如果這樣做,你應該嘗試進行直接「的」標準聯接。