首页 > 其他分享 >[20240313]toad gather_plan_statistics执行计划相关问题.txt

[20240313]toad gather_plan_statistics执行计划相关问题.txt

时间:2024-03-13 21:23:24浏览次数:18  
标签:00 statistics 20240313 toad -- Rows Time 00.01

[20240313]toad gather_plan_statistics执行计划相关问题.txt

--//自己现在已经很少使用toad,使用也是作为辅助功能,毕竟图形界面能更快的操作显示信息.
--//昨天遇到一个问题,自己当时没有反映过来,浪费点时间,做一个记录避免以后再次犯浑.
--//我一般在toad的sql编辑界面下尽可能看真实的执行计划
--//参考:https://blog.itpub.net/267265/viewspace-2130781/=>[20161216]toad下显示真实的执行计划.txt
--//没有想到看到的执行计划统计存在一些问题,看下面的例子:

1.环境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2.建立例子:

create table t as select rownum id ,lpad('x',100,'x') name ,lpad('1',1) flag from dual connect by level<=1e4;
update t set flag='0' where id=1e4;
commit ;
create index i_t_flag on t(flag);

SCOTT@book> execute sys.dbms_stats.gather_table_stats ( OwnName => '',TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 for columns flag size 4',Cascade => True ,No_Invalidate => false)
PL/SQL procedure successfully completed.

--//在flag字段上建立直方图.

3.测试:
--//在toad界面上输入如下语句并执行如下:
SELECT  /*+ gather_plan_statistics */ * FROM T WHERE FLAG=:X;
--//注:加入gather_plan_statistics提示执行计划可以显示更多信息.

--//带入'1'测试看看,执行计划如下:
--//注意是字符串类型。
Plan hash value: 1601196873
---------------------------------------------------------------------------
| Id  | Operation         | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |       |    48 (100)|          |
|*  1 |  TABLE ACCESS FULL| T    |   5000 |   522K|    48   (0)| 00:00:01 |
---------------------------------------------------------------------------
--//你可以发现并没有显示完整的执行计划统计信息,提示gather_plan_statistics没有起作用。
--//实际上显示是explain plan的执行计划.

--//带入'0'测试看看,执行计划如下:
Plan hash value: 1601196873
--------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |       |    48 (100)|          |      1 |00:00:00.01 |     160 |
|*  1 |  TABLE ACCESS FULL| T    |      1 |   5000 |   522K|    48   (0)| 00:00:01 |      1 |00:00:00.01 |     160 |
--------------------------------------------------------------------------------------------------------------------
-//看到的执行计划不同,为什么呢? 实际上问题在于toad执行时每次fetch 1001行。
--//:X = 0 是仅仅返回1条,执行计划已经完成,可以显示完整的统计信息。
--//而带入:X = 1时,仅仅显示前500条(实际上fetch 1001行),没有执行完成,无法显示完整的执行统计信息。可以拖动滚动条或者按
--//page down键到结尾,这样也可以得到完整的执行计划。

--//如果滚动到中间(实际上只要不到结尾), 看执行计划:
Plan hash value: 1601196873
--------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |       |    48 (100)|          |   1001 |00:00:00.01 |      18 |
|*  1 |  TABLE ACCESS FULL| T    |      1 |   5000 |   522K|    48   (0)| 00:00:01 |   1001 |00:00:00.01 |      18 |
--------------------------------------------------------------------------------------------------------------------
--//看到A-ROWS=1001.也就是第1次fetch的数量,也就是以后在toad下看这类执行计划注意,这样看到的执行计划的统计信息可能不真实!!
--//如果按page down键到结尾再看执行计划:
Plan hash value: 1601196873
--------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |       |    48 (100)|          |   9999 |00:00:00.01 |     168 |
|*  1 |  TABLE ACCESS FULL| T    |      1 |   5000 |   522K|    48   (0)| 00:00:01 |   9999 |00:00:00.01 |     168 |
--------------------------------------------------------------------------------------------------------------------

--//如果在sql编辑界面上打开auto trace,全部结果fetch完成就不会出现上面看到的情况了。
--//再次带入'1'测试看看,执行计划如下:
Plan hash value: 1601196873
--------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |       |    48 (100)|          |   9999 |00:00:00.01 |     168 |
|*  1 |  TABLE ACCESS FULL| T    |      1 |   5000 |   522K|    48   (0)| 00:00:01 |   9999 |00:00:00.01 |     168 |
--------------------------------------------------------------------------------------------------------------------

4.继续测试:
--//关闭auto trace。
--//再次带入'1'测试看看,执行计划如下:
Plan hash value: 1601196873
--------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |       |    48 (100)|          |   9999 |00:00:00.01 |     168 |
|*  1 |  TABLE ACCESS FULL| T    |      1 |   5000 |   522K|    48   (0)| 00:00:01 |   9999 |00:00:00.01 |     168 |
--------------------------------------------------------------------------------------------------------------------

--//再次带入'1'测试看看,执行计划如下:
Plan hash value: 1601196873
--------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |       |    48 (100)|          |   1001 |00:00:00.01 |      18 |
|*  1 |  TABLE ACCESS FULL| T    |      1 |   5000 |   522K|    48   (0)| 00:00:01 |   1001 |00:00:00.01 |      18 |
--------------------------------------------------------------------------------------------------------------------
--//注:当时马上看执行计划,理论讲应该没有A-Rows之类的统计,本来以为会显示explain plan的执行计划,但是看到的却是
--//A-Rows=1001的情况,我猜测可能是使用dbms_xplan.display_cursor,format加入last的缘故.

--//开始我很困惑,实际上这样第1次执行看到的是前1次的执行计划统计信息。

--//使用SQL Tracker跟踪发现,toad执行如下:
select * from table(dbms_xplan.display_cursor(sql_id => '7pnr0krspk166', cursor_child_no => null, format => 'ALL,
ALLSTATS, LAST, ROWS, BYTES, COST, OUTLINE, PARTITION, PARALLEL, PEEKED_BINDS, PREDICATE, PROJECTION, ALIAS, REMOTE,
NOTE'))

--//加入有参数last,显示参数我基本全部选上。
--//而第2次执行,因为前面有记录这个统计信息,这样就有显示,虽然不准确。当然这些是我的猜测!!

--//总之,在toad下注意这个细节,建议优化调试sql语句时打开auto trace,这样看执行计划的统计信息比较准确,不容易出现误判。

5.另外的问题注意:
--//你可以注意一个细节,toad下无论带入'0'还是'1'选择的执行计划都是全表扫描,E-Rows=5000并没有采用直方图的结果,也就是总记
--//录的50%.
--//即使小量修改sql语句,sql_id不同,导致重新分析sql语句,第1次带入参数'0',执行计划也是选择全表扫描。
--//如果仔细看Outline Data部分:
/*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
      DB_VERSION('11.2.0.4')
      OPT_PARAM('_optim_peek_user_binds' 'false')
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      FULL(@"SEL$1" "T"@"SEL$1")
      END_OUTLINE_DATA
  */

--//不知道为什么toad关闭了绑定变量peek。而且我不知道怎么打开,使用toad的版本号12.6.0.53,只有toad 9.X版本正常的.
--//这样使得在toad调试sql语句涉及到这方面相关问题时要小心,而且导致BIND_AWARE提示无效。

SELECT   /*+ gather_plan_statistics BIND_AWARE OPT_PARAM('_optim_peek_user_binds' 'true') */ * FROM T WHERE FLAG=:X;
Plan hash value: 1601196873
 
--------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |       |    48 (100)|          |      1 |00:00:00.01 |     160 |
|*  1 |  TABLE ACCESS FULL| T    |      1 |   5000 |   522K|    48   (0)| 00:00:01 |      1 |00:00:00.01 |     160 |
--------------------------------------------------------------------------------------------------------------------
--//还是全表扫描。
 
6.sqlplus下测试:

SCOTT@book> variable x varchar2(32) ;
SCOTT@book> exec :x :='0';
PL/SQL procedure successfully completed.

SCOTT@book> SELECT   /*+ gather_plan_statistics  */ * FROM T WHERE FLAG=:X;
        ID NAME                                     F
---------- ---------------------------------------- -
     10000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0
           xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
           xxxxxxxxxxxxxxxxxxxx


SCOTT@book> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  8s7vwp7ykv52x, child number 1
-------------------------------------
SELECT   /*+ gather_plan_statistics  */ * FROM T WHERE FLAG=:X
Plan hash value: 120143814
----------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name     | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |          |      1 |        |       |     2 (100)|          |      1 |00:00:00.01 |       4 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T        |      1 |      1 |   107 |     2   (0)| 00:00:01 |      1 |00:00:00.01 |       4 |
|*  2 |   INDEX RANGE SCAN          | I_T_FLAG |      1 |      1 |       |     1   (0)| 00:00:01 |      1 |00:00:00.01 |       3 |
----------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / T@SEL$1
   2 - SEL$1 / T@SEL$1
Peeked Binds (identified by position):
--------------------------------------
   1 - (VARCHAR2(30), CSID=852): '0'
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("FLAG"=:X)
--//建立新的子光标,child number=1,可以使用I_T_FLAG索引。

7.总结:
--//注意toad下调试优化sql语句时注意这个细节,避免以后在这个方面浪费时间。

标签:00,statistics,20240313,toad,--,Rows,Time,00.01
From: https://www.cnblogs.com/lfree/p/18071547

相关文章

  • 20240313打卡
    第三周第一天第二天第三天第四天第五天第六天第七天所花时间3h5h0h代码量(行)2742560博客量(篇)111知识点了解完成AndroidStudio中原生数据库SQlite简单的CRUD本地数据库连接到远程数据库海底谭练习......
  • 20240313
    今天又体测了,考的还没上次高。我觉得我看开了。我太敏感了。我心灵太脆弱了。别人说我两句我就要破防。我大抵是有被害妄想症吧。我大抵是心理出了问题吧。估计我的大脑已经不好用了,什么事情都要忘了。我已经揣测不透别人说的话了。我的语言认知板块出大问题了。已经混......
  • Blog Statistics Apr 1, 2023 - Apr 1, 2024
    1.OverviewDataDate:Apr1,2023-Apr1,2024Numberofarticles:53AllPlatformTotalVisits:1,011,000+(ThesearticeswerealsopublishedatZhihu.com、Toutiao.com、WeChatOfficialAccount、HeapDump、TencentDeveloper.)2.Dataforeachplatformlast......
  • Python|statistics 数学统计函数模块
    方法描述statistics.harmonic_mean()计算给定数据集的调和平均值。是总体内各个变量值倒数1/x的算术平均数的倒数。statistics.mean()计算数据集的平均值statistics.median()计算数据集的中位数statistics.median_grouped()计算给定分组数据集的分组中位数......
  • 【解题报告】CodeForces523D:Statistics of Recompressing Videos
    CF523D解题报告CF523D先上结果:前两次语言选错了,编译一直不过(做这题是因为集训老师让我做我就做了,要不然我都快忘了我有CF账号了(思路省流:STL大法开一个小根堆存目前正在运行的服务器(也可以大根堆,但是存时间进去的时候存负的),如果有空机就直接处理,这个视频处理完的时间就......
  • CSharp: UglyToad.PdfPig int .net8
     /*IDE:VS202217.5OS:windows10.net:8.0生成PDF文档,从PDF文档中获取文字内容控制台下测试*///Seehttps://aka.ms/new-console-templateformoreinformationusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Xml.L......
  • Applied Statistics - 应用统计学习 - numpy array交换两行 ? How to Swap Two Rows in
    https://www.statology.org/qualitative-vs-quantitative-variables/https://www.statology.org/numpy-swap-rows/HowtoSwapTwoRowsinaNumPyArray(WithExample)YoucanusethefollowingbasicsyntaxtoswaptworowsinaNumPyarray:some_array[[0,3],:......
  • toad逻辑回归尝试
    fromsklearn.model_selectionimporttrain_test_splittrain,test=train_test_split(dd,test_size=0.6)toad.detect(dd)toad.quality(dd,target='target',iv_only=False)train_selected,dropped=toad.selection.select(train,target='target',emp......
  • IBM SPSS Statistics 27:洞悉数据,揭示趋势
    IBMSPSSStatistics27是一款功能强大的数据统计分析软件,它可以帮助用户快速、准确地分析和解读数据,并生成高质量的统计图表和报告。点击获取IBMSPSSStatistics27首先,IBMSPSSStatistics27具有广泛的数据分析工具和功能。它支持各种数据导入和预处理方式,可以快速清洗、整......
  • toad最终版中间带循环
    KS循环testks=pd.ExcelWriter('test1.xlsx')columns_df=pd.DataFrame(mx2.columns)fori,jinenumerate(mx2.columns):result=toad.metrics.KS_bucket(mx[j],mx['target'],bucket=10,method='quantile').sort_index()result.to_excel(testk......