SQL Server索引最佳实践(SQL Server 2008)

use*_*969 5 sql-server indexing sql-server-2008

我对选择正确的索引有一些疑问,并有一些问题:

聚集索引

什么是最佳人选?

通常是主键,但如果主键未在搜索中使用,例如CustomerNo用于搜索客户应该聚集索引CustomerNo吗?

使用SchemaBinding的视图

如果有一个带索引的视图,我读到这些不被使用但是那些在表上.

毫无意义?或者我错过了这一点?使用"NOExpand"强制从视图而不是表中读取索引会有所不同吗?

非聚集索引

添加非聚集索引以包含每个可能的列,直到达到限制为止,这是一种很好的做法吗?

非常感谢你的时间.我正在阅读海量数据库,速度是必须的

mar*_*c_s 9

聚簇索引是(a)中定义的表的存储布局的索引在该表上的每一个非聚集索引(表数据是由聚集键物理排序),和(b)被用作"行定位器" .

因此,聚集索引应该是

  • 窄(4字节是理想的,8字节可以 - 其他任何东西太多)
  • unique(如果不使用唯一的聚簇索引,SQL Server将为您的表添加一个4字节的唯一符号)
  • 静态(不应该改变)
  • 最佳的应该是不断增加
  • 固定 - 例如,不要Varchar(x)在聚集索引中使用大列

出于这些要求,INT IDENTITY似乎是最合乎逻辑,最明显的选择.不要使用可变长度列,不要使用多列(如果可能的话),不要使用GUID(由于它的大小和随机性,这是一个非常糟糕的选择)

有关群集密钥和聚簇索引的更多背景信息 - 阅读Kimberly Tripp发布的所有内容!她是SQL Server 索引女王 - 她非常了解她的东西!

参见例如这些博客文章:

一般来说:不要过度索引!太多的指数往往比没有更糟糕!

对于非聚集索引:我通常会索引外键列 - 这些索引有助于JOIN和其他操作,并使事情更快.

除此之外:不要在数据库中放置太多索引!必须在桌面上的每个CRUD操作上维护每个索引!这是开销 - 不要过度索引!

包含所有列的索引是一个特别糟糕的主意,因为它实际上不能使用太多 - 但是会带来很多管理开销.

运行您的应用程序,对其进行概要分析 - 查看哪些操作很慢,尝试通过向表中添加一些选择性索引来优化这些操作.