1

我有一个关于在 SQL Azure 上将 Top 与具有聚簇索引的表一起使用的问题。

这两个表都有聚集列存储索引,表 HeaderTable 有 300K 行,表 ValuesTable 有 650 万行。

-- with no "Top"
--responce after 2 sec
declare @Date datetime  = getdate()
select  zp.idCol1, Value1, zp.idcol2 from [HeaderTable] zp 
    inner join [dbo].[ValuesTable] zpp 
        on zp.idcol2 = zpp.idcol2
            where zp.Date > @Date-30 and zp.Date < @Date-10 and zp.idCol1>0 and zpp.Value2 = 'SZT'
                    order by idcol2
go 

-- with  "Top 100"  
--responce after 27 sec
declare @Date datetime  = getdate()
select top 100 zp.idCol1, Value1, zp.idcol2 from [HeaderTable] zp
    inner join [dbo].[ValuesTable] zpp 
        on zp.idcol2 = zpp.idcol2
            where zp.Date > @Date-30 and zp.Date < @Date-10 and zp.idCol1>0 and zpp.Value2 = 'SZT'
                    order by idcol2

go 

-- Result into Temporary Table and Select top 100  from Temporaty Table 
-- responce after  2 sec

declare @Date datetime  = getdate()
select  zp.idCol1, Value1, zp.idcol2 into #d  from [HeaderTable] zp 
    inner join [dbo].[ValuesTable] zpp
        on zp.idcol2 = zpp.idcol2
            where zp.Date > @Date-30 and zp.Date < @Date-10 and zp.idCol1>0 and zpp.Value2 = 'SZT'

select top 100 * from #d order by #d.idcol2
drop table #d
go

如您所见,第二个查询中的顶部操作非常慢。也许有人对这个问题有一些提示?

4

2 回答 2

2

这在 Azure 上的新(兼容性级别 130,兼容性级别 130 目前支持预览版,尚未普遍可用)数据库的增强中进行了优化。

ALTER DATABASE <dbname> SET COMPATIBILITY_LEVEL = 130

有所作为。

于 2016-04-22T11:11:15.307 回答
1

第二个执行计划令人震惊。SQL Server 通过将列存储缓冲到行存储临时表中来破坏所有列存储的好处......这是查询优化器的一个质量问题,因为这种策略在任何情况下都没有意义。

尝试让 SQL Server 相信 TOP 什么都不做:

DECLARE @top BIGINT = 100;
SELECT TOP (@top) ...
OPTION (OPTIMIZE FOR (@top = 100000000000000000000000000000000));
于 2015-12-16T15:38:43.177 回答