[20250526]SORT GROUP BY与HASH GROUP BY.txt

打印 上一主题 下一主题

主题 1892|帖子 1892|积分 5676

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
[20250526]SORT GROUP BY与HASH GROUP BY.txt

--//我记忆里大约在10g开始oracle的group by采用hash group by算法,其效果就是其效果集不再按照group by字段排序,也提醒一些
--//开发人员必须显示控制排序方式,可以通过提示USE_HASH_AGGREGATION/NO_USE_HASH_AGGREGATION来控制采用的算法。做一个例子说
--//明一些细节,有时候采用hash group by算法并不是最佳的情况:

1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

SCOTT@book01p> @ sqlhintz "sort_agg|hash_agg"
NAME                    SQL_FEATURE CLASS                INVERSE                 TARGET_LEVEL PROPERTY VERSION        VERSION_OUTLINE CON_ID
----------------------- ----------- -------------------- ----------------------- ------------ -------- -------------- --------------- ------
USE_HASH_AGGREGATION    QKSFM_ALL   USE_HASH_AGGREGATION NO_USE_HASH_AGGREGATION            2        0 10.2.0.1       10.2.0.5             0
NO_USE_HASH_AGGREGATION QKSFM_ALL   USE_HASH_AGGREGATION USE_HASH_AGGREGATION               2        0 10.2.0.1       10.2.0.5             0

2.测试:
SCOTT@book01p> create table t1 as select * from all_objects;
Table created.
--//分析表略。

SCOTT@book01p> @ sl all
alter session set statistics_level = all;

Session altered.

SCOTT@book01p> Select object_type,sum(object_id),avg(object_id),count(*) from  t1 group by object_type;
OBJECT_TYPE                    SUM(OBJECT_ID) AVG(OBJECT_ID)   COUNT(*)
------------------------------ -------------- -------------- ----------
INDEX                                47963848     20110.6281       2385
TABLE                                46586395      19435.292       2397
CLUSTER                                  3127          312.7         10
EDITION                                   134            134          1
SYNONYM                             451440006     37346.1289      12088
SEQUENCE                              5405583     51481.7429        105
DIRECTORY                              198343     18031.1818         11
PACKAGE                              30372636     37636.4758        807
VIEW                                114811847     15025.7619       7641
FUNCTION                             23268633     57171.0885        407
PROCEDURE                             3958952     43988.3556         90
TYPE                                 77026974     34775.1576       2215
OPERATOR                              3005473     50091.2167         60
TABLE PARTITION                      23209585     40224.5841        577
INDEX PARTITION                      29357424     79775.6087        368
TYPE BODY                             7464132     66054.2655        113
TABLE SUBPARTITION                     512080        16002.5         32
PACKAGE BODY                         20327004     57583.5807        353
LIBRARY                               3731825     52560.9155         71
CONSUMER GROUP                         378585        21032.5         18
JOB CLASS                               63169     21056.3333          3
DESTINATION                             42133        21066.5          2
SCHEDULE                                85012          21253          4
WINDOW                                 190681     21186.7778          9
SCHEDULER GROUP                         84768          21192          4
EVALUATION CONTEXT                      67978     22659.3333          3
TRIGGER                               7458043     51791.9653        144
RULE SET                                92298        23074.5          4
XML SCHEMA                            1753783     44968.7949         39
INDEXTYPE                              654696     59517.8182         11
JAVA CLASS                         1701232733      44526.729      38207
JAVA RESOURCE                       100771276     58965.0532       1709
JAVA DATA                             1168076     68710.3529         17
JAVA SOURCE                            264798          88266          3
34 rows selected.

