2013-10-25 38 views
2

'count'查詢運行良好。只要評論部分保持原樣,'記錄頁面'查詢就可以正常運行。如果未註釋它永遠不會返回...只是繼續前進。任何幫助如何通過這將不勝感激。RowNumber()Over(Order by x)子查詢不起作用

-- Page or records 
DECLARE @p0 int; 
DECLARE @p1 int; 
SET @p0 = 100; 
SET @p1 = 20; 

SELECT DISTINCT ZIP_CODE, RowNum 
FROM  (SELECT ROW_NUMBER() OVER (ORDER BY ZIP_CODE) as RowNum, ZIP_CODE 
      FROM ODS.PHP1300_DWH.FACETS_MEMBER 
      --WHERE LEFT(ZIP_CODE, 5) NOT IN (SELECT SHORT_ZIP_CODE 
        --      FROM DWH.Reference.R_ZIP_CODE) 
     ) AS x 
WHERE RowNum BETWEEN @p0 + 1 AND @p0 + @p1 
ORDER BY RowNum 

------------------------------------------------------------------------------------- 

-- Count 
SELECT COUNT(ZIP_CODE) 
FROM ODS.PHP1300_DWH.FACETS_MEMBER 
WHERE LEFT(ZIP_CODE, 5) NOT IN (SELECT SHORT_ZIP_CODE 
           FROM DWH.Reference.R_ZIP_CODE) 

回答

3

我認爲你在派生表中的謂詞是相當昂貴的。很難說沒有執行計劃。這裏有一些措施可以採取:

  • 嘗試使LEFT(FACETS_MEMBER.ZIP_CODE, 5)一個computed column並建立索引
  • 確保R_ZIP_CODE.SHORT_ZIP_CODE上有一個索引
  • 確保R_ZIP_CODE.SHORT_ZIP_CODE上有一個NOT NULL約束。

除此之外,我認爲你在外部查詢DISTINCT關鍵詞是無用的,因爲你要添加的RowNum,這是明顯的對每條記錄呢。所以,你應該移到DISTINCT到您的嵌套查詢,這應該使用DENSE_RANK()而不是ROW_NUMBER(),如下解釋:

http://blog.jooq.org/2013/10/09/sql-trick-row_number-is-to-select-what-dense_rank-is-to-select-distinct/

+0

@KeithMyers:其中哪些措施之一的伎倆,最後? –