我有一个关于在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
如您所见,第二个查询中的顶级操作非常慢。 也许有人对这个问题有一些暗示?
答案 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));