问题描述
我尝试了解 Azure Synapse 中的索引,但对其中的一些索引有些困惑。
关于聚集列存储索引,我觉得它有点像 Apache Parquet,里面有行组和列块。在堆表中,数据没有被索引,所以看起来也很清楚。
但是聚集和非聚集索引呢? The documentation 将它们定义为:
当需要快速检索单行时,聚集索引的性能可能优于聚集列存储表。对于需要以极快的速度执行单行或很少行查找的查询,请考虑使用聚集索引或非聚集二级索引。使用聚集索引的缺点是只有对聚集索引列使用高度选择性过滤器的查询才会受益。为了改进对其他列的过滤,可以向其他列添加非聚集索引。但是,添加到表中的每个索引都会增加加载空间和处理时间。
这是我的问题:
- 这是否意味着它们更像是来自 sql Server 的索引?我的意思是,聚集索引会将数据按一列排序并将其存储为行?而非聚集将是一个额外的排序索引,仅存储对行的引用?
- 如果我对基于行格式的假设是正确的,这是否意味着聚簇索引对于分析查询的性能不佳,不是吗?
- 如果我们创建一个同时包含列存储和聚集索引的表会发生什么?数据是重复的,一次是列格式,一次是行格式?
我在该主题上找到了一些链接,但仍然怀疑它们是否适用于 Synapse:
- https://crmchap.co.uk/understanding-table-distribution-index-types-in-azure-synapse-analytics/
- https://www.sqlservercentral.com/articles/introduction-to-indexes-part-2-%e2%80%93-the-clustered-index
- https://www.sqlservercentral.com/articles/introduction-to-indexes-part-3-%E2%80%93-the-nonclustered-index
- https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-azure-sql-data-warehouse?toc=%2Fazure%2Fsynapse-analytics%2Fsql-data-warehouse%2Ftoc.json&bc=%2Fazure%2Fsynapse-analytics%2Fsql-data-warehouse%2Fbreadcrumb%2Ftoc.json&view=azure-sqldw-latest&preserve-view=true#rowstore-table-heap-or-clustered-index
解决方法
巴托斯
这是否意味着它们更像是来自 SQL Server 的索引?我的意思是,聚集索引会将数据按一列排序并将其存储为行?而非聚集将是一个额外的排序索引,只存储对行的引用?
您对聚类和非聚类的定义是正确的 - 略有不同。它类似于传统的 SQL Server,簇的叶子是实际的数据行。 总之,Synapse/pdw 数据行的物理组织将是
-
聚集列存储 - 数据未排序且行段可能具有重叠的最小值-最大值
-
Clustered columstore with order by - 数据被排序,因此行段不会有重叠,跳过将是最佳的
-
堆 - 即行格式
-
聚集索引这是 SQL Server 聚集索引,其中的线索/数据部分已排序。
如果我对基于行格式的假设是正确的,这是否意味着聚簇索引对于分析查询的性能不佳,不是吗?
如果您的查询选择一组连续的值,则聚集索引将是高性能的。例如 - select * from table where year between 2005 and 2007
。如果您的投影/选择包括表的所有或大部分列,则行/堆表是有效的。如果有宽表并选择少量列,列存储组织是有效的。
如果我们创建一个同时包含列存储和聚集索引的表会发生什么?数据是重复的,一次是列格式,一次是行格式? 如果您有 columstore 索引,您将无法创建聚集索引。
CREATE TABLE MyTable
(
mycolumnnn1 nvarchar,mycolumn2 nvarchar COLLATE Frisian_100_CS_AS )
WITH ( CLUSTERED COLUMNSTORE INDEX )
;
将失败并显示以下错误:
在Mytable(mycolumnnn1)上创建聚集索引idx1
Msg 1902,Level 16,State 1,Line 8
不能创建多个聚集索引
表'我的表'。删除现有的聚集索引
'ClusteredIndex_d79fca6646664ddea0d5983cbb17a8ae'
在创建另一个之前。