通过改变SQL来简化工作, 减轻工作量(一)

    今天接到一个任务, 将在大约二十几个数据库中运行以下的两个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)

不错,独出心裁。。。

这种情况
我习惯用 sum(case when .. then 1 else 0 ) 来做……

好方法!其实有的时候,精细之处更体现水平 !

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Go straight ahead and turn left at the second crossing.
  • 一直往前走, 在第二个十字路口往左拐.
  • Excuse me. Can you tell me how to get to Mr. Hu's restaurant?
  • 对不起, 你能告诉我怎么去胡先生的餐馆吗?
  • Go on for about 100 meters. It's on your left side. You can't miss it.
  • 往前走约100米, 在你左手边, 你不会错过的.
  • Which one is Mr. Jame's office?
  • 哪间是詹姆司先生的办公室?
  • It's Room 201 on the second floor.
  • 二楼201房间.