【问题标题】:Does the size of the data stored in the record affect the Clustered index performance?记录中存储的数据大小是否会影响聚集索引的性能?
【发布时间】:2014-04-08 15:19:44
【问题描述】:

我有三张桌子。

  1. 主事实表 (FactTable)
  2. 包含 int 字段 + 其他 'n' varchar(50) 字段的表 (Table001)
  3. 包含 int 字段 + 其他 'n' varchar(max) 字段的表 (Table002)

每个表中的记录:#500 万行

查询:

select * from FactTable f with (nolock)
inner join Table001 t001 with (nolock) on f.id = t001.id
inner join Table002 t002 with (nolock) on t002.id = f.id
where f.datefield = '2014-02-01'

所有表在字段“Id”上都有一个聚集索引(用于连接表,例如外键)

聚簇索引在所有表上都没有碎片化(碎片化百分比

这种情况是当我加入所有三个表时,我在执行计划中看到加入 table002 的成本高于 table001。这种行为有什么原因吗?

链接到 XML 执行计划:https://onedrive.live.com/redir?resid=7E436AE9D73999B0%21120

由于大小限制,我无法粘贴 xml 内容。

另一个链接:http://www.expinos.in/ExecutionPlan.sqlplan

【问题讨论】:

  • 您的数据是只读的吗?否则 NOLOCK 可能会返回错误的结果,你知道的。更好地与 (readcommitted) 一起使用。
  • 是的,大部分时间都是静态的,只有在一天中的特定时间有插入,所以 NOLOCK 不会损害数据完整性
  • 能否贴出XML版本的执行计划?
  • Varchar(max)字段中的数据一般都大于8K字节吗?如果是这样,那么它将不适合带有 ID 号的页面,并且将存储在表格的大对象存储区域中的其他位置。与仅使用 varchar(50) 的表相比,这将需要额外的查找来获取数据。

标签: sql sql-server


【解决方案1】:

行中不包含在索引中的列的大小不会影响包含索引本身的性能。

然而,

大型非索引列会影响基于表的操作的性能。页面上的行数会减少,因此在扫描时,您必须阅读更多页面。

查询中包含的大型非索引列将对查询性能产生明显的直接影响。您将不得不从磁盘/内存中读取更大的值,尽管优化器会在稍后尝试这样做。

索引中列的大小会影响索引的性能。

聚集索引中列的大小会影响表上所有索引的性能


比较 1 字节还是 10000 更容易?散列 1 个字节或 10000 个字节更容易吗?从磁盘/内存中读取 1 个字节还是 10000 个字节更容易?

【讨论】:

  • 这是有道理的,但我只是对上述查询进行了快速检查,没有包括 Table002 中的任何字段,但执行计划仍然显示 60 % 仅用于该连接。有什么办法可以降低这个join的成本?
  • @M22an,我看不到你的查询计划,两个连接都对索引搜索满意吗?
  • 与 Table001 的联接有一个索引扫描,而 Table002 有一个索引搜索
  • 我已经添加了执行计划的另一个链接
猜你喜欢
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2013-09-09
  • 2012-11-16
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2014-10-25
相关资源
最近更新 更多