【发布时间】:2013-07-19 09:41:27
【问题描述】:
我已经阅读了有关布尔列如何不能用作搜索索引的信息。 但我的问题是.. 如果聚集索引会影响记录的物理排列 难道它不能用来将一种记录放在一起(在同一页面中),这样这些页面被加载到内存中的机会就会减少.. 我会尝试更好地解释:为了桌子
[BookPages]
ID(int)
Deleted(Boolean)
Text(Varchar)
如果聚集索引位于ID 列上,则示例数据为
1, true, 'the quick..'
2, false, 'hello w..'
3, true, 'stack m..'
4, false, 'just thin...'
这意味着删除/活动记录是交错的,所以如果我们搜索记录 2
SELECT [Text] FROM [BookPages] WHERE [Deleted] = false AND [ID] = 2
“叶子”数据页可能以行 (1,2) 结尾,这意味着我们正在将带有已删除字段的记录加载到内存中,我们永远不会对此感兴趣。
但如果索引在 Deleted,ID 列中,则数据现在将是
2, false, 'hello w..'
4, false, 'just thin...'
1, true, 'the quick..'
3, true, 'stack m..'
现在,当我们在 SQL 加载页面时仅针对活动记录时,我们将拥有充满活动记录的页面。..
因此,在历史悠久且删除记录较多的数据库上,我们可以在所需记录上获得更好的局部性,并帮助 IO..
在数千个页面上,我们可以确保其中很大一部分永远不会加载到内存中,并且这些数据将始终只保留在磁盘上。
这个推理正确吗?这会影响(提高)大型数据库的整体性能吗?
【问题讨论】:
-
如果您正在执行大量删除,您可能需要考虑将已删除的记录移动到存档表中。根据删除的频率和性能,您可能希望使用触发器实时执行存档,或者如果性能是一个问题,您可以按计划(可能每周或每月)运行存档,然后重新组织聚集索引以释放空间。
标签: sql performance boolean paging indexing