- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个让我难住了。我有一个维度表,其中包含大约 3000 万行。它是一个聚集列存储。此外,此表在其代理键上具有 INT 类型的主键约束。
检索代理键的 MIN() 的查询,对于给定的日期范围,如下所示:
SELECT
MIN(DIM.OrderId)
FROM
dbo.Dim_Order AS DIM
WHERE
DIM.OrderDate >= CAST('2016-06-01' AS DATE)
AND DIM.OrderDate < CAST('2016-07-01' AS DATE)
OPTION (MAXDOP 1);
这是输出:
Table 'Dim_Order'. Scan count 2, logical reads 833, physical reads 0, read-ahead reads 0, lob logical reads 1702561, lob physical reads 0, lob read-ahead reads 0.
Table 'Dim_Order'. Segment reads 304001, segment skipped 0.
(1 row affected)
SQL Server Execution Times: CPU time = 2829 ms, elapsed time = 2876 ms.
优化器选择使用非集群主键并通过嵌套循环执行键查找,而不是使用列存储。更糟糕的是,它严重低估了返回的行数。
奇怪的是,行估计似乎与日期范围的大小成反比。
╔════════════╦══════════════════════════╗
║ Date Range ║ Estimated Number of Rows ║
╠════════════╬══════════════════════════╣
║ 1 year ║ 2.00311 ║
║ 6 months ║ 3.41584 ║
║ 1 month ║ 24.4459 ║
║ 2 weeks ║ 52.093 ║
║ 1 week ║ 99.9055 ║
║ 3 days ║ 217.632 ║
║ 1 day ║ 1088.16 ║
╚════════════╩══════════════════════════╝
此版本带有 INDEX 提示,几乎立即运行:
SELECT
MIN(DIM.OrderId)
FROM
dbo.Dim_Order AS DIM WITH(INDEX=CCI_Dim_Order)
WHERE
DIM.OrderDate >= CAST('2016-06-01' AS DATE)
AND DIM.OrderDate < CAST('2016-07-01' AS DATE)
OPTION (MAXDOP 1);
Table 'Dim_Order'. Scan count 1, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 1004, lob physical reads 0, lob read-ahead reads 0.
Table 'Dim_Order'. Segment reads 2, segment skipped 0.
(1 row affected)
SQL Server Execution Times: CPU time = 0 ms, elapsed time = 1 ms.
我在以下版本中观察到此行为:
Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64)
Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64)
下面的重现脚本将创建一个示例表并用 2 年的订单填充它,对于 2,000 名客户,每天一个订单。这相当于我们表中的 1,462,000 个样本订单,跨越 24 个月,每个月大约有 60,000 行。脚本底部的示例查询旨在演示该行为。正如您将看到的,出于某种原因,行估计值非常低,优化器拒绝使用聚集列存储,除非得到提示。
我很感激任何关于此的意见或建议。这是示例脚本。
DROP TABLE IF EXISTS dbo.Dim_Order
CREATE TABLE dbo.Dim_Order
(
OrderId INT NOT NULL
, CustomerId INT NOT NULL
, OrderDate DATE NOT NULL
, OrderTotal decimal(5,2) NOT NULL
);
WITH CTE_DATE AS
(
SELECT CAST('2016-01-01' AS DATE) AS DateValue
UNION ALL
SELECT
DATEADD(DAY, 1, D.DateValue)
FROM
CTE_DATE AS D
WHERE
D.DateValue < CAST('2017-12-31' AS DATE)
),
CTE_CUSTOMER AS
(
SELECT 1 AS CustomerId
UNION ALL
SELECT
CustomerId + 1
FROM
CTE_CUSTOMER AS D
WHERE
D.CustomerId < 2000
)
, CTE_FINAL
AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY DateValue ASC, CustomerId ASC) AS OrderId
, CustomerId
, DateValue AS OrderDate
, CAST(ROUND(RAND(CHECKSUM(NEWID()))*(100-1)+1, 2) AS DECIMAL(5,2)) AS OrderTotal
FROM
CTE_DATE
CROSS JOIN CTE_CUSTOMER
)
INSERT INTO
dbo.Dim_Order
(
OrderId
, CustomerId
, OrderDate
, OrderTotal
)
SELECT
ORD.OrderId
, ORD.CustomerId
, ORD.OrderDate
, ORD.OrderTotal
FROM
CTE_FINAL AS ORD
OPTION (MAXRECURSION 32767);
CREATE CLUSTERED COLUMNSTORE INDEX CCI_Dim_Order ON dbo.Dim_Order;
ALTER INDEX CCI_Dim_Order ON dbo.Dim_Order
REORGANIZE
WITH (COMPRESS_ALL_ROW_GROUPS = ON)
ALTER TABLE dbo.Dim_Order
ADD CONSTRAINT PK_Dim_Order PRIMARY KEY NONCLUSTERED (OrderId ASC);
RETURN;
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT
MIN(DIM.OrderId)
FROM
dbo.Dim_Order AS DIM
WHERE
DIM.OrderDate = CAST('2016-06-01' AS DATE)
AND DIM.OrderDate < CAST('2016-07-01' AS DATE)
OPTION (MAXDOP 1);
SELECT
MIN(DIM.OrderId)
FROM
dbo.Dim_Order AS DIM WITH(INDEX=CCI_Dim_Order)
WHERE
DIM.OrderDate >= CAST('2016-06-01' AS DATE)
AND DIM.OrderDate < CAST('2016-07-01' AS DATE)
OPTION (MAXDOP 1);
最佳答案
这是一个典型的 row goal基数估计问题。您可以添加 USE HINT ('DISABLE_OPTIMIZER_ROWGOAL')
来禁用行目标,并且应该会发现集群列存储现在成本更低且已被选中。
该计划对 PK_Dim_Order
进行了有序扫描 - 因为它正在按 OrderId
的顺序处理行并正在寻找 MIN(DIM.OrderId)
它可以在找到第一个与 OrderDate
上的谓词匹配的行时立即停止 - 它假定与月份谓词匹配的 60,000 行将均匀分布在整个索引中。事实上,它们都在 ID 为 304001
到 364000
的连续范围内。
这种不相关的假设也是估计的行数随着日期范围变大而下降的原因。如果您将日期谓词的匹配行数加倍,并且它们真正均匀地分布在索引中,那么您只需要读取一半的行就可以找到匹配两个谓词的行并停止扫描。
关于sql-server - Clustered Columnstore 上的 Rowstore 索引 - 基数估计错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49662632/
从 Wildfly 8.2.1.Final 升级到 Wildfly 9.0.1.Final 后,我们开始收到很多警告,如下所示: WARNING [org.jgroups.protocols.TCP]
如果是,在哪里可以找到?!根据this infoq 条目,他们已经开源了。但是现在,他们的网站上没有这样的产品。 最佳答案 本页,http://terracotta.org/dl/oss-downlo
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: Difference between clustered and nonclustered index What
我将 H2 数据库用于包含大量时间序列的环境数据。时间序列只是定期(例如每小时一次)记录在数据库中的传感器的测量值。 表中存储的数据: CREATE TABLE hydr (dt timestamp
Cluster 和 MPP super 计算机架构之间有什么区别? 最佳答案 在集群中,每台机器在内存、磁盘等方面都在很大程度上独立于其他机器。它们使用普通网络上的一些变体相互连接。集群主要存在于程序
我正在尝试为 akka 集群构建一个大脑 split 解析器。但是很难模拟某些节点无法从原始集群的其余部分访问并形成自己的集群的场景。 不能通过停止和重启节点来完成,因为新启动的节点不是同一个节点,因
我正在尝试在我的应用程序中使用集群。但是,在导入语句中,我得到“无法解析导入 com.google.maps (clustering.Cluster)”。 此外,在使用 ClusterManager
我想知道 Hive 中 Cluster By 和 CLUSTERED BY 的主要区别是什么。 Cluster By 用于对表进行分桶。并且会用到Hash函数。 CLUSTERED BY 用于在 re
我有3台机器,为redis集群创建了6个节点,我几个月前创建成功了,但现在它掉线了,我尽力修复它,但它不起作用,所以我清理所有数据并重新创建它从零开始,当我使用以下命令创建集群时,它在这里阻塞,等待节
我尝试使用 swarm 和 consul 设置 docker 集群。我有 manager、host1 和 host2。 我在管理器上运行 consul 和 swarm manager 容器。 $ do
如果我不使用 DTW 作为距离度量,那么 tslearn.clustering.TimeSeriesKMeans 和 sklearn.cluster.KMeans 是否等同? 如果不是,谁能告诉我这两
我正在研究 Flink 1.9.1 的 docker/k8s 部署可能性。 我正在阅读/观看 [1][2][3][4]。 目前我们确实认为我们会尝试采用作业集群方法,尽管我们想知道这方面的社区趋势是什
我可以使用一些关于 R 中方法的建议来确定最佳集群数,然后用不同的统计标准描述集群。我是 R 的新手,对聚类分析的统计基础有基本的了解。 确定簇数的方法:在文献中,一种常用的方法是所谓的“肘部准则”,
我有一个查询无法执行,并显示“由于文件组“DEFAULT”中磁盘空间不足,无法为数据库“TEMPDB”分配新页面”。 在排除故障的过程中,我正在检查执行计划。有两个标记为“聚集索引扫描(聚集)”的昂贵
我刚刚下载了 Elasticsearch 发行版并运行了它。 curl 'localhost:9200' { "status" : 200, "name" : "cbs", "clu
我有一个集群,其“cluster_ Purpose”设置为“dev_test”。我想将其更改为“生产”。在文档中找不到任何内容。 最佳答案 回答我自己的问题。这是不可能的。 关于Azure ML :
如何将主聚集索引更改为非聚集索引。 (作为“辅助”表,我想对“标题”表的外键列使用聚集索引。) 这对我不起作用(错误似乎是合理的:) DROP INDEX ClientUsers.PK_ClientU
我注意到,当使用 sklearn.cluster.KMeans 从方法 .cluster_centers_ 获取集群时,集群中心和每个集群的手动计算均值似乎不会给出完全相同的答案。 对于小样本量,差异
我在集群环境中使用 Quartz Scheduler 作为 Spring bean。 我有一些用@NotConcurrent 注释的作业,它们在每个集群中运行一次(即仅在一个节点中,仅在一个线程中)。
Node.js 本身有一个名为 Cluster 的核心模块(引用:http://nodejs.org/docs/v0.8.3/api/cluster.html),Learnboost 发布了一个名为
我是一名优秀的程序员,十分优秀!