送分题 本帖最后由 named_fish 于 2012-02-01 15:04:55 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 意思是你的update要加where子句,不能更新整个表。“在向表写入“Preferred”标志前,它会用订单金额条件对每一行进行检查,满足条件的才会更新,性能的提升是惊人的。”估计这篇文章是从国外翻译的。 case与decode函数作用相似。通过查询时的判断来优化SQL性能一个简单的例子UPDATE CustomerSET CustomerRank= CASE WHEN amount>=10 THEN 'Preferred' END; set CustomerRank=..where amount>=10 根据习惯,这样写的多些。 这个用case和后面加个where 有区别么?能具体说说底原理么??? 这用where 和用 case 的底层有啥区别啊 楼主说的用case 代替 update你们回复的貌似都是 case 代替了where貌似不是楼主说的那东西吧。。这个。。求解释啊 但是有个问题,这样做的话会更新整个表,只不过将满足条件的记录的数值改变了而已。手边每有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的量肯定是一点都没有降那么他说效率提高了,那个地方提高了呢?? 底层的东西真的很有吸引力,尤其是优化的时候。我也想知道,静候大牛出现~~这帖里说的http://tech.it168.com/a2010/0428/879/000000879859.shtml而且被转的到处都是也不知道出处了,找个问的地方都没有,悲催的我。。 要更新一条记录,我们立即会想到update,这个问题非常常见,许多开发人员经常忽视这个原则,因为使用update看起来非常自然,非常合乎逻辑。 假设你从Customer表中提取记录,你想将超过10万美元的订单标记为“Preferred”,因此你会想到使用一条update语句将CustomerRank列更新为“Preferred”,问题是update语句是有日志的,这就意味着每条记录它会写两次,解决这个问题的办法就是在SQL查询中内嵌case语句,在向表写入“Preferred”标志前,它会用订单金额条件对每一行进行检查,满足条件的才会更新,性能的提升是惊人的。说的是不是这个意思啊看这句话,假设你从Customer表中提取记录,提取不是更新这样的话,查询肯定不写日志吧,这个也不用回滚什么的,也不怕断电。SELECT xxx,(CASE WHEN 钱数 > 10 THEN "Preferred" END) CustomerRankFROM Customer;但是还是觉得欠妥 Oracle Data Miner可以运行在Oracle Express上吗? Oracle update特别慢,比insert慢很多很多 oracle用指定的时间做查询条件怎么查不出数据。 请问在EXECUTE IMMEDIATE中如何使用带有引号的函数? mssql转oracle建表 跪求一个存储过程(在线等) 请问我怎么用plsql将对一个表空间的某个对象的访问权利给另一个表空间 简单问题 请高手翻译一下.急!!!(捎后将送出200分) 关于触发器! 初学oracle oracle 导入时遇到的问题
一个简单的例子UPDATE Customer
SET CustomerRank=
CASE WHEN amount>=10 THEN 'Preferred'
END;
where amount>=10 根据习惯,这样写的多些。
能具体说说底原理么???
你们回复的貌似都是 case 代替了where貌似不是楼主说的那东西吧。。
这个。。求解释啊
但是有个问题,这样做的话会更新整个表,只不过将满足条件的记录的数值改变了而已。
手边每有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的量肯定是一点都没有降
那么他说效率提高了,那个地方提高了呢??
这帖里说的http://tech.it168.com/a2010/0428/879/000000879859.shtml
而且被转的到处都是也不知道出处了,找个问的地方都没有,悲催的我。。
看这句话,假设你从Customer表中提取记录,提取不是更新
这样的话,查询肯定不写日志吧,这个也不用回滚什么的,也不怕断电。
SELECT xxx,(CASE WHEN 钱数 > 10 THEN "Preferred" END) CustomerRank
FROM Customer;但是还是觉得欠妥