2017-03-08 63 views
-1

我們有一些SQL可以在較小的數據量上正常運行,但是一旦我們擴展到從較大的卷中進行選擇,就會出現問題。是否有更快的替代方式來實現與以下相同的輸出?這個想法是拉回一個獨特的行來獲取最新版本的數據... SQL確實引用了另一個視圖,但是這個視圖運行速度非常快 - 所以我們期望這個問題在下面,並且想要嘗試不同的方法SQL效率不夠高,需要調整幫助

SELECT * 
FROM 
    (SELECT (select CustomerId from PremiseProviderVersionsToday 
      where PremiseProviderId = b.PremiseProviderId) as CustomerId, 
      c.D3001_MeterId, b.CoreSPID, a.EnteredBy, 
      ROW_NUMBER() OVER (PARTITION BY b.PremiseProviderId 
      ORDER BY a.effectiveDate DESC) AS rowNumber 
    FROM PremiseMeterProviderVersions a, PremiseProviders b, 
     PremiseMeterProviders c 
    WHERE (a.TransactionDateTimeEnd IS NULL 
    AND a.PremiseMeterProviderId = c.PremiseMeterProviderId 
    AND b.PremiseProviderId = c.PremiseProviderId) 
    ) data 
WHERE data.rowNumber = 1 
+0

問題尋求調整,將需要包括執行計劃,模式和參與問題 – TheGameiswar

+0

這部分「PremiseMeterProviderVersions一個,PremiseProviders B,PremiseMeterProviders C」的表的計數意味着你呼籲在所有領域表..爲什麼你不叫一個特定的領域,你只需要不打電話給所有的領域。 –

+0

您是否嘗試過使用'INNER JOIN',特別是爲了更好的清晰度?你有沒有嘗試評論子查詢,看看他們中的一個是否是原因? – Andrew

回答

0

您正在運行一個相關的查詢,將循環運行,如果表的大小很小,它會更快,我會建議改變它,並嘗試加入表以獲得customerid。

(從PremiseProviderVersionsToday選擇客戶ID,其中PremiseProviderId = b.PremiseProviderId)作爲客戶ID

0

考慮派生表包括彙總查詢,計算最大EffectoveDate通過PremiseProviderId和單元級查詢,每個使用顯式連接(電流ANSI SQL標準),而不是作爲隱性您目前使用的:

SELECT data.* 
FROM 
    (SELECT t.CustomerId, c.D3001_MeterId, b.CoreSPID, a.EnteredBy, 
      b.PremiseProviderId, a.EffectiveDate 
    FROM PremiseMeterProviders c 
    INNER JOIN PremiseMeterProviderVersions a 
     ON a.PremiseMeterProviderId = c.PremiseMeterProviderId 
     AND a.TransactionDateTimeEnd IS NULL 
    INNER JOIN PremiseProviders b 
     ON b.PremiseProviderId = c.PremiseProviderId  
    INNER JOIN PremiseProviderVersionsToday t 
     ON t.PremiseProviderId = b.PremiseProviderId 
    ) data 
INNER JOIN 
    (SELECT b.PremiseProviderId, MAX(a.EffectiveDate) As MaxEffDate 
    FROM PremiseMeterProviders c 
    INNER JOIN PremiseMeterProviderVersions a 
     ON a.PremiseMeterProviderId = c.PremiseMeterProviderId 
     AND a.TransactionDateTimeEnd IS NULL 
    INNER JOIN PremiseProviders b 
     ON b.PremiseProviderId = c.PremiseProviderId 
    GROUP BY b.PremiseProviderId 
    ) agg 
ON data.PremiseProviderId = agg.PremiseProviderId 
AND data.EffectiveDate = agg.MaxEffDate 
1

正如比拉爾·阿尤布如上所述,相關子查詢可能會導致性能問題。有關更多詳細信息,請參閱here。下面是我的建議:

  1. 更改所有以明確連接(ANSI標準)
  2. 使用別名比單個字符更具描述性(這是主要是爲了幫助讀者瞭解各表做什麼)
  3. 轉換數據子查詢到臨時表或cte(臨時表和ctes通常比子查詢執行得更好)
  4. 注意:通常,您應該明確創建並插入到臨時表中,但我選擇不這樣做,因爲我沒有知道你的列的數據類型。

    SELECT d.CustomerId 
        , c.D3001_MeterId 
        , b.CoreSPID 
        , a.EnteredBy 
        , rowNumber = ROW_NUMBER() OVER(PARTITION BY b.PremiseProviderId ORDER BY a.effectiveDate DESC) 
    INTO #tmp_RowNum 
    FROM PremiseMeterProviderVersions a 
    JOIN PremiseMeterProviders  c ON c.PremiseMeterProviderId = a.PremiseMeterProviderId 
    JOIN PremiseProviders    b ON b.PremiseProviderId = c.PremiseProviderId 
    JOIN PremiseProviderVersionsToday d ON d.PremiseProviderId = b.PremiseProviderId 
    WHERE a.TransactionDateTimeEnd IS NULL 
    
    SELECT * 
    FROM #tmp_RowNum 
    WHERE rowNumber = 1