- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Azure 数据仓库中,建议对计划加入甚至可能聚合的字段上的分布式表使用 HASH。还建议您对计划使用的字段创建统计信息。
假设您有两个具有相同数量记录和字段的表。一个表根据一个非常唯一的键进行哈希处理,另一个表为 ROUND_ROBIN,其中数据随机均匀地分布在 60 个数据库中。
-- CustomerID is alphanumeric
SELECT
[ProductID]
,COUNT(DISTINCT [CustomerID]) AS [Unique Records]
FROM [dbo].[FactTable]
GROUP BY
[Product]
在哈希表上,如果您对哈希键进行聚合,您可以看到它在 0.05 秒内返回结果。在循环表上,具有相同的聚合,为 0.51 秒。
CREATE STATISTICS [ProductID] ON [dbo].[FactTable] ([ProductID]);
CREATE STATISTICS [CustomerID] ON [dbo].[FactTable] ([CustomerID]);
当您对正在聚合的字段应用统计信息时,哈希表仍会在 0.05 秒内返回。不用找了。当您对循环表执行相同操作时,结果会在 0.05 秒内返回与哈希值相同的结果。
注意:2000 DWU 在 xlarge 资源中运行查询(最大内存分配)
在检查散列键的分布时,我发现 60 个数据库的一个分布中存储了 1.4 亿条记录。 5000 万条其他记录相当均匀地分布在其他 59 个数据库中。默认值使我的散列 key 不适合散列。
我的问题是,虽然带有统计信息的循环表在我与另一个表进行哈希处理的同一字段上表现良好,但当我在带有该键的 JOINS 上使用循环法时,相同的性能会保持不变吗?我还没有完全测试它,但正在寻找最好的方法。
统计数据对连接有帮助吗?我读过的一些文章说确实如此,但是在考虑分配 key 上的循环时,看看其他人是否对该方法有更可靠的答案。我确实没有任何好的候选者不会导致数据偏差,就像我上面的 1.4 亿个示例一样。
最佳答案
首先,在当前版本的 Azure SQL 数据仓库中,您应该始终为将在联接、GROUP BY
等中使用的列创建统计信息。忽略您在没有统计数据的情况下获得的时间,因为它们无关紧要。
良好哈希 key 的标准之一是 distributes the data evenly 。如果您没有好的候选人,那么 ROUND_ROBIN
是替代方案。关于 ROUND_ROBIN 需要记住的一点是,您总是会发生数据移动,但有时这很好。这实际上取决于您的关键查询是什么。我的建议是针对它们进行优化。
对于您给出的示例,性能非常快,因此确实不值得花费太多时间。您有一些更现实的疑问吗?
Azure SQL 数据仓库会进行缓存,与 SQL Server 类似,如所述 here .
当您从门户配置仓库时,我使用 AdventureWorksDW 示例模拟了一个测试设备,并发现对于这些示例查询,哈希表的性能明显更好(尽管偏差很大),但您的里程可能会有所不同 (YMMV):
-- 603,980,000 rows
CREATE TABLE dbo.FactTable_rr
WITH (
DISTRIBUTION = ROUND_ROBIN,
CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT a.ProductKey AS [ProductID], a.CustomerKey AS [CustomerID]
FROM [dbo].[FactInternetSales] a
CROSS JOIN ( SELECT TOP 1000 1 FROM [dbo].[FactInternetSales] ) b(c)
CROSS JOIN ( SELECT TOP 10 1 FROM [dbo].[FactInternetSales] ) c(c)
GO
CREATE STATISTICS st_dbo_FactTable_rr_ProductID ON dbo.FactTable_rr ( ProductID ) WITH FULLSCAN;
CREATE STATISTICS st_dbo_FactTable_rr_CustomerID ON dbo.FactTable_rr ( CustomerID ) WITH FULLSCAN;
GO
CREATE TABLE dbo.FactTable_hh
WITH (
DISTRIBUTION = HASH( [ProductID] ),
CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT *
FROM FactTable_rr
GO
CREATE STATISTICS st_dbo_FactTable_hh_ProductID ON dbo.FactTable_hh ( ProductID ) WITH FULLSCAN;
CREATE STATISTICS st_dbo_FactTable_hh_CustomerID ON dbo.FactTable_hh ( CustomerID ) WITH FULLSCAN;
GO
-- Find data skew for a distributed table
DBCC PDW_SHOWSPACEUSED('dbo.FactTable_rr');
DBCC PDW_SHOWSPACEUSED('dbo.FactTable_hh');
GO
--EXPLAIN
SELECT
[ProductID],
COUNT(DISTINCT [CustomerID]) AS [Unique Records]
FROM [dbo].[FactTable_rr]
GROUP BY [ProductID]
OPTION ( LABEL = 'rr' );
--EXPLAIN
SELECT
[ProductID],
COUNT(DISTINCT [CustomerID]) AS [Unique Records]
FROM [dbo].[FactTable_hh]
GROUP BY [ProductID]
OPTION ( LABEL = 'hh' );
-- Summary
SELECT [label], COUNT(*) records, CAST( AVG(total_elapsed_time) / 1000. AS DECIMAL(10,2) ) total_elapsed_time_s
FROM sys.dm_pdw_exec_requests
WHERE [label] IS NOT NULL
AND command Like 'select%'
GROUP BY [label];
我的结果,包含 6 亿行的表:
如果我查看两个查询的两个 EXPLAIN 计划( rr 、 hh ),我会看到一个更简单的哈希表计划,没有数据移动。 “rr”计划包含一个 SHUFFLE_MOVE
运算符,用于重新分配分布式表。
关于azure - 统计信息是否像 Azure 数据仓库中的哈希那样对 JOINS 上的字段有帮助?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421982/
Hortonworks 数据平台 HDP 3.0 有 spark 2.3 和 Hive 3.1,默认情况下 spark 2.3 应用程序(pyspark/spark-sql 等)使用 spark 数据
是否最好让一个软件仓库包含多个文件夹,这些文件夹映射到工作区中的不同路径。或者一个仓库中的多个文件夹映射到多个工作区,或多个仓库映射到多个工作区。 有人对此事有任何实用建议吗? 我还注意到,当我在仓库
Git 是分布式源代码控制系统,对吧。如何在没有集中存储库的情况下连接两个开发人员。 我们的团队使用 Github,如果两个开发人员想在同一个分支上工作,似乎需要将该分支推送到远程,然后他们才能访问它
Maven – 仓库 什么是 Maven 仓库? 在Maven 的术语中,仓库是一个位置(place),例如目录,可以存储所有的工程 jar 文件、library jar 文件、插件或任何其他的工
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
我开始将 git 与我的 .git 目录以及网络根目录中的其他所有内容一起使用。进一步阅读后,这似乎是一种不好的做法。我现在将我的应用程序和系统文件夹放在网络根目录之外。我的网络根目录中唯一剩下的就是
有没有可能没有历史的 Git 仓库?例如,我有一个我工作的本地 Git 存储库,我想将最新版本推送到生产服务器。生产服务器上不应存储任何历史记录。我该怎么做? 最佳答案 你可以看到命令 git arc
Laravel 中的 Repositories 有什么优势?它似乎是从应用程序的业务逻辑中抽象出模型层。虽然这似乎只是让整个请求生命周期变得更加复杂,但收效甚微。 有人可以阐明 Laravel 存储库
我有一个本地 git 服务器在我的 NAS 上运行,我正在我的笔记本电脑和工作站上进行开发,所有这些都在我的本地网络中。所以,如果我想在一个新的空 repo 中开始一个项目,我会关注 this ans
我们正在使用 SVN 来存储 maven 依赖项(组织限制不能像现在那样使用 nexus 或 artifactory maven 存储库)。 SVN 在使用 https 协议(protocol)的网络
我想允许某人查看我在我的私有(private)存储库中所做的工作。我该怎么做? 我看了https://help.github.com/articles/making-a-private-reposit
我试图阻止同事在 git 中再次推送已删除的标签(因为它被错误地推送了一次)。 我知道如何在本地执行此操作以及如何将其推送到远程以及如何指示我的同事以正确的方式从他们的本地存储库中删除已删除的标签。
我已经使用 url 克隆了一个 friend 的 git repo git 克隆 https://github.com/user/repo_name.git 然后我创建了我的分支,提交并尝试将我的代码
我目前正在我的代理机构安排比赛。我想对开发人员可以使用的模块进行一些管理。 是否可以托管 Play 模块和 Maven 库的镜像存储库并将 play 配置为仅使用这些存储库? 我已阅读此内容 docu
我正在尝试在我的 readme.md 中嵌入图像用于在 GitHub 上显示。我以前在公共(public)存储库中没有遇到任何问题,格式如下: ![header image](https://raw.
我想访问公司内部Artifactory实例上自定义开发的Gradle插件。对于公司内部发生的每一个Gradle构建,我都希望如此。我是否缺少任何东西,或者建议的方法是在每个项目的每个Gradle构建之
我想保留我在 docker hub 帐户中使用的图像,同时保持对拉取图像的引用。就像你在 github 上 fork 一个项目一样。 目前我已经尝试过jwilder/nginx-proxy图片。现在我
Perforce 中是否有命令可以获取客户端从软件仓库映射到特定文件夹的信息? 示例: 我有仓库位置//depot/myfolder/somefile.java 我想知道哪些客户端将此位置映射到哪个路
我被指派为一个项目开发一项功能。在几周的时间里,我将花几天时间研究该功能。我将克隆中央仓库。然后我将在本地工作 3 周。在此过程中,我会多次将我的进度提交到我的 repo 协议(protocol)中。
我发现自己越来越喜欢将Rstudio与R markdown文件(.rmd)一起使用,并且我非常喜欢“编织HTML +发布到Rpubs”的便利与同事共享我的工作。不幸的是,发布的文件必须是公开可见的,而
我是一名优秀的程序员,十分优秀!