【问题标题】:Truncating table but leave statistics in place on Azure SQL Data Warehouse截断表,但在 Azure SQL 数据仓库中保留统计信息
【发布时间】:2016-12-24 02:01:44
【问题描述】:

我在一个应用程序中使用了一系列类似缓存的表,我正在评估该应用程序是否可以直接迁移到 Azure SQL 数据仓库。

应用程序使用一系列类似缓存的表,这些表被加载,然后用于连接到事实表(具有两个或三个维度,例如时间、位置、产品)。类似缓存的表通过应用程序共享,并且不同的报告加载具有任意字符串的行作为一列中的标识符和事实表中维度列的外键。

当表被截断时,统计信息似乎丢失了。是否可以通过提示等方式保持统计数据不变?

【问题讨论】:

  • 用例是什么?当您 TRUCATE 一个表时,剩下的就是模式。没有数据,因此没有统计数据。当桌子重新水化时,将根据加载的内容获得新的统计数据。您能否详细说明您认为保留旧统计数据的用例?
  • 随着用户在 UI 中的选择被转换为对数据库的操作,类似缓存的表全天增量加载。因此,如果我在用户日之前收集统计数据,他们将不具有代表性,因为表格将在一夜之间被截断。在每份报告中收集统计数据可能会有点矫枉过正(并且可能会引入锁定争用)。我想我读到了哪里可以伪造统计数据,如果我要使用 TRUNCATE,我将不得不研究这些统计数据。我也许可以只使用 DELETE 并接受日志记录以保持统计数据静态。
  • 无法伪造统计数据。 QO 使用统计数据(和其他东西)在合理的时间内提出最佳计划。提供虚假的统计数据有点违背了基于成本的 QO 的目的。使用虚假数据意外获得一个体面计划的几率与获得一个没有统计数据的体面计划的几率相同。此外,统计信息的创建和更新永远不会引入锁定争用。它可能会导致阻塞,但这与锁争用不同。

标签: azure-sqldw


【解决方案1】:

不,您不能在“TRUNCATE”之后保留统计信息。根据我的经验,重新采样您的关键列(不使用“FULL SCAN”)无论如何都不会花费那么长时间。这毕竟是一个 MPP 系统。

重新锁定,您应该知道 Azure SQL 数据仓库的默认事务隔离级别是读取未提交,因此锁争用不是问题。

目前 Azure SQL 数据仓库中不提供欺骗统计信息的技术。

【讨论】:

    猜你喜欢
    • 2017-02-26
    • 2017-05-08
    • 2018-10-28
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2017-08-14
    相关资源
    最近更新 更多