Azure SQL,Clustered Columnstore Index,“TOP”性能

时间:2015-12-16 14:24:38

标签: sql-server azure columnstore

我有一个关于在SQL Azure上使用Top with Tables with Clustered Clustered Index的问题。

两个表都有Clustered Columnstore Index,表HeaderTable有300K行,表ValuesTable有6.5M行。

-- 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

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

2 个答案:

答案 0 :(得分:2)

这在Azure上的新增功能(兼容级别130,兼容级别130当前支持预览,但尚未普遍可用)中进行了优化。

ALTER DATABASE <dbname> SET COMPATIBILITY_LEVEL = 130

有所作为。

答案 1 :(得分:1)

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

尝试说服SQL Server TOP什么都不做:

DECLARE @top BIGINT = 100;
SELECT TOP (@top) ...
OPTION (OPTIMIZE FOR (@top = 100000000000000000000000000000000));