【问题标题】:Index large table best for performance Row or column Index索引大表最适合性能 行或列索引
【发布时间】:2021-12-02 19:31:18
【问题描述】:

我正在使用我的第一个 Azure sql db,并且在行和列中有一个非常大的表

有问题的表包含 2019 年至 2020 年的数据,大约有 2200 万行
待批加载 2021 将使其保持最新状态,大约有 3200 万条记录

这张表有 350 列(非常宽)

2021 年批量加载完成后的每日加载量约为每天 50,000 条记录

我想改进对该表的查询以减少加载到 PBI 导入的时间

一旦发生每日负载,行索引可能会立即过期。

  1. 如果我只是在视图中对这些数据进行子集化,以便 PBI 导入几列,那么 columnStore 索引是否可行?示例

描述在哪里('Foo' ,'酒吧' ) AND Date > Dateadd(Month, -12, '2021-01-01 00:00:00.000')

  1. 如果我添加列存储索引,我需要在 2021 年加载后刷新它
  2. 是否需要包含所有 350 列?我猜这会增加存储空间。

提前致谢
在处理频繁加载的宽大表时,更多关于索引类型的最佳实践

【问题讨论】:

  • 您构建索引以匹配对性能至关重要的查询,而不是表布局。为了帮助您解决query-optimization 的问题,我们需要更多信息。请read this,然后edit您的问题。而且,如果您使用 SSMS(Microsoft 的 SQL Server Management Studio),则此提示适合您:在查询窗口中单击鼠标右键,然后选择 Show Actual Execution Plan,然后运行查询。执行计划显示有时会建议创建一个新索引。
  • 感谢您的回复。我想我试图为您提供所有背景信息,说明为什么我在流程中追求最佳索引类型。即部分加载的大表(列和行),将看到每日交易。我不想要行索引附带的维护,但是有这么多列的大表会影响列索引执行和存储其数据的方式。正如我的示例中所见,查询并不复杂,我更关心为我的表应用正确类型的索引,例如行、列、集群或非集群,这是日常负载的一部分。
  • 显然,向这种大小的表添加任何索引都需要时间。所以我只想第一次选对类型

标签: sql indexing datatables azure-sql-database query-optimization


【解决方案1】:

如果这是你的 WHERE 子句模式

Where Description IN ('Foo' ,'Bar' )
  AND Date > Dateadd(Month, -12, '2021-01-01 00:00:00.000')

(Description, Date) 上的索引将有助于它高效运行。

但如果这是你的 WHERE 子句模式(我猜)

Where Description IN ('Foo' ,'Bar' )
  AND IsOpen = 1
  AND Date > Dateadd(Month, -12, '2021-01-01 00:00:00.000')

那么你需要一个(IsOpen, Description, Date) 的索引。阅读:https://use-the-index-luke.com/

编辑

首先:索引在表更新时更新。这就是重点。

第二:设计索引,甚至是索引的类型,需要了解您的工作负载和访问模式。

第三:每个表只有一个聚集索引。如果表具有已定义的主键,则它是该键上的索引。如果表没有 PK,则它是一些服务器生成的行 id 上的索引,对用户不可见。

第四:columnstore indexes,根据文档,“设计用于对数百万和数十亿行数据进行扫描和聚合的查询非常高效。”同样,您还没有告诉我们您的工作量是什么样的,因此很难提出建议。

【讨论】:

  • 您好,感谢您的回复。索引中的实际上下文我很好。这是一个关于当前表大小的问题,以及它将成为该过程的一部分。考虑到表的大小,未来列索引将是最佳选择。所以我的观点需要选择所有 350 列,但使用日期和描述的那些子句。 3200 万行的任何索引都需要很长时间 如果我完成了 10 天的每日负载,索引将如何执行
猜你喜欢
  • 1970-01-01
  • 2010-11-20
  • 2015-08-13
  • 2014-10-04
  • 1970-01-01
  • 2016-07-10
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多