总和与GROUP BY语句的优化

  

一。总和与GROUP BY语句的优化:

  

1。原语句为:
选择IID。INVENTORY_ITEM_ID,总和(IID.AVAILABLE_TO_PROMISE_DIFF)和(IID.QUANTITY_ON_HAND_DIFF)和(IID.ACCOUNTING_QUANTITY_DIFF)从BOSENT
。INVENTORY_ITEM_DETAIL IID
(IID。INVENTORY_ITEM_ID=' ? ')) GROUP BY IID.INVENTORY_ITEM_ID

  

SQL语句中使用集团的原因是select子句中有INVENTORY_ITEM_ID这个字段。

  

分析上面的SQL语句,INVENTORY_ITEM_ID作为在子句中的条件,它的值是已知的,无需从SQL中查询出来,所以可以把这个字段从select子句中去掉,同进去除GROUP BY子句. SQL可改写为:
选择总和(IID.AVAILABLE_TO_PROMISE_DIFF)和(IID.QUANTITY_ON_HAND_DIFF)和(IID.ACCOUNTING_QUANTITY_DIFF)从BOSENT
。INVENTORY_ITEM_DETAIL IID
(IID。INVENTORY_ITEM_ID=' ? '))

  

2。执行计划
(1)优化SQL语前句的执行计划(使用160001代替?的值,目的是看执行计划)
<强> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Id | |操作名称| | |行字节成本(% CPU) |时间|
<强> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SELECT语句| 0 | | | 1 | 19 | 8008 (1)| 00:01:37 |
| 1 |排序GROUP BY NOSORT | | 1 | 19 | 8008 (1) | 00:01:37 |
* | 2 |表访问全部| INVENTORY_ITEM_DETAIL | 670 k 12 | 8008 | (1) | 00:01:37 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * *

  

谓词信息(由操作id):
<强> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2 -过滤器(干净自己的“IID" INVENTORY_ITEM_ID"=' 160001 ')

  

<强>(2)优化SQL语前句的执行计划
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <强>
| Id | |操作名称| | |行字节成本(% CPU) |时间|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SELECT语句| 0 | | | 1 | 19 (1)| 8008 | 00:01:37 |
| 1 |总排序| | 1 | 19 | | |
| * 2 |表访问全部| INVENTORY_ITEM_DETAIL | 670 k 12 | 8008 | (1) | 00:01:37 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * * *

  

谓词信息(由操作id):
<强> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  

2 -过滤器(干净自己的“IID" INVENTORY_ITEM_ID"=' 160001 ')

  

3。执行计划分析
(1)排序(总)
排序(总)是指在没有集团的前提下,使用统计函数对全部数据对象进行运算时所显示出来的执行计划。在使用,计数,MIN,马克斯,AVG等统计函数时并不执行一般排序。而是在读取表中数据的同时以每一行数据为对象进行求和,AVG或者数也同样是以所读取的每一行数据为对象进行反复计算的。
总做排序为排序的选项之一比较特殊,它并不做排序,排序总作用于所有的数据集上。

  

那么MIN和MAX是如何进行计算的呢?其方法与上面所介绍的基本相同.MIN的执行方法为在最开始将所读取的第一个值记录下来,然后将该值与下一个读取的值进行比较,如果比该值小则将其替换。在执行该统计操作时如果可以使用索引,则能够获得非常好的效果。在该执行计划中虽然显示的是索引全扫描,但实际上,仅仅会读取第一个索引块,之后并不继续进行扫描(因为索引是排序的,因此索引列值的最小值必然在索引的第一个块上)。而马克思则是仅仅读取最后一个索引块。想要获得这样的执行计划,不能使用和GROUP BY,当然还要求所要进行统计的列必须是索引的先行列(如果是组合索引,则该列必须位于最前面),并且在选择列表中不能添加其他任何额外的操作要求。

  

(2)排序(集团)
该操作是将数据行向不同分组中聚集的操作,即依据查询语句中所使用的GROUP BY而进行的相关操作,为了进行分组就只能进行排序,因此所需分组的数据量越大则代价就越高。

总和与GROUP BY语句的优化