如何决定何时在表列上使用索引

Fan*_*nda 18 sql indexing sql-server-2005 sql-server-2008 firebird2.5

我什么时候应该在桌子上使用索引?

  1. 从多少行索引有意义?
  2. 如果我有持续行的表,只是编辑了来的列(不在'where'子句中),即使表只有大约15行,也会使索引有意义吗?编辑:在这种情况下,非索引选择/阅读比索引读取更有效吗?

编辑:现在我正在使用firebird 2.5,但大多数时候我使用的是SQL Server 2005/2008.

mar*_*c_s 30

一般来说,我的索引策略是这样的(我现在只使用SQL Server - 根据需要适应您自己的数据库系统):

  • 选择一个好的聚类键 - 不是GUID,而不是一个VARCHAR(250)或者什么 - 一个好的聚类键是狭窄的,独特的,稳定的,不断增加的 - 类似于一个INT IDENTITY完美的东西.使这成为您的群集主键 - >为您提供表格上的第一个索引

  • 对于任何用作外键的列到另一个表中 - 添加索引.它可以是单个列索​​引 - 或者它可能是复合索引 - 无论哪种方式最适合您的情况.重要的是外键列是该索引中的第一列(如果您使用的是复合索引) - 否则,JOIN系统将无法使用或检查参照完整性的好处

这就是现在.

然后:运行您的系统 - 观察并测量 - 建立基线.应用程序足够快吗?如果是 - >你已经完成了 - 回家享受你的业余时间.

如果没有:然后开始收集数据和指示,说明为什么应用程序不够快.例如,查看SQL Server中的DMV,告诉您性能最差的查询或缺少的索引DMV.分析那些.看看你可以改进什么.一次添加一个索引并再次:观察,测量,与基线进行比较.

如果您有改进 - >保留该指数并且此测量值是您的新基线.冲洗并重复,直到您(和您的用户)对应用程序的性能感到满意为止(然后回家享受休假).

SQL Server中的过度索引可能比没有任何索引更糟糕.不要从一开始就有太多的指数开始!只建立良好的聚类PK和外键非聚集索引 - 这就是全部 - 然后观察,测量,优化和重复该循环.

  • 提及在基线测试之间一次进行一次更改的+1. (4认同)

Die*_*ego 7

这是一个非常复杂的讨论,你必须记住几件事.主要是您不应该根据表中的行数来考虑索引,而是根据您针对它运行的查询.索引将仅帮助选择查询,同时它会略微降低插入,删除和更新的性能,因为除了更改表上的行之外,还必须更改索引.

你似乎是新问题,所以我建议你看看你的执行计划,并尝试消除所有"扫描"操作,因为他们几乎读取所有表甚至所有索引.你应该总是寻找寻求,但你应该平衡你在桌子上的索引数量.

如果您使用的是SQL Server,则可以使用SQL Server Profiler运行跟踪来帮助您

编辑:

在这种情况下,非索引选择/读取比索引读取更有效吗?

是的,但如果发生这种情况,引擎将足够聪明,不使用索引

  • 而我,我的答案:) (2认同)