Questions tagged «columnstore»

1
急切的后台打印操作符对于从群集的列存储中进行此删除有用吗?
我正在测试从群集的列存储索引中删除数据。 我注意到执行计划中有一个急切的假脱机操作员: 具有以下特征: 删除6000万行 1.9使用GiB TempDB 14分钟执行时间 连续计划 1在线轴上重新绑定 估计扫描成本:364.821 如果我诱使估算器低估了,我会得到一个更快的计划,避免使用TempDB: 估计扫描成本:56.901 (这是一个估计的计划,但是注释中的数字正确。) 有趣的是,如果我通过运行以下命令刷新增量存储,则线轴会再次消失: ALTER INDEX IX_Clustered ON Fact.RecordedMetricsDetail REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON); 仅当增量存储中的页面阈值超过某个阈值时才引入假脱机。 要检查增量存储的大小,我正在运行以下查询来检查表的行内页面: SELECT SUM([in_row_used_page_count]) AS in_row_used_pages, SUM(in_row_data_page_count) AS in_row_data_pages FROM sys.[dm_db_partition_stats] as pstats JOIN sys.partitions AS p ON pstats.partition_id = p.partition_id WHERE p.[object_id] = OBJECT_ID('Fact.RecordedMetricsDetail'); 第一个计划中的假脱机迭代器是否有任何合理的好处?我必须假定它旨在提高性能,而不是用于万圣节保护,因为它的存在不一致。 …

1
SQL Server 2014可以在批处理模式下执行什么操作?
在查询中使用列存储索引时,SQL Server可以使用批处理模式。关于可以在批处理模式下运行什么以及不能在批处理模式下运行的文档很少。请查看以下(激励性)查询计划,其中以批处理模式(绿色)执行大量操作: (这是一个估计的计划。我使用实际计划来验证实际执行模式确实是批处理的。) 请注意,只有T1的构建方使用列存储索引。所有探针输入(T2和T3)都是行存储。他们的数据似乎转换为批处理模式。我一直认为批处理模式仅用于通过探针侧运行的数据流。 似乎数据可以转换为批处理模式,即使它不是源自于列存储索引。这就提出了一个问题:为什么SQL Server也不将批处理模式也用于仅行存储的查询?对于其中一些人可能是有益的。使用列存储索引是否是使SQL Server考虑批处理模式所必需的正式要求?我们是否可以添加一个带有列存储索引的零行伪表来引入批处理模式并实现性能提升? 自SQL Server 2014起,批处理模式下到底可以运行什么?

3
为什么创建一个简单的CCI行组最多需要30秒?
当我发现一些插入内容花费的时间比预期的长时,我正在进行一个涉及CCI的演示。要重现的表定义: DROP TABLE IF EXISTS dbo.STG_1048576; CREATE TABLE dbo.STG_1048576 (ID BIGINT NOT NULL); INSERT INTO dbo.STG_1048576 SELECT TOP (1048576) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN FROM master..spt_values t1 CROSS JOIN master..spt_values t2; DROP TABLE IF EXISTS dbo.CCI_BIGINT; CREATE TABLE dbo.CCI_BIGINT (ID BIGINT NOT NULL, INDEX CCI CLUSTERED COLUMNSTORE); 对于测试,我将从登台表中插入所有1048576行。只要它由于某种原因没有被修剪,就足以填充一个压缩的行组。 …

1
列存储索引的结构是什么?
代号Denali为SQL Server 2012的新功能之一是Columnstore索引。 我对常规的旧行存储索引了解很多,例如b树结构,叶级页面和b树页面之间的存储差异,所包含字段的影响,优化使用它们,键顺序等。 我很难获得有关columnstore索引内部的任何良好信息。 结构如何? 有树吗?还有其他结构吗? 数据如何组织? 哪种类型的特定运算符最适合使用它? 使用其他反图案时要避免使用它们? 我可以找到的很多关于它们的内容基本上与“正常”索引完全相反,即,没有键的顺序,没有包含的字段,仅是非聚集的。 任何见解都表示赞赏。

3
集群列存储索引和外键
我正在使用索引对数据仓库进行性能优化。我对SQL Server 2014相当陌生,Microsoft描述了以下内容: “我们将群集列存储索引视为存储大型数据仓库事实表的标准,并期望在大多数数据仓库场景中使用该索引。由于群集列存储索引是可更新的,因此您的工作负载可以执行大量的插入,更新,和删除操作。” http://msdn.microsoft.com/en-us/library/gg492088.aspx 但是,如果您进一步阅读文档,则会发现存在以下限制和限制: “不能具有唯一性约束,主键约束或外键约束。” 这让我很困惑!出于各种原因(数据完整性,语义层可见的关系...),在数据仓库中具有外键是一种很好的做法(不是强制性的) 因此,Microsoft提倡针对数据仓库方案使用集群列存储索引。但是,它不能处理外键关系?! 我对此是否正确?您还建议其他哪些方法?过去,我在数据仓库场景中使用了非集群列存储索引,并为数据负载进行了删除和重建。但是,SQL Server 2014然后没有为数据仓库添加任何真正的新价值?

