即使在指定索引提示后,对临时表的选择查询也没有以正确的顺序返回数据

Ash*_*han 1 sql-server sql-server-2008-r2

在我的代码中,我使用select * into #tempTable. 临时表包含大量记录,我需要在代码中多次从中检索数据,因此我在其上创建了聚集索引。但不知何故,我没有按照创建的索引以正确的顺序获取数据。

我知道我可以简单地通过放置order by子句来做到这一点,但我的问题是为什么即使我强制优化器使用特定索引,我也没有以正确的顺序获取数据?

下面是我的示例代码:

----------- Sample code ----------------------------

;with CTE1
as (
    select col1
        ,col2
        ,-- - -- - - from table1

    union

    select col1
        ,col2
        ,-- - -- - - from table2
        -- few more tables in union --
    )
    , CTE2
as (
    select *
        ,RowNumber = RowNumber() 
            over (order by case 
                    when @sortOrder = 0
                    then case 
                            when @sortColumn = 'Date'
                            then [tdate]......some more dynamic order by conditions..........
                         end
                    end asc
            )
    from CTE1
    inner join
    from TABLE3 on -- some conditions
    )
select *
from CTE2
into #TempTable;
Run Code Online (Sandbox Code Playgroud)

然后添加聚集索引:

create clustered index IX_TempTable_RowNumber on #TempTable (RowNumber asc);

select *
from #TempTable with (index (IX_TempTable_RowNumber));

----------------- End of sample code ---------------------
Run Code Online (Sandbox Code Playgroud)

即使我检查了表方案和索引详细信息

exec tempdb.dbo.sp_help N'#TempTable';

select *
from tempdb.sys.indexes
where name = N'IX_TempTable_RowNumber'
Run Code Online (Sandbox Code Playgroud)

对我来说似乎是正确的。我在这里缺少什么?

小智 7

您必须使用 ORDER BY。添加使用特定索引的提示并不能保证结果集的任何排序:

/sf/ask/704517271/