Eri*_*Yin 4 sql-server indexing
让我们假设一个像这样的表
[KEY] [int] NOT NULL,
[INT1] [int] NULL,
[INT2] [int] NULL,
[INT3] [int] NULL,
[STR1] [varchar](20) NULL,
[STR2] [varchar](20) NULL,
[STR3] [varchar](20) NULL,
Run Code Online (Sandbox Code Playgroud)
查询非常灵活,但总是喜欢这种格式:
SELECT KEY FROM [TABLE] WHERE...
搜索条件在单列上几次,大多数时间在几列上,对于[int]type,quesy as BETWEEN或>=or <=,for varchar,始终查询为=或IN [].所有条件都与之相关AND
由于查询并不总是固定在同一列上,所以我想,如果我INDEX在每一列创建,它会提高性能,还是只是浪费.
不要只在每一列创建索引 - 这是浪费时间和资源!
基本上,我的方法总是:
在任何"普通"表上定义一个好的主键和聚类键(除了例如临时表等) - 这已经是一个很大的进步
将非聚集索引放在任何外键列上 - 这些确实有很大帮助,特别是对于JOIN
就是这样!
然后:
您需要一个完整的,有代表性的工作负载来查看哪些查询真正常见且经常使用 - 并查看哪些索引可能对这些频繁查询有益.否则,您可能会为所有错误的查询提供索引帮助,实际上您可能会减慢速度......
你会惊讶地发现非聚集指数很少真正有用!
不要过度索引 - 与没有索引一样糟 - 如果不是更糟糕的话!可能会更糟糕,因为你所拥有的每一个指数都需要在其生命周期内得到维持 ......并且没有免费的午餐 - 甚至不在这里......
请参阅Kimberly Tripp的优秀博客文章索引:只是因为你的意思并不代表你应该这样做!关于这个主题 - 非常有帮助,很多见解.或者基本上,只要阅读Kim在索引上写博客的任何内容 - 她是索引女王,她在博客上发布的任何内容通常都非常有用且有益!
此外,根据SQL Server的查询优化器的意见,SQL Server 2005和更新版本提供了DMV(动态管理视图),允许您找出哪些索引未被使用(可以删除)或哪些索引丢失.请参阅SQL Server - 查找缺失和未使用的索引以获取更多详细信息 但请注意:这些是动态视图 - 它们会在每个系统启动时重置,并且可能不完全准确 - 不要只是做他们告诉你的所有事情 - 把所有事情都考虑一下并仔细考虑你做了什么 - 记录下来,如果事情变得更糟而不是更好,你可以撤消它!