索引可以根据不同字段组合创建吗?

高原山顶的大风车 2014-01-23 10:31:58

我使用优化顾问工具分析后,优化顾问给出建议,要在一个表上创建多个索引。

如:积分账户表

ID  主账户号 积分类型   积分
1  1001    消费积分   100000
2  1001    赠送积分   100
3  1002    消费积分   120000
4  1002    赠送积分   120


在使用中,会查询一个主账户号的总积分、某类型的积分


优化顾问给出建议分别创建如下索引:
CREATE STATISTICS [_dta_stat_658101385_3_1] ON [dbo].[积分账户表]([主账户号], [ID])

CREATE STATISTICS [_dta_stat_658101385_3_2_1] ON [dbo].[积分账户表]([主账户号], [积分类型], [ID])


是否有必要创建两个索引?

为什么创建索引需要与ID组合,ID是自增长主健,查询中很少会使用这个ID进行条件指定?
...全文
198 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 17 楼 sweiquan 的回复:
如前所述,   为了完成多个类型的循环比较,还在存储过程中使用了游标。  我认为采用游标不是很恰当。  现在积分类型总量有限,最多5个。  在存储过程中使用if语句从1到5分别处理,就是多写几行sql,看起来不美观。
最好少用游标,除非是逻辑特别复杂的。 游标的这种处理方式,是循环,比较慢
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
2005以上可以用CTE来循环,没必要高游标
  • 打赏
  • 举报
回复
如前所述,   为了完成多个类型的循环比较,还在存储过程中使用了游标。  我认为采用游标不是很恰当。  现在积分类型总量有限,最多5个。  在存储过程中使用if语句从1到5分别处理,就是多写几行sql,看起来不美观。
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 14 楼 sweiquan 的回复:
[quote=引用 9 楼 yupeigu 的回复:] [quote=引用 8 楼 sweiquan 的回复:] [quote=引用 3 楼 yupeigu 的回复:] 你的表就 4个字段吗:ID  主账户号 积分类型   积分
是的,这个表就4个字段。[/quote] 你的语句是不是类似这样的: select sum(积分) from 积分账户表 where 主账户号 = 'xxx' and 积分类型='yyy' [/quote] 实际使用中我们不会进行sum统计。 在存储过程中使用的查询是: select 积分类型,积分 from 积分账户表 p inner join 积分类型表 t on p.积分类型=t.积分类型 where 主账户号 = 'xxx' order by t.优化顺序 业务需求是:查找出用户的所有类型积分,然后按优化顺序扣减积分 所以,存储过程中会按优化顺序查询出所有类型积分,然后再比较单个类型积分余额是否足够,足够就扣减,不足再从下一次类型积分扣。 -- 我在想是否有必要在积分账户表直接标记优化顺序,那样就不需要联接积分类型表进行查询了。 [/quote] 那就按照主账户字段建个索引把: create index idx_xxx on 积分账户表(主账户号)
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
适当的使用空间换时间的思路是可以的,不过order by的开销会根据你的表数量逐步增大
  • 打赏
  • 举报
回复
引用 9 楼 yupeigu 的回复:
[quote=引用 8 楼 sweiquan 的回复:] [quote=引用 3 楼 yupeigu 的回复:] 你的表就 4个字段吗:ID  主账户号 积分类型   积分
是的,这个表就4个字段。[/quote] 你的语句是不是类似这样的: select sum(积分) from 积分账户表 where 主账户号 = 'xxx' and 积分类型='yyy' [/quote] 实际使用中我们不会进行sum统计。 在存储过程中使用的查询是: select 积分类型,积分 from 积分账户表 p inner join 积分类型表 t on p.积分类型=t.积分类型 where 主账户号 = 'xxx' order by t.优化顺序 业务需求是:查找出用户的所有类型积分,然后按优化顺序扣减积分 所以,存储过程中会按优化顺序查询出所有类型积分,然后再比较单个类型积分余额是否足够,足够就扣减,不足再从下一次类型积分扣。 -- 我在想是否有必要在积分账户表直接标记优化顺序,那样就不需要联接积分类型表进行查询了。
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
优化器要根据统计信息,然后选择表上哪个索引(如果有多个索引)更加适合这个查询,统计信息的准确性直接影响查询的性能,另外统计信息是描述你表上数据的数据,通过统计信息,优化器可以知道大概你的查询要返回多少数据、where条件中所需的数据大概在表的什么地方等等信息,极其重要
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 11 楼 sweiquan 的回复:
[quote=引用 2 楼 DBA_Huangzj 的回复:] 你那个是统计信息啊,不是索引啊
开始没有留意。   创建这个统计信息有什么用处?[/quote] 其实就是有利于sql server产生比较好的执行计划。
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
你那个是统计信息啊,不是索引啊
开始没有留意。   创建这个统计信息有什么用处?
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
你的查询是怎样的?
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 8 楼 sweiquan 的回复:
[quote=引用 3 楼 yupeigu 的回复:] 你的表就 4个字段吗:ID  主账户号 积分类型   积分
是的,这个表就4个字段。[/quote] 你的语句是不是类似这样的: select sum(积分) from 积分账户表 where 主账户号 = 'xxx' and 积分类型='yyy'
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
你的表就 4个字段吗:ID  主账户号 积分类型   积分
是的,这个表就4个字段。
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
DTA给出的建议并不总是对的
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 1 楼 sweiquan 的回复:
还给出了以下索引建议: CREATE NONCLUSTERED INDEX [_dta_index_BCardPurses_16_658101385__K2_4] ON [dbo].[积分账户表] ( [积分类型] ASC ) INCLUDE ( [积分]) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY] CREATE STATISTICS [_dta_stat_658101385_2_1] ON [dbo].[积分账户表]([积分类型], [ID])
这个索引,不太合理吧,你是要查询某个主账户的 积分,那么就应该是: CREATE NONCLUSTERED INDEX [_dta_index_BCardPurses_16_658101385__K2_4] ON [dbo].[积分账户表] ( 主账户号,[积分类型] ASC ) INCLUDE ( [积分])
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
建立那个索引是因为你的原有索引无法覆盖查询
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
统计信息根据索引、查询来分析,可以建立多个。
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
你的表就 4个字段吗:ID  主账户号 积分类型   积分
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
你那个是统计信息啊,不是索引啊
  • 打赏
  • 举报
回复
还给出了以下索引建议: CREATE NONCLUSTERED INDEX [_dta_index_BCardPurses_16_658101385__K2_4] ON [dbo].[积分账户表] ( [积分类型] ASC ) INCLUDE ( [积分]) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY] CREATE STATISTICS [_dta_stat_658101385_2_1] ON [dbo].[积分账户表]([积分类型], [ID])

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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