今天接到一个任务, 将在大约二十几个数据库中运行以下的两个SQL来取某个值, 这个表很大, 大约快100个G了, 因此是一件不小的任务.
SELECT /*+ FULL(T) PARALLEL(T,4) */ COUNT(*)
FROM BIGTABLE T
WHERE COL1 < 1000000000
AND ......
/
SELECT /*+ FULL(T) PARALLEL(T,4) */ COUNT(*)
FROM BIGTABLE T
WHERE COL1 > 1000000000
AND ......
/
因此我将这两个SQL进行合并, 这样的话只需要运行一次全表扫描就行了, 在时间上节约上一半, DBA在接到一些任务时, 在做之前需要思考一下, 看看可不可以不改变语义的情况下, 使SQL更有效率地运行, 不能总说开发人员提供的SQL效率不行.
SELECT /*+ FULL(T) PARALLEL(T,4) */
SIGN(COL1 - 1000000000), COUNT(*)
FROM BIGTABLE T
WHERE ......
GROUP BY SIGN(COL1 - 1000000000)
/
如果你能在应用正式跑之前, 改掉很多不好的SQL的话, 就是DBA价值的一个重大体现.
留言 (3)
不错,独出心裁。。。
Posted by xzh | Sep 18, 2006 4:46 PM
这种情况
我习惯用 sum(case when .. then 1 else 0 ) 来做……
Posted by rollingpig | Sep 26, 2006 11:50 AM
好方法!其实有的时候,精细之处更体现水平 !
Posted by songhefei | Sep 30, 2006 6:12 PM