Azure SQL、聚集列存储索引、“TOP”性能

Posted

技术标签:

【中文标题】Azure SQL、聚集列存储索引、“TOP”性能【英文标题】:Azure SQL, Clustered Columnstore Index, "TOP" performance 【发布时间】:2015-12-16 14:24:38 【问题描述】:

我有一个关于在 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

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

【问题讨论】:

您不能指向查询计划的特定元素并让其负责。您几乎声称 TOP 总是很慢,这不是真的。将实际执行计划以 XML 形式发布到某处。 计划如下:link 【参考方案1】:

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

ALTER DATABASE <dbname> SET COMPATIBILITY_LEVEL = 130

与众不同。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

感谢您的解决方案,这很有帮助。它运行 2 秒。

以上是关于Azure SQL、聚集列存储索引、“TOP”性能的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2016新特性:列存储索引新特性

列存储聚集索引 - 死锁问题 (SQL Server)

SQL Server Standard Edition 2014 中的聚集列存储索引?

在 SQL Server 2014 中使用聚集列存储索引时,具有大量列的表是不是仍然是反模式?

SQL Server 2016 —— 聚集列存储索引的功能增强

SQL Azure 切换聚集和非聚集索引