- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我运行CREATE EXTERNAL TABLE cetasTable AS SELECT命令,请运行:
EXPLAIN
select * from cetasTable
<operation_cost cost="4231.099968" accumulative_cost="4231.099968" average_rowsize="2056" output_rows="428735" />
select * from sys.stats where object_id = object_id('cetasTable')
EXPLAIN
select * from cetTable
<operation_cost cost="4.512" accumulative_cost="4.512" average_rowsize="940" output_rows="1000" />
最佳答案
您将看到使用CxTAS创建的表(CTAS,CETAS或CRTAS)与CREATE TABLE之间的区别。
当您运行CREATE TABLE时,行数和页数的值是固定的,因为表为空。如果使用内存,则固定值为1000行和100页。使用CTAS创建表时,它们是不固定的。实际值对于CTAS命令是已知的,因为它只是在单个命令中创建并填充了表。因此,使用CxTAS时,元数据正确反映了表SIZE。很好当通过CxTAS创建了一个表而不是CREATE表时,基于APS / SQLDW成本的优化器可以立即根据表SIZE为MPP计划生成做出更好的估算。
准确了解表大小很重要。
假设您有一个使用CREATE TABLE创建的表,然后使用INSERT将10亿行插入到该表中。 Shell数据库仍然认为该表具有1000行和100页。但是,事实显然并非如此。原因是因为此时表大小属性不会自动更新。
现在假设触发了一个查询,该查询需要在此表上移动数据。事情可能开始变糟了。现在,您更可能会看到引擎对MPP计划的选择不正确(通常使用BROADCAST而不是SHUFFLE),因为它不了解表格大小。
您可以采取什么措施来改善此状况?
每个表至少创建一个列级统计对象。一般来说,您将在查询中JOINS,GROUP BY,WHERE和ORDER BY中使用的所有列上创建统计对象。我将在稍后解释生成统计信息的基本过程。我只想强调一下,这里的号召性用语是确保您创建和维护统计对象。
当对一列执行CREATE STATISTICS时,实际上会发生三个事件。
1)在CONTROL节点上更新表级别信息
2)在COMPUTE节点上的每个分布上创建列级统计对象
3)在CONTROL节点上创建并更新列级统计对象
1)在CONTROL节点上更新表级别信息
第一步是更新表级别信息。为此,APS / SQLDW对每个物理分发执行带有STAT_STREAM的DBCC SHOW_STATISTICS(table_name);合并结果并将其存储在Shell数据库的目录元数据中。行数保存在sys.partitions中,页数保存在sys.allocation_units中。 Sys.partitions在SQLDW和APS中对您都是可见的。但是,sys.allocation_units目前对最终用户不可见。我为熟悉SQL Server内部知识的人员参考了该位置,以获取信息和上下文。
在此阶段结束时,CONTROL节点上的外壳数据库中保存的元数据已针对行数和页数进行了更新。现在,由CREATE TABLE创建的表和CTAS之间没有区别-两者都知道大小。
2)在COMPUTE节点上的每个分布上创建列级统计对象
必须在每个COMPUTE节点上的每个分发中创建统计信息对象。通过创建重要的统计对象,已创建了该列的详细统计数据(尤其是直方图和密度向量)。
APS和SQLDW使用此信息来生成分发级别的SMP计划。 SMP计划仅由APS / SQLDW在物理层使用。因此,此时统计数据不在可用于生成MPP计划的位置。信息已分发且无法及时访问,以进行基于成本的优化。因此,第三步是必要的...
3)在CONTROL节点上创建并更新列级统计对象
在COMPUTE层中的分布上以物理方式创建数据后,必须将其汇总在一起并以逻辑方式保存,以促进基于MPP计划成本的优化。 CONTROL节点上的Shell数据库还创建了一个统计对象。这是统计对象的逻辑表示。
但是,shell数据库stat尚未反映在COMPUTE节点上的分布中物理保留的列级统计信息。因此,在创建CONTROL节点后,外壳数据库中的统计对象需要立即更新。
具有STAT_STREAM的DBCC SHOW_STATISTICS(表名,状态名)用于执行此操作。
请注意,该命令具有第二个参数。这将更改结果集;向APS / SQLDW提供构建该列统计对象的LOGICAL视图所需的所有信息。
我希望这可以解释您所看到的内容,还可以解释如何创建统计信息以及为什么统计信息对于Azure SQL DW和APS非常重要。
关于azure-sqldw - Azure SQL DW如何在没有统计信息的情况下知道行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34548857/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!