2013-10-25 56 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:其中哪些措施之一的伎俩,最后? –