【发布时间】:2014-04-08 15:19:44
【问题描述】:
我有三张桌子。
- 主事实表 (FactTable)
- 包含 int 字段 + 其他 'n' varchar(50) 字段的表 (Table001)
- 包含 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 内容。
【问题讨论】:
-
您的数据是只读的吗?否则 NOLOCK 可能会返回错误的结果,你知道的。更好地与 (readcommitted) 一起使用。
-
是的,大部分时间都是静态的,只有在一天中的特定时间有插入,所以 NOLOCK 不会损害数据完整性
-
能否贴出XML版本的执行计划?
-
Varchar(max)字段中的数据一般都大于8K字节吗?如果是这样,那么它将不适合带有 ID 号的页面,并且将存储在表格的大对象存储区域中的其他位置。与仅使用 varchar(50) 的表相比,这将需要额外的查找来获取数据。
标签: sql sql-server