1
集群列存储上的非集群索引存储
在SQL Server中,行存储表上的非唯一非聚集索引在非聚集索引结构的所有级别上都包含基础对象的书签(RID或群集键)。书签作为所有索引级别上非聚集索引键的一部分存储。 另一方面,如果非聚集索引是唯一的,则书签仅在索引的叶级别存在-不作为键的一部分(实际上,书签作为一个或多个包含的列存在)。 在SQL Server 2016中,可以在面向列的表(具有群集列存储索引的表)上构建非群集b树索引。 集群列存储表上非集群b树索引使用的“书签”是什么? 上述唯一索引和非唯一非聚集索引之间的区别是否仍然适用?

2
只读文件组中的列存储索引可防止CheckDB
如果文件组包含列存储索引,则似乎设置了文件组以read_only防止dbcc checkdb整个数据库使用。尝试运行checkdb或checkfilegroup(对于数据库中的任何文件组,包括读写辅助文件和[PRIMARY])时,返回以下错误... Msg 8921, Level 16, State 1, Line 24 Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors. 是否存在将列存储数据存储在只读文件组中的受支持方法?还是在这种情况下无法进行完整性检查? 复制 create database check_fg_ro go use check_fg_ro go exec sp_changedbowner 'sa'; go alter database check_fg_ro add …

1
如何在UNPIVOT(循环连接)中使用批处理模式?
我有以下形式的查询: SELECT ... FROM ColumnstoreTable cs CROSS APPLY ( SELECT * FROM (VALUES ('A', cs.DataA) , ('B', cs.DataB) , ('C', cs.DataC) ) x(Col0, Col1) ) someValues 这将从Columnstore支持的子查询(ColumnstoreTable)中获取每一行,并将这些行相乘。这本质上是一个UNPIVOT。实际查询大于此。查询的这一部分将用于其他处理。 这里的问题是将其CROSS APPLY实现为循环连接,这是一个合理的选择。不幸的是,循环连接不支持批处理模式。 查询的这一部分对性能非常重要,我怀疑以批处理模式运行它可能对性能非常有益。 如何重写此查询,以便不退出批处理模式? 我确实尝试使用临时表代替VALUES,但这并没有改变没有哈希连接的相等连接条件的事实。


1
为什么批处理模式窗口合计会产生算术溢出?
以下查询在具有SUM的列存储表上执行带窗口的窗口1500 total rows,每个表的值均为0或1,并且溢出INT数据类型。为什么会这样呢? SELECT a, p, s, v, m, n, SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition FROM ( SELECT a, p, s, v, m, n, RANK() OVER (PARTITION BY v, s, a, p ORDER BY …

3
筛选条件未正确应用于“群集列存储”索引
使用下面的示例,谓词是相同的,但是top语句(正确)返回0行,bottom语句返回1-即使谓词不匹配: declare @barcode nchar(22)=N'RECB012ZUKI449M1VBJZ' declare @tableId int = null declare @total decimal(10, 2) = 5.17 SELECT 1 FROM [dbo].[transaction] WITH (INDEX([IX_Transaction_TransactionID_PaymentStatus_DeviceID_DateTime_All])) WHERE Barcode = @barcode AND StatusID = 1 AND TableID = @tableID AND @total <= Total SELECT 1 FROM [dbo].[transaction] WHERE Barcode = @barcode AND StatusID = 1 AND …

2
如何防止SELECT上的分区列存储死锁
我在SQL Server 2016中拥有三个群集列存储索引(CCI)表。所有这些CCI都基于租户ID处于同一分区方案中。最近,而且前后矛盾,我在从联接到这些表的简单选择语句中陷入僵局。死锁的示例查询: SELECT TOP 33 r.tenantid FROM Table_r r INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey WHERE r.TenantId = 69 AND pe.TenantId = 69 AND cm.TenantId = 69 错误信息: 事务(进程ID 56)与另一个进程在通用的可等待对象资源上处于死锁状态,并且被选择为死锁牺牲品。重新运行事务。 线索: 如果查询使用CCI以外的其他索引,则不会死锁。 如果删除三个tenantid过滤器中的两个,则不会死锁。 如果我选择前32位或更低,则不会死锁。 如果添加OPTION(MAXDOP 1),则不会死锁。 我可以在混乱的PROD副本,PROD只读次要副本和PROD本身中对此进行复制。 我无法在DEV或INT中复制此行为。 如果我将WITH(NOLOCK)添加到所有3个表联接中,它仍然会死锁 查询自身会死锁。当没有其他活动进程时,它将死锁。 没有并行性的查询计划不会死锁 死锁XML在这里 我们的PROD版本: …

2
列存储索引中的标识列
我有一个非常大的表IMO(约1.37亿行),其中包含很多重复数据,很多NULL列等等。 我正在考虑使用带有a的表进行探索,COLUMNSTORE INDEX并且IDENTITY在原始表中有一列,这是我唯一的一列,其中每一行都是唯一的。 我应该保留还是不包括此列?我已经读到您想将表的所有行都包含到中,COLUMNSTORE INDEX但是我也读到最好的候选者是具有很多非唯一行的列。 这只是一个不好的候选人COLUMNSTORE INDEX吗? 我正在使用SQL Server 2012,因此它是非群集的列存储。我只是在探索可能更好的方法来存储这些数据。更新是不存在的,尽管新行将通过ELT流程定期添加,所以我假设在那里会做一些工作。一些人挖掘这些数据并生成大量报告,进行大量行扫描,有时使服务器爬网,这迫使我们每天将副本卸载到辅助服务器。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.