SCOTT@book01p> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  43vzz3p38fqdy, child number 0
-------------------------------------
Select object_type,sum(object_id),avg(object_id),count(*) from  t1
group by object_type
Plan hash value: 136660032
---------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |       |   415 (100)|          |     34 |00:00:00.01 |    1479 |
|   1 |  HASH GROUP BY     |      |      1 |     34 |   510 |   415   (2)| 00:00:01 |     34 |00:00:00.01 |    1479 |
|   2 |   TABLE ACCESS FULL| T1   |      1 |  69908 |  1024K|   412   (1)| 00:00:01 |  69908 |00:00:00.01 |    1479 |
---------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   2 - SEL$1 / "T1"@"SEL$1"
21 rows selected.
--//缺省采用HASH GROUP BY,注意看输出效果并没有按照OBJECT_TYPE排序。

--//给sql语句参加order by 1;后:
SCOTT@book01p> Select object_type,sum(object_id),avg(object_id),count(*) from  t1 group by object_type order by 1;
OBJECT_TYPE                    SUM(OBJECT_ID) AVG(OBJECT_ID)   COUNT(*)
------------------------------ -------------- -------------- ----------
CLUSTER                                  3127          312.7         10
CONSUMER GROUP                         378585        21032.5         18
DESTINATION                             42133        21066.5          2
DIRECTORY                              198343     18031.1818         11
EDITION                                   134            134          1
EVALUATION CONTEXT                      67978     22659.3333          3
FUNCTION                             23268633     57171.0885        407
INDEX                                47963848     20110.6281       2385
INDEX PARTITION                      29357424     79775.6087        368
INDEXTYPE                              654696     59517.8182         11
JAVA CLASS                         1701232733      44526.729      38207
JAVA DATA                             1168076     68710.3529         17
JAVA RESOURCE                       100771276     58965.0532       1709
JAVA SOURCE                            264798          88266          3
JOB CLASS                               63169     21056.3333          3
LIBRARY                               3731825     52560.9155         71
OPERATOR                              3005473     50091.2167         60
PACKAGE                              30372636     37636.4758        807
PACKAGE BODY                         20327004     57583.5807        353
PROCEDURE                             3958952     43988.3556         90
RULE SET                                92298        23074.5          4
SCHEDULE                                85012          21253          4
SCHEDULER GROUP                         84768          21192          4
SEQUENCE                              5405583     51481.7429        105
SYNONYM                             451440006     37346.1289      12088
TABLE                                46586395      19435.292       2397
TABLE PARTITION                      23209585     40224.5841        577
TABLE SUBPARTITION                     512080        16002.5         32
TRIGGER                               7458043     51791.9653        144
TYPE                                 77026974     34775.1576       2215
TYPE BODY                             7464132     66054.2655        113
VIEW                                114811847     15025.7619       7641
WINDOW                                 190681     21186.7778          9
XML SCHEMA                            1753783     44968.7949         39
34 rows selected.

SCOTT@book01p> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  db1k70a7favpv, child number 0
-------------------------------------
Select object_type,sum(object_id),avg(object_id),count(*) from  t1
group by object_type order by 1
Plan hash value: 3946799371
------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |       |   415 (100)|          |     34 |00:00:00.02 |    1479 |       |       |          |
|   1 |  SORT GROUP BY     |      |      1 |     34 |   510 |   415   (2)| 00:00:01 |     34 |00:00:00.02 |    1479 |  4096 |  4096 | 4096  (0)|
|   2 |   TABLE ACCESS FULL| T1   |      1 |  69908 |  1024K|   412   (1)| 00:00:01 |  69908 |00:00:00.01 |    1479 |       |       |          |
------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   2 - SEL$1 / "T1"@"SEL$1"
21 rows selected.
--//执行语句参加order by后,采用SORT GROUP BY算法,注意看输出效果按照OBJECT_TYPE字段排序。

3.尝试参加提示:
--//给有order by 字段的语句参加USE_HASH_AGGREGATION提示
SCOTT@book01p> Select /*+ USE_HASH_AGGREGATION */ object_type,sum(object_id),avg(object_id),count(*) from  t1 group by object_type order by 1;
--//输出略。

