menghang
发表于 2011-3-4 13:35:58
count(*)
比count(1)稍快
,
当然如果可以通过索引检索,对索引列的计数仍旧是最快的。
例如 COUNT(EMPNO)
menghang
发表于 2011-3-4 13:38:23
用Where子句替换HAVING子句
避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤。 这个处理需要排序,总计等操作。 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。
例如:
低效:
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION REGION != ‘SYDNEY’
AND REGION != ‘PERTH’
高效
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
WHERE REGION REGION != ‘SYDNEY’
AND REGION != ‘PERTH’
GROUP BY REGION
(HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等。 除此而外,一般的条件应该写在WHERE子句中)
menghang
发表于 2011-3-4 13:39:48
减少对表的查询
在含有子查询的SQL语句中,要特别注意减少对表的查询。
例如:
低效
SELECT TAB_NAME
FROM TABLES
WHERE TAB_NAME = ( SELECT TAB_NAME
FROM TAB_COLUMNS
WHERE VERSION = 604)
AND DB_VER= ( SELECT DB_VER
FROM TAB_COLUMNS
WHERE VERSION = 604)
高效
SELECT TAB_NAME
FROM TABLES
WHERE (TAB_NAME,DB_VER)
= ( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS
WHERE VERSION = 604)
Update 多个Column 例子:
低效:
UPDATE EMP
SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
高效:
UPDATE EMP
SET (EMP_CAT, SAL_RANGE)
= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)
FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
menghang
发表于 2011-3-4 13:44:55
用IN来替换OR
下面的查询可以被更有效率的语句替换:
低效:
SELECT…
FROM LOCATION
WHERE LOC_ID = 10
OR LOC_ID = 20
OR LOC_ID = 30
高效:
SELECT…
FROM LOCATION
WHERE LOC_IN IN
(10,20,30);
按:这是一条简单易记的规则,但是实际的执行效果还须检验,在ORACLE8i下,两者的执行路径似乎是相同的。
conquerme
发表于 2011-8-7 09:20:17
3x
qianshi
发表于 2011-8-16 16:04:53
收藏了
stone-石头
发表于 2011-12-9 16:07:26
3ks,无私啊:lol
zm5819
发表于 2011-12-12 21:25:53
不错顶
model_model
发表于 2011-12-16 16:13:07
下载了~谢谢
jaa104
发表于 2012-1-4 11:10:54
感谢 楼主分享
928930885
发表于 2012-2-1 17:19:16
:handshake