如果我试图从查询中挤出最后一滴性能,那么我的联接使用这些类型的索引会有什么影响。
如果我通过并创建仅包含我的联接中涉及的列而没有其他内容的聚集索引,我会获得任何性能吗?
(我意识到我可能不得不从另一个索引移动聚集索引(使该索引非聚集),因为它只能有一个索引。)
答案 0 :(得分:2)
除了Gareth Saul的答案之外,还有一个小小的澄清:
非聚集索引重复 包含字段,指向 行,具有该值。
指向实际数据值的指针是群集密钥中的列(或列集)。
这是为什么你应该尝试保持群集密钥小而静态的主要原因之一 - 小,因为否则你会浪费大量空间,磁盘和服务器的RAM,以及静态,因为否则,你会如果您的值发生变化,我们不仅要更新您的群集索引,还要更新所有非群集索引。
此“查找指针是群集密钥”功能自版本7以来一直在SQL Server中,Kim Tripp will explain in great detail here:
什么是聚集索引?
在SQL Server 7.0及更高版本中 内部依赖关系 群集密钥已更改。 (是的,它就是 重要的是要知道事情变了 在7.0 ...为什么?因为还有 有些人没有 意识到如何改变RADICAL 发生在内部(wrt to the SQL Server 7.0中的群集密钥)。
群集的变化是什么 key被用作“查找”值 来自非聚集索引。
答案 1 :(得分:1)
您只能获得一个聚簇索引 - 这是控制磁盘/内存中表的物理存储的原因。
非聚簇索引重复包含的字段,并指向具有该值的行。对连接中使用的列建立索引应该可以提高性能。您可以通过在索引中使用“包含的列”进一步优化 - 这会将行信息直接复制到索引中,这可以消除必须查找行本身以执行选择的性能损失。
注意连接发生的顺序很有用 - 索引中的列顺序应该与此匹配。请记住,SQL引擎可能会在内部优化和重新排序查询 - 分析可能会有所帮助。
在大多数情况下,您可以使用数据库引擎优化顾问 - 它提供的建议非常适合。
答案 2 :(得分:1)
如果您最好的选择是非聚集索引,其中包含您的联接的所有元素,如果可能,您选择的字段。
这将创建一个生成索引,这意味着SQL需要执行的所有字段都在一个索引上。
如果可能的话,索引中没有unnessasery字段。添加的每个字段都会使单个索引记录变大,每个索引记录越小,每个页面中的记录越多。每页中获得的索引项越多,您访问磁盘的次数就越少。
聚集索引 - 表示该表是按索引中指定的顺序布局的,这意味着您将从TABLE中获得更好的性能,其中INDEXFIELD = 3.除非您选择这不应该是大量的大数据项。
答案 3 :(得分:1)
如果我通过并创建仅包含我的联接中涉及的列的聚集索引而没有其他内容,我会获得任何性能吗?
不是我理解的。聚集索引的要点是它然后对该索引周围的磁盘上的数据进行排序(因此为什么你只能拥有该索引),所以如果您的连接数据也没有被那些确切的列排序,我不会认为它会有所作为。另外,通过将可能更改的数据(而不是密钥)放入聚集索引中,您可以更有可能需要进行重建,从而减慢整个数据库的速度。
很抱歉,如果这听起来很愚蠢,但您是否尝试通过索引调整向导运行查询?在任何方面都不是万无一失的,但我过去曾经有过一些不错的改进。