sql-server – 关于在SQL Server上为各种查询创建单列索引

让我们假设一个像这样的表

[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,

查询非常灵活,但总是喜欢这种格式:
SELECT KEY FROM [TABLE] WHERE …

对于[int]类型,搜索条件在单列上几次,大多数时间在几列上,问题为BETWEEN或> =或< =,对于varchar,始终查询为=或IN [].所有条件都与AND连接 由于查询并不总是固定在同一列上,所以我想,如果我在每一列上创建INDEX,它会提高性能,还是只是浪费.

不要只在每一列创建索引 – 这是浪费时间和资源!

基本上,我的方法总是:

>在任何“普通”表上定义一个好的主键和聚类键(除了例如临时表等) – 这已经是一个很大的进步
>将非聚集索引放在任何外键列上 – 这些确实有很大帮助,特别是对于JOIN

就是这样!

然后:

>观察你的系统 – 看看事情进展缓慢
>衡量系统性能
>捕获服务器端跟踪以获得代表性工作负载
>分析该工作量,并查看哪些其他指数可能有所帮助
>做一次调整 – 一次调整
>一次又一次地测量,看看你是否提高了系统性能(或不提高)

您需要一个完整的,有代表性的工作负载来查看哪些查询真正常见且经常使用 – 并查看哪些索引可能对这些频繁查询有益.否则,您可能会为所有错误的查询提供索引帮助,实际上您可能会减慢速度……

你会惊讶地发现非聚集指数很少真正有用!

不要过度索引 – 与没有索引一样糟 – 如果不是更糟糕的话!可能会更糟糕,因为你所拥有的每一个指数都需要在其生命周期内得到维持……并且没有免费的午餐 – 甚至不在这里……

请参阅Kimberly Tripp关于该主题的优秀博客文章Indexes: just because you can doesn’t mean you should! – 非常有用,有很多见解.或者基本上,just read anything Kim has blogged on indexes – 她是索引女王,她在博客上发布的任何内容通常都非常有用且有益!

此外,根据SQL Server的查询优化器的意见,SQL Server 2005和更新版本提供了DMV(动态管理视图),允许您找出哪些索引未被使用(可以删除)或哪些索引丢失.有关详细信息,请参见SQL Server – Find missing and unused indexes.但请注意:这些都是动态视图 – 它们会在每个系统启动时重置并且可能不完全准确 – 不要只是做他们告诉你的所有事情 – 把所有事情都考虑在内并仔细考虑你做了什么 – 记录下来,如果事情变得更糟而不是更好,你可以撤消它!

相关文章
相关标签/搜索