本帖最后由 named_fish 于 2012-02-01 15:04:55 编辑

解决方案 »

  1.   

    意思是你的update要加where子句,不能更新整个表。“在向表写入“Preferred”标志前,它会用订单金额条件对每一行进行检查,满足条件的才会更新,性能的提升是惊人的。”估计这篇文章是从国外翻译的。
      

  2.   

    case与decode函数作用相似。通过查询时的判断来优化SQL性能
    一个简单的例子UPDATE Customer
    SET CustomerRank= 
    CASE WHEN amount>=10 THEN 'Preferred'
      END;
      

  3.   

    set CustomerRank=..
    where amount>=10 根据习惯,这样写的多些。
      

  4.   

    这个用case和后面加个where 有区别么?
    能具体说说底原理么???
      

  5.   

    这用where 和用 case 的底层有啥区别啊
      

  6.   

    楼主说的用case 代替 update
    你们回复的貌似都是 case 代替了where貌似不是楼主说的那东西吧。。
    这个。。求解释啊
      

  7.   


    但是有个问题,这样做的话会更新整个表,只不过将满足条件的记录的数值改变了而已。
    手边每有Oracle 拿 MySQL实验的mysql> select count(*) from test2;
    +----------+
    | count(*) |
    +----------+
    |    12244 |
    +----------+
    1 row in set (0.03 sec)mysql> select count(*) from test2 where age = 6;
    +----------+
    | count(*) |
    +----------+
    |     6048 |
    +----------+
    1 row in set (0.03 sec)mysql> update test2 set age = case when age = 6 then 5 end;
    Query OK, 6048 rows affected (0.19 sec)
    Rows matched: 12244  Changed: 6048  Warnings: 0
    这就把所有数据都匹配了一遍,这I/O的量肯定是一点都没有降
    那么他说效率提高了,那个地方提高了呢??
      

  8.   

    底层的东西真的很有吸引力,尤其是优化的时候。我也想知道,静候大牛出现~~
    这帖里说的http://tech.it168.com/a2010/0428/879/000000879859.shtml
    而且被转的到处都是也不知道出处了,找个问的地方都没有,悲催的我。。
      

  9.   

    要更新一条记录,我们立即会想到update,这个问题非常常见,许多开发人员经常忽视这个原则,因为使用update看起来非常自然,非常合乎逻辑。  假设你从Customer表中提取记录,你想将超过10万美元的订单标记为“Preferred”,因此你会想到使用一条update语句将CustomerRank列更新为“Preferred”,问题是update语句是有日志的,这就意味着每条记录它会写两次,解决这个问题的办法就是在SQL查询中内嵌case语句,在向表写入“Preferred”标志前,它会用订单金额条件对每一行进行检查,满足条件的才会更新,性能的提升是惊人的。说的是不是这个意思啊
    看这句话,假设你从Customer表中提取记录,提取不是更新
    这样的话,查询肯定不写日志吧,这个也不用回滚什么的,也不怕断电。
    SELECT xxx,(CASE WHEN 钱数 > 10 THEN "Preferred" END) CustomerRank
    FROM Customer;但是还是觉得欠妥