为什么SQL Server排序运算符会减少行估计数?

为什么SQL Server排序运算符会减少行估计数?,sql,sql-execution-plan,Sql,Sql Execution Plan,以下查询(由nhibernate生成)的执行计划显示排序运算符正在减少排序操作后的行数。这是什么原因造成的?通过对左侧外部联接使用哈希联接提示,可以提高查询性能,但是由于错误的估计,SQL使用的是嵌套循环。我想知道排序运算符是否导致了这种情况 SELECT TOP (26) col_0_0_, col_1_0_, col_2_0_, col_3_0_ FROM ( select table0.table_id as col_0_0_, p

以下查询(由nhibernate生成)的执行计划显示排序运算符正在减少排序操作后的行数。这是什么原因造成的?通过对左侧外部联接使用哈希联接提示,可以提高查询性能,但是由于错误的估计,SQL使用的是嵌套循环。我想知道排序运算符是否导致了这种情况

SELECT TOP (26)  
col_0_0_,  
col_1_0_,  
col_2_0_,  
col_3_0_  
FROM (  
    select   
    table0.table_id as col_0_0_,  
    propertyst2_.dataTypeString as col_1_0_,  
    propertyst3_.dataTypeString as col_2_0_,  
    propertyst4_.dataTypeString as col_3_0_ ,  
    ROW_NUMBER() OVER(ORDER BY propertyst2_.dataTypeString) as __hibernate_sort_row  
    from dbo.Tables table0   
    left outer join dbo.PropertyDataString propertyst2_ on table0.table_id=propertyst2_.parent_id and (propertyst2_.propertyType_id='p0') 
    left outer join dbo.PropertyDataString propertyst3_ on table0.table_id=propertyst3_.parent_id and (propertyst3_.propertyType_id='p1') 
    left outer join dbo.PropertyDataString propertyst4_ on table0.table_id=propertyst4_.parent_id and (propertyst4_.propertyType_id='p2') 
    where table0.tableType_id='p3' 
) as query 
WHERE query.__hibernate_sort_row > 221052 ORDER BY query.__hibernate_sort_row

我在查询中遇到了同样的问题,我确认这是由TOP N造成的。
SQL Server希望只使用排序操作中的k*N第一行,但接下来的筛选器显示这些行被排除,因此需要更多行,这就是为什么我们看到排序操作后的实际行数比预期的要高得多。

此表上的统计日期如何?我已多次更新了统计数据,并添加了覆盖索引(这是在dev服务器上)这可能是由于
前26名
行目标的影响。我们升级到SQL 2014,它支持偏移量和行获取,似乎可以获得更好的估计。(@Martin Smith如果您添加一个答案,我可以将其标记为已接受,因为这是我们查看偏移量的初始提示。否则,我会将此标记为答案)@masdude顺便说一句,我们决定将一些逻辑移到返回Id表的UDF。OFFSET和ROWS FETCH不是选项,因为问题出现在EF生成的查询中,我们从2008 R2开始使用SQL Server版本,具体取决于客户。