SCOTT@book01p> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  a6k9ajfah8vr0, child number 0
-------------------------------------
Select /*+ USE_HASH_AGGREGATION */ object_type,sum(object_id),avg(object
_id),count(*) from  t1 group by object_type order by 1
Plan hash value: 2808104874
-------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |       |   415 (100)|          |     34 |00:00:00.01 |    1479 |       |       |          |
|   1 |  SORT ORDER BY      |      |      1 |     34 |   510 |   415   (2)| 00:00:01 |     34 |00:00:00.01 |    1479 |  4096 |  4096 | 4096  (0)|
|   2 |   HASH GROUP BY     |      |      1 |     34 |   510 |   415   (2)| 00:00:01 |     34 |00:00:00.01 |    1479 |  1264K|  1264K|          |
|   3 |    TABLE ACCESS FULL| T1   |      1 |  69908 |  1024K|   412   (1)| 00:00:01 |  69908 |00:00:00.01 |    1479 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   3 - SEL$1 / "T1"@"SEL$1"
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1
---------------------------------------------------------------------------
   1 -  SEL$1
           -  USE_HASH_AGGREGATION
--//先使用HASH GROUP BY,再使用SORT ORDER BY输出。

--//给没有order by 字段的语句参加NO_USE_HASH_AGGREGATION提示
SCOTT@book01p> Select /*+ NO_USE_HASH_AGGREGATION */ object_type,sum(object_id),avg(object_id),count(*) from  t1 group by object_type ;
OBJECT_TYPE                    SUM(OBJECT_ID) AVG(OBJECT_ID)   COUNT(*)
------------------------------ -------------- -------------- ----------
CLUSTER                                  3127          312.7         10
CONSUMER GROUP                         378585        21032.5         18
DESTINATION                             42133        21066.5          2
DIRECTORY                              198343     18031.1818         11
....
WINDOW                                 190681     21186.7778          9
XML SCHEMA                            1753783     44968.7949         39
34 rows selected.
--//可以发现按照OBJECT_TYPE字段排序输出。

SCOTT@book01p> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  654wq05g36wzj, child number 0
-------------------------------------
Select /*+ NO_USE_HASH_AGGREGATION */
object_type,sum(object_id),avg(object_id),count(*) from  t1 group by
object_type
Plan hash value: 3946799371
------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |       |   415 (100)|          |     34 |00:00:00.02 |    1479 |       |       |          |
|   1 |  SORT GROUP BY     |      |      1 |     34 |   510 |   415   (2)| 00:00:01 |     34 |00:00:00.02 |    1479 |  4096 |  4096 | 4096  (0)|
|   2 |   TABLE ACCESS FULL| T1   |      1 |  69908 |  1024K|   412   (1)| 00:00:01 |  69908 |00:00:00.01 |    1479 |       |       |          |
------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   2 - SEL$1 / "T1"@"SEL$1"
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1
---------------------------------------------------------------------------
   1 -  SEL$1
           -  NO_USE_HASH_AGGREGATION
--//采用SORT GROUP BY 算法。

4.继承问题展开:
--//如果将count(*)换成count(distinct object_name),变成分组后统计有多少个差别object_name的情况。
SCOTT@book01p> Select object_type,sum(object_id),avg(object_id),count(distinct object_name) from  t1 group by object_type;
OBJECT_TYPE                    SUM(OBJECT_ID) AVG(OBJECT_ID) COUNT(DISTINCTOBJECT_NAME)
------------------------------ -------------- -------------- --------------------------
INDEX                                47963848     20110.6281                       2381
TABLE                                46586395      19435.292                       2391
SYNONYM                             451440006     37346.1289                      12077
CLUSTER                                  3127          312.7                         10
SEQUENCE                              5405583     51481.7429                        105
VIEW                                114811847     15025.7619                       7638
PACKAGE                              30372636     37636.4758                        807
TYPE                                 77026974     34775.1576                       2067
INDEX PARTITION                      29357424     79775.6087                        225
TABLE PARTITION                      23209585     40224.5841                        228
PROCEDURE                             3958952     43988.3556                         90
FUNCTION                             23268633     57171.0885                        407
CONSUMER GROUP                         378585        21032.5                         18
SCHEDULE                                85012          21253                          4
WINDOW                                 190681     21186.7778                          9
OPERATOR                              3005473     50091.2167                         60
LIBRARY                               3731825     52560.9155                         71
PACKAGE BODY                         20327004     57583.5807                        353
XML SCHEMA                            1753783     44968.7949                         39
TRIGGER                               7458043     51791.9653                        144
RULE SET                                92298        23074.5                          4
JAVA CLASS                         1701232733      44526.729                      38207
JAVA RESOURCE                       100771276     58965.0532                       1708
INDEXTYPE                              654696     59517.8182                         11
TYPE BODY                             7464132     66054.2655                        113
JAVA DATA                             1168076     68710.3529                         17
EDITION                                   134            134                          1
DIRECTORY                              198343     18031.1818                         11
JOB CLASS                               63169     21056.3333                          3
SCHEDULER GROUP                         84768          21192                          4
DESTINATION                             42133        21066.5                          2
TABLE SUBPARTITION                     512080        16002.5                          1
JAVA SOURCE                            264798          88266                          3
EVALUATION CONTEXT                      67978     22659.3333                          3
34 rows selected.
--//如果对比Select object_type,sum(object_id),avg(object_id),count(*) from  t1 group by object_type;的输出可以发现输出顺
--//序差别,看末了一条纪录前面的是JAVA SOURCE.

--//看看执行筹划:
SCOTT@book01p> @ dpc '' 'projection' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  0n5vt0xa0qwk0, child number 1
-------------------------------------
Select object_type,sum(object_id),avg(object_id),count(distinct
object_name) from  t1 group by object_type
Plan hash value: 3244420040
--------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation            | Name     | Starts | E-Rows |E-Bytes|E-Temp | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |          |      1 |        |       |       |  1296 (100)|          |     34 |00:00:00.04 |    1479 |       |       |          |
|   1 |  HASH GROUP BY       |          |      1 |     34 |  3468 |       |  1296   (1)| 00:00:01 |     34 |00:00:00.04 |    1479 |   837K|   837K|          |
|   2 |   VIEW               | VW_DAG_0 |      1 |  69212 |  6894K|       |  1296   (1)| 00:00:01 |  69212 |00:00:00.04 |    1479 |       |       |          |
|   3 |    HASH GROUP BY     |          |      1 |  69212 |  3447K|  4416K|  1296   (1)| 00:00:01 |  69212 |00:00:00.04 |    1479 |    15M|  2089K|    9M (0)|
|   4 |     TABLE ACCESS FULL| T1       |      1 |  69908 |  3481K|       |   412   (1)| 00:00:01 |  69908 |00:00:00.01 |    1479 |       |       |          |
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$C33C846D
   2 - SEL$5771D262 / "VW_DAG_0"@"SEL$C33C846D"
   3 - SEL$5771D262
   4 - SEL$5771D262 / "T1"@"SEL$1"
Column Projection Information (identified by operation id):
-----------------------------------------------------------
   1 - (#keys=1; rowset=256) "ITEM_2"[VARCHAR2,23], COUNT("ITEM_1")[22], SUM("ITEM_3")[22], SUM("ITEM_5")[22]
   2 - (rowset=256) "ITEM_1"[VARCHAR2,128], "ITEM_2"[VARCHAR2,23], "ITEM_3"[NUMBER,22], "ITEM_5"[NUMBER,22]
   3 - (#keys=2; rowset=256) "OBJECT_TYPE"[VARCHAR2,23], "OBJECT_NAME"[VARCHAR2,128], COUNT(*)[22], SUM("OBJECT_ID")[22]
   4 - (rowset=256) "OBJECT_NAME"[VARCHAR2,128], "OBJECT_ID"[NUMBER,22], "OBJECT_TYPE"[VARCHAR2,23]
Note
-----
   - statistics feedback used for this statement
37 rows selected.
--//oracle仍旧采用HASH GROUP BY算法,不过使用2次。
--//仔细看Column Projection Information (identified by operation id):就可以看出一些细节。
--//id=3 的输出字段信息是"OBJECT_TYPE"[VARCHAR2,23], "OBJECT_NAME"[VARCHAR2,128], COUNT(*)[22], SUM("OBJECT_ID")[22]。
--//也就是可以猜测这部门的group by实际上包罗2个字段OBJECT_TYPE,OBJECT_NAME。
--//然后在这个的底子上做了1次group by OBJECT_TYPE。也就是做了查询转换。

SCOTT@book01p> @ expand_sql_text.sql 0n5vt0xa0qwk0
SELECT "A1"."OBJECT_TYPE" "OBJECT_TYPE",
       SUM("A1"."OBJECT_ID") "SUM(OBJECT_ID)",
       AVG("A1"."OBJECT_ID") "AVG(OBJECT_ID)",
       COUNT(DISTINCT "A1"."OBJECT_NAME") "COUNT(DISTINCTOBJECT_NAME)"
  FROM "SCOTT"."T1" "A1"
 GROUP BY "A1"."OBJECT_TYPE"
PL/SQL procedure successfully completed.
--//注做了格式化处理,oracle的expand sql text看不出细节,搞不懂有时候从输出可以看出执行细节有时候不行!!

--//再做一个10053看看。
SCOTT@book01p> @ 10053x  0n5vt0xa0qwk0 1
/u01/app/oracle/diag/rdbms/book/book/trace/book_ora_3410_a0n5vt0xa0qwk0.trc

SCOTT@book01p> @ 10053y ''
TRCLINE
------------------------------------------------------------------------------------------------------------------------
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT "VW_DAG_0"."ITEM_2" "OBJECT_TYPE",SUM("VW_DAG_0"."ITEM_3") "SUM(OBJECT_ID)",DECODE(NVL(SUM("VW_DAG_0"."ITEM_5"),0
),0,TO_NUMBER(NULL),SUM("VW_DAG_0"."ITEM_3")/NVL(SUM("VW_DAG_0"."ITEM_5"),0)) "AVG(OBJECT_ID)",COUNT("VW_DAG_0"."ITEM_1"
) "COUNT(DISTINCTOBJECT_NAME)" FROM  (SELECT "T1"."OBJECT_NAME" "ITEM_1","T1"."OBJECT_TYPE" "ITEM_2",SUM("T1"."OBJECT_ID
") "ITEM_3",SUM("T1"."OBJECT_ID") "ITEM_4",COUNT(*) "ITEM_5" FROM "SCOTT"."T1" "T1" GROUP BY "T1"."OBJECT_TYPE","T1"."OB
JECT_NAME") "VW_DAG_0" GROUP BY "VW_DAG_0"."ITEM_2"

--//格式化后读起来更新清晰,oracle做了查询转换,可以很轻易的发现内层的group by "T1"."OBJECT_TYPE", "T1"."OBJECT_NAME"。
SELECT "VW_DAG_0"."ITEM_2" "OBJECT_TYPE"
        ,SUM ("VW_DAG_0"."ITEM_3") "SUM(OBJECT_ID)"
        ,DECODE (
            NVL (SUM ("VW_DAG_0"."ITEM_5"), 0)
                       ,0, TO_NUMBER (NULL)
           ,SUM ("VW_DAG_0"."ITEM_3") / NVL (SUM ("VW_DAG_0"."ITEM_5"), 0))
            "AVG(OBJECT_ID)"
        ,COUNT ("VW_DAG_0"."ITEM_1") "COUNT(DISTINCTOBJECT_NAME)"
    FROM (  SELECT "T1"."OBJECT_NAME" "ITEM_1"
                  ,"T1"."OBJECT_TYPE" "ITEM_2"
                  ,SUM ("T1"."OBJECT_ID") "ITEM_3"
                  ,SUM ("T1"."OBJECT_ID") "ITEM_4"
                  ,COUNT (*) "ITEM_5"
              FROM "SCOTT"."T1" "T1"
          GROUP BY "T1"."OBJECT_TYPE", "T1"."OBJECT_NAME") "VW_DAG_0"
GROUP BY "VW_DAG_0"."ITEM_2"

--//如果给如许的语句参加NO_USE_HASH_AGGREGATION提示呢?
SCOTT@book01p> Select /*+ NO_USE_HASH_AGGREGATION */ object_type,sum(object_id),avg(object_id),count(distinct object_name) from  t1 group by object_type;
OBJECT_TYPE                    SUM(OBJECT_ID) AVG(OBJECT_ID) COUNT(DISTINCTOBJECT_NAME)
------------------------------ -------------- -------------- --------------------------
CLUSTER                                  3127          312.7                         10
CONSUMER GROUP                         378585        21032.5                         18
DESTINATION                             42133        21066.5                          2
DIRECTORY                              198343     18031.1818                         11
EDITION                                   134            134                          1
EVALUATION CONTEXT                      67978     22659.3333                          3
FUNCTION                             23268633     57171.0885                        407
INDEX                                47963848     20110.6281                       2381
INDEX PARTITION                      29357424     79775.6087                        225
INDEXTYPE                              654696     59517.8182                         11
JAVA CLASS                         1701232733      44526.729                      38207
JAVA DATA                             1168076     68710.3529                         17
JAVA RESOURCE                       100771276     58965.0532                       1708
JAVA SOURCE                            264798          88266                          3
JOB CLASS                               63169     21056.3333                          3
LIBRARY                               3731825     52560.9155                         71
OPERATOR                              3005473     50091.2167                         60
PACKAGE                              30372636     37636.4758                        807
PACKAGE BODY                         20327004     57583.5807                        353
PROCEDURE                             3958952     43988.3556                         90
RULE SET                                92298        23074.5                          4
SCHEDULE                                85012          21253                          4
SCHEDULER GROUP                         84768          21192                          4
SEQUENCE                              5405583     51481.7429                        105
SYNONYM                             451440006     37346.1289                      12077
TABLE                                46586395      19435.292                       2391
TABLE PARTITION                      23209585     40224.5841                        228
TABLE SUBPARTITION                     512080        16002.5                          1
TRIGGER                               7458043     51791.9653                        144
TYPE                                 77026974     34775.1576                       2067
TYPE BODY                             7464132     66054.2655                        113
VIEW                                114811847     15025.7619                       7638
WINDOW                                 190681     21186.7778                          9
XML SCHEMA                            1753783     44968.7949                         39
34 rows selected.
--//看输出就知道采用sort group by,按照OBJECT_TYPE排序。

SCOTT@book01p> @ dpc '' 'projection' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  f3u6zcjbfx37z, child number 0
-------------------------------------
Select /*+ NO_USE_HASH_AGGREGATION */
object_type,sum(object_id),avg(object_id),count(distinct object_name)
from  t1 group by object_type
Plan hash value: 3946799371
------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |       |   415 (100)|          |     34 |00:00:00.12 |    1479 |       |       |          |
|   1 |  SORT GROUP BY     |      |      1 |     34 |  1734 |   415   (2)| 00:00:01 |     34 |00:00:00.12 |    1479 |  7140K|  1416K| 6346K (0)|
|   2 |   TABLE ACCESS FULL| T1   |      1 |  69908 |  3481K|   412   (1)| 00:00:01 |  69908 |00:00:00.01 |    1479 |       |       |          |
------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   2 - SEL$1 / "T1"@"SEL$1"
Column Projection Information (identified by operation id):
-----------------------------------------------------------
   1 - (#keys=1; rowset=59) "OBJECT_TYPE"[VARCHAR2,23], COUNT(DISTINCT NLSSORT("OBJECT_NAME",'nls_sort=''BINARY'''))[22],
       COUNT("OBJECT_ID")[22], SUM("OBJECT_ID")[22]
   2 - (rowset=59) "OBJECT_NAME"[VARCHAR2,128], "OBJECT_ID"[NUMBER,22], "OBJECT_TYPE"[VARCHAR2,23]

Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1
---------------------------------------------------------------------------
   1 -  SEL$1
           -  NO_USE_HASH_AGGREGATION
--//直接就是1个SORT GROUP BY就可以,没有做查询转换。
--//不过你可以看cost就可以发现oracle有时候在采用最终的执行筹划有点问题,采用SORT GROUP BY的cost成本才415,而2次hash group
--//by的cost成本1296。 oracle最终还是选择hash group by的执行方式,或许oracle默认采用hash group by算法的缘故。
--//或者以为采用hash group by算法最优的缘故。

--//你可以执行如下sql语句,可以发现输出69212行,与前面hash group by 的E-Rows估算一致。
Select object_type,object_name,sum(object_id),avg(object_id) from  t1 group by object_type,object_name;
Select object_type,object_name,sum(object_id),avg(object_id) from  t1 group by object_type,object_name order by 1,2;

--//换一句话讲在如许的方式上采用SORT GROUP BY实际上执行效率也许更好,以后应该注意出现2次hash group by的情况。
--//oracle在做2个字段的hash group by时没有注意成本就很高。

--//趁便测试参加order by的情况。
SCOTT@book01p> Select object_type,sum(object_id),avg(object_id),count(distinct object_name) from  t1 group by object_type order by 1;

OBJECT_TYPE                    SUM(OBJECT_ID) AVG(OBJECT_ID) COUNT(DISTINCTOBJECT_NAME)
------------------------------ -------------- -------------- --------------------------
CLUSTER                                  3127          312.7                         10
CONSUMER GROUP                         378585        21032.5                         18
DESTINATION                             42133        21066.5                          2
...
VIEW                                114811847     15025.7619                       7638
WINDOW                                 190681     21186.7778                          9
XML SCHEMA                            1753783     44968.7949                         39
34 rows selected.

SCOTT@book01p> @ dpc '' 'projection' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  0rmrjurdhxrmy, child number 1
-------------------------------------
Select object_type,sum(object_id),avg(object_id),count(distinct
object_name) from  t1 group by object_type order by 1
Plan hash value: 2434018851
--------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation            | Name     | Starts | E-Rows |E-Bytes|E-Temp | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |          |      1 |        |       |       |  1296 (100)|          |     34 |00:00:00.05 |    1479 |       |       |          |
|   1 |  SORT GROUP BY       |          |      1 |     34 |  3468 |       |  1296   (1)| 00:00:01 |     34 |00:00:00.05 |    1479 |  4096 |  4096 | 4096  (0)|
|   2 |   VIEW               | VW_DAG_0 |      1 |  69212 |  6894K|       |  1296   (1)| 00:00:01 |  69212 |00:00:00.04 |    1479 |       |       |          |
|   3 |    HASH GROUP BY     |          |      1 |  69212 |  3447K|  4416K|  1296   (1)| 00:00:01 |  69212 |00:00:00.04 |    1479 |    15M|  2089K| 9756K (0)|
|   4 |     TABLE ACCESS FULL| T1       |      1 |  69908 |  3481K|       |   412   (1)| 00:00:01 |  69908 |00:00:00.01 |    1479 |       |       |          |
--------------------------------------------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$C33C846D
   2 - SEL$5771D262 / "VW_DAG_0"@"SEL$C33C846D"
   3 - SEL$5771D262
   4 - SEL$5771D262 / "T1"@"SEL$1"

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=1; rowset=256) "ITEM_2"[VARCHAR2,23], COUNT("ITEM_1")[22], SUM("ITEM_3")[22], SUM("ITEM_5")[22]
   2 - (rowset=256) "ITEM_1"[VARCHAR2,128], "ITEM_2"[VARCHAR2,23], "ITEM_3"[NUMBER,22], "ITEM_5"[NUMBER,22]
   3 - (#keys=2; rowset=256) "OBJECT_TYPE"[VARCHAR2,23], "OBJECT_NAME"[VARCHAR2,128], COUNT(*)[22], SUM("OBJECT_ID")[22]
   4 - (rowset=256) "OBJECT_NAME"[VARCHAR2,128], "OBJECT_ID"[NUMBER,22], "OBJECT_TYPE"[VARCHAR2,23]

Note
-----
   - statistics feedback used for this statement
37 rows selected.
--//仍旧在内层采用HASH GROUP BY 算法。

5.附上执行脚本代码:

$ cat expand_sql_text.sql
set long 20000
set serveroutput on
declare
    L_sqltext clob := null;
        l_version varchar2(3) := null;
    l_sql     clob := null;
    l_result  clob := null;
begin
        select regexp_replace(version,'\..*') into l_version from v$instance;
        select sql_fulltext into l_sqltext from v$sqlarea where sql_id='&&1';

        if l_version = '11' then
       l_sql := 'begin
                   dbms_sql2.expand_sql_text( :a,:b );
                 end;';

    elsif l_version >= '12' then

      l_sql := 'begin
                  dbms_utility.expand_sql_text(:a,:b);
                end;';
    end if;
    execute immediate l_sql using in l_sqltext,out l_result;
        dbms_output.put_line(l_result);
end;
/
set serveroutput off

$ cat 10053x.sql
set term off
execute dbms_sqldiag.dump_trace(p_sql_id=>'&1',p_child_number=>&2,p_component=>'Compiler',p_file_id=>'a'||'&&1');
set term on
set head off
@ t
set head on
define 1=&trc

$ cat 10053y.sql
-- Copyright 2023 lfree. All rights reserved.
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms and conditions.
------------------------------------------------------------------------------------------------------------
--
-- File name:   10053y.sql
-- Purpose:     display Final query after transformations
--
-- Author:      lfree
--
-- Usage:
--     @ 10053y
--
-------------------------------------------------------------------------------------------------------------

SET TERM OFF
COLUMN trc_file  NEW_VALUE v_trc_file
--DEFINE trc_file = &1
SELECT NVL('&1','&TRC') trc_file FROM DUAL ;
SELECT SUBSTR ('&v_trc_file', INSTR ('&v_trc_file', '/', -1) + 1) trc_file FROM DUAL;
SET TERM ON

DEFINE trc_file = &v_trc_file
--DEFINE trc_file = &1

--COL trace_filename FOR A45
--COL adr_home FOR A45
--SELECT trace_filename, to_char(change_time, 'dd-mm-yyyy hh24:mi:ss') AS change_time, to_char(modify_time, 'dd-mm-yyyy hh24:mi:ss') AS modify_time, adr_home, con_id
--FROM gv$diag_trace_file
--WHERE lower(trace_filename) LIKE lower('%&v_trc_file%')
--ORDER BY modify_time;

column trcline format a120
SELECT trcline
  FROM gv$diag_trace_file_contents
          MATCH_RECOGNIZE
          (
             PARTITION BY trace_filename
             ORDER BY line_number
             MEASURES payload AS trcline
             ALL ROWS PER MATCH
             PATTERN (a | b nc * | c | f n)
             DEFINE a AS (payload LIKE 'qksptfSQM_GetTxt(): Anonymous Block%')
            ,b AS (payload LIKE 'qksptfSQM_GetTxt(): Macro Text%')
            ,nc AS (payload NOT LIKE 'qksptfSQM_Template(): Template Text%')
            ,c AS (payload LIKE 'qksptfSQM_Template(): Template Text%')
            ,f AS (payload LIKE 'Final query after%')
          )
          x
 WHERE trace_filename = '&v_trc_file';

$ cat t.sql
SELECT value tracefile FROM v$diag_info WHERE name = 'Default Trace File';



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表