none
请教 - select与update的效率问题 RRS feed

  • 问题

  • 表中有200万条数据
    执行 select c1 from table1 where c2 = xxx and c3 = xxxx 需要1秒左右
    执行 update c1 = 111, c4 = 444  where c2 = xxx and c3 = xxxx 需要很长的时间

    c2/c3已建索引

    请教,为什么update的性能如此低下?如何提升update的性能呢?

    多谢大家!

    2009年5月6日 15:41

答案

全部回复

  • 表上建立的索引有助于数据检索速度的提高,但是会降低INSERT/UPDATE/DELETE操作的速度。如果一次性需更新的数据很多的话可以考虑先删除索引,然后执行更新语句,再重建索引
    知识改变命运,奋斗成就人生!
    • 已建议为答案 Stone Z 2009年5月6日 17:16
    2009年5月6日 16:23
  • 表上建立的索引有助于数据检索速度的提高,但是会降低INSERT/UPDATE/DELETE操作的速度。如果一次性需更新的数据很多的话可以考虑先删除索引,然后执行更新语句,再重建索引
    知识改变命运,奋斗成就人生!

    错。

    如果你在c2,c3创建了索引,在执行‘update c1 = 111, c4 = 444  where c2 = xxx and c3 = xxxx ’时sqlserver会利用到这个索引进行数据的搜索,从而提高更新速度。
    由于没有对索引列进行跟新,并不会影响速度。

    楼主,你的c2,c3是怎么建的索引? 还有查看一下在执行update是是否使用了索引
    SQL SERVER Engine Test
    2009年5月7日 2:09
    版主
  • Index on c2 and c3 can help that update statement but index on c1 and c4 will hurt it. 
    2009年5月7日 2:12
  • 同意rmaio的看法。 检查一下c1和c4列上是否也建有单独索引或复合索引?那会严重影响update的性能的。

    2009年5月7日 2:20
  • 我在這問個問題,就不另外開貼了。

    怎樣決定在什么情況下使用聚簇索引,什么情況下使用非聚簇索引,還有就是復合索引?

    當然我知道在一個表中只能有一個聚簇索引。
    2009年5月7日 6:08
  • 1. 用clustered index查询满足某一范围的记录
    2. 用non-clustered index查询某一特定值的记录,前提是这个索引的选择性要高
    2009年5月7日 6:15
  • 1. 用clustered index查询满足某一范围的记录
    2. 用non-clustered index查询某一特定值的记录,前提是这个索引的选择性要高

    也就是說聚簇索引一般用在選擇性不高的列上
     而非聚簇索引一般用在選擇性高的列上?
    2009年5月7日 6:19
  • 是的!但也不绝对。 又比如如果你的表主要提供用主键来进行where条件查询,而不提供对其他列的where条件查询。你当然可以在主键上建立clustered index
    2009年5月7日 6:28
  • 在where条件中如果指定多字段,用复合索引是个不错的选择!

    2009年5月7日 6:33
  • 是的!但也不绝对。 又比如如果你的表主要提供用主键来进行where条件查询,而不提供对其他列的where条件查询。你当然可以在主键上建立clustered index

    好的 明白  TKS
    2009年5月7日 6:33
  • 多谢,多谢,我有点明白了

    2009年5月7日 15:10
  • 这两种索引还有其他的区别吗?谢谢。

    2009年5月7日 15:11
  • Index on c2 and c3 can help that update statement but index on c1 and c4 will hurt it. 

    我应该是犯了这种错误。谢谢!
    2009年5月7日 15:13
  • Index on c2 and c3 can help that update statement but index on c1 and c4 will hurt it. 

    我应该是犯了这种错误。谢谢!

    查看一下执行计划,就更确定了
    SQL SERVER Engine Test
    2009年5月7日 15:16
    版主