窄索引与宽索引

lcw321321 2009-07-18 02:59:54
CREATE TABLE [dbo].[Table_1](
[a] [char](10) NOT NULL,
[b] [varchar](20) NOT NULL,
[c] [datetime] NOT NULL,
[d] [nchar](10) NULL)

假如在a列上建立了聚集索引

分别在列b,c,d 建立非聚集窄索引与在b,c,d 上建立一个组合的非聚集索引有那样优劣?
组合非聚集索引中如果不用到第一列的话就使用不到索引.那为什么还不如在字段上单独建立索引好点.据说覆盖索引是没有
组合索引来的快.但是这个比率大概是多少呢?产生这个原因又是什么呢?
最后其实想问的是,判断建组合索引和窄索引的依据是什么?

...全文
343 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaJiaBing 2009-07-18
  • 打赏
  • 举报
回复
CREATE TABLE [dbo].[Table_1](
[a] [char](10) NOT NULL,
[b] [varchar](20) NOT NULL,
[c] [datetime] NOT NULL,
[d] [nchar](10) NULL)

假如在a列上建立了聚集索引

分别在列b,c,d 建立非聚集窄索引与在b,c,d 上建立一个组合的非聚集索引有那样优劣?
组合非聚集索引中如果不用到第一列的话就使用不到索引.那为什么还不如在字段上单独建立索引好点.据说覆盖索引是没有
组合索引来的快.但是这个比率大概是多少呢?产生这个原因又是什么呢?
最后其实想问的是,判断建组合索引和窄索引的依据是什么?


联机丛书查查索引的用法...
feixianxxx 2009-07-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lcw321321 的回复:]
引用 5 楼 feixianxxx 的回复:
引用 4 楼 lcw321321 的回复:
不错,谢谢

回复楼上

表的主键、外键必须有索引;??
我感觉主键只是为了保证它的唯一性,因为有些主键如果是组合主键,没必要所有列都加到索引里面去吧?

主键上 你见好了 他强制会给你个索引 如果你原来表里没聚集索引 他就会给你个聚集索引 否则非聚集索引

其实强制建的那个索引是可以修改的,不过我猜微软为什么强制要这么做,还是应该有他莫大的好处.但为什么必须要这样呢?我就有点糊涂了
[/Quote]
呵呵 除非你把主键给侧掉 不然是弄不掉上面的索引的 不信你可以试试。。
lcw321321 2009-07-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feixianxxx 的回复:]
引用 4 楼 lcw321321 的回复:
不错,谢谢

回复楼上

表的主键、外键必须有索引;??
我感觉主键只是为了保证它的唯一性,因为有些主键如果是组合主键,没必要所有列都加到索引里面去吧?

主键上 你见好了 他强制会给你个索引 如果你原来表里没聚集索引 他就会给你个聚集索引 否则非聚集索引
[/Quote]
其实强制建的那个索引是可以修改的,不过我猜微软为什么强制要这么做,还是应该有他莫大的好处.但为什么必须要这样呢?我就有点糊涂了
feixianxxx 2009-07-18
  • 打赏
  • 举报
回复
外键的话 应该要坚持和其他表连接。所以最好也加上
feixianxxx 2009-07-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lcw321321 的回复:]
不错,谢谢

回复楼上

表的主键、外键必须有索引;??
我感觉主键只是为了保证它的唯一性,因为有些主键如果是组合主键,没必要所有列都加到索引里面去吧?
[/Quote]
主键上 你见好了 他强制会给你个索引 如果你原来表里没聚集索引 他就会给你个聚集索引 否则非聚集索引
lcw321321 2009-07-18
  • 打赏
  • 举报
回复
不错,谢谢

回复楼上

表的主键、外键必须有索引;??
我感觉主键只是为了保证它的唯一性,因为有些主键如果是组合主键,没必要所有列都加到索引里面去吧?
feixianxxx 2009-07-18
  • 打赏
  • 举报
回复
1.表的主键、外键必须有索引; 
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
Andy__Huang 2009-07-18
  • 打赏
  • 举报
回复
建立什么索引?
主要看你的查询where后面的条件字段是什么字段?
只有where后面用到的字段,才有必要建立索引;
where后面用不到的字段你也建立索引是没有用的,而且还有可能有反作用

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