Oracle 12c新特性之怎么检测有用的多列统计信息
这篇文章给大家分享的是有关Oracle 12c新特性之怎么检测有用的多列统计信息的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一、环境准备
首先,我们创建测试表customers_test,基于sh示例用户下的customers表。
SQL>selectbannerfromv$version;BANNER--------------------------------------------------------------------------------OracleDatabase12cEnterpriseEditionRelease12.1.0.2.0-64bitProductionPL/SQLRelease12.1.0.2.0-ProductionCORE12.1.0.2.0ProductionTNSforLinux:Version12.1.0.2.0-ProductionNLSRTLVersion12.1.0.2.0-ProductionSQL>SQL>connsh/sh@HOEGHConnected.SQL>SQL>DROPTABLEcustomers_test;DROPTABLEcustomers_test*ERRORatline1:ORA-00942:tableorviewdoesnotexistSQL>CREATETABLEcustomers_testASSELECT*FROMcustomers;Tablecreated.SQL>selectcount(*)fromcustomers_test;COUNT(*)----------55500SQL>
二、收集统计信息
SQL>SQL>EXECDBMS_STATS.GATHER_TABLE_STATS(user,'customers_test');PL/SQLproceduresuccessfullycompleted.SQL>
三、开启负载监控
另外打开一个会话,通过sys用户登录,开启负载监控。其中,SEED_COL_USAGE的第三个参数表示监控的时间,单位是秒,300表示5分钟。
SQL>showuserUSERis“SYS”SQL>BEGINDBMS_STATS.SEED_COL_USAGE(null,null,300);END;/234PL/SQLproceduresuccessfullycompleted.SQL>
四、使用explain plan for查询执行计划
SQL>SQL>EXPLAINPLANFORSELECT*FROMcustomers_testWHEREcust_city='LosAngeles'ANDcust_state_province='CA'ANDcountry_id=52790;23456Explained.SQL>SQL>SELECTPLAN_TABLE_OUTPUTFROMTABLE(DBMS_XPLAN.DISPLAY('plan_table',null,'basicrows'));2PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------Planhashvalue:2112738156----------------------------------------------------|Id|Operation|Name|Rows|----------------------------------------------------|0|SELECTSTATEMENT||1||1|TABLEACCESSFULL|CUSTOMERS_TEST|1|----------------------------------------------------8rowsselected.SQL>
从执行计划来看,查询结果只有1列。我们暂且记下这个结果。
五、查看列使用信息
此时,我们可以通过REPORT_COL_USAGE来查看列的使用信息。
我们看到,Oracle帮我们检测到了一个有用的列组信息,包括customers_test、cust_city和cust_state_province三列。
SQL>SQL>SETLONG100000SQL>SETLINES120SQL>SETPAGES0SQL>SELECTDBMS_STATS.REPORT_COL_USAGE(user,'customers_test')2FROMDUAL;LEGEND:.......EQ:UsedinsingletableEQualitypredicateRANGE:UsedinsingletableRANGEpredicateLIKE:UsedinsingletableLIKEpredicateNULL:Usedinsingletableis(not)NULLpredicateEQ_JOIN:UsedinEQualityJOINpredicateNONEQ_JOIN:UsedinNONEQualityJOINpredicateFILTER:UsedinsingletableFILTERpredicateJOIN:UsedinJOINpredicateGROUP_BY:UsedinGROUPBYexpression...............................................................................###############################################################################COLUMNUSAGEREPORTFORSH.CUSTOMERS_TEST.........................................1.COUNTRY_ID:EQ2.CUST_CITY:EQ3.CUST_STATE_PROVINCE:EQ4.(CUST_CITY,CUST_STATE_PROVINCE,COUNTRY_ID):FILTER###############################################################################SQL>
六、创建扩展统计信息
检测工作完成后,我们可以通过CREATE_EXTENDED_STATS方法来创建扩展统计信息。其中,黄色标注部分就是创建对象的名称。
SQL>SQL>SELECTDBMS_STATS.CREATE_EXTENDED_STATS(user,'customers_test')FROMDUAL;###############################################################################EXTENSIONSFORSH.CUSTOMERS_TEST................................1.(CUST_CITY,CUST_STATE_PROVINCE,COUNTRY_ID):SYS_STUMZ$C3AIHLPBROI#SKA58H_Ncreated###############################################################################SQL>
七、重新收集统计信息
SQL>SQL>EXECDBMS_STATS.GATHER_TABLE_STATS(user,'customers_test');PL/SQLproceduresuccessfullycompleted.SQL>
八、查看USER_TAB_COL_STATISTICS,确认列统计信息
通过查询USER_TAB_COL_STATISTICS,我们可以获取到刚刚创建的列组对象,和第6步的输出结果是一致的。
SQL>SQL>COLCOLUMN_NAMEFORA30SQL>SELECTCOLUMN_NAME,NUM_DISTINCT,HISTOGRAMFROMUSER_TAB_COL_STATISTICSWHERETABLE_NAME='CUSTOMERS_TEST'ORDERBY1;234COUNTRY_ID19FREQUENCYCUST_CITY620HYBRIDCUST_CITY_ID620NONECUST_CREDIT_LIMIT8NONECUST_EFF_FROM1NONECUST_EFF_TO0NONECUST_EMAIL1699NONECUST_FIRST_NAME1300NONECUST_GENDER2NONECUST_ID55500NONECUST_INCOME_LEVEL12NONECUST_LAST_NAME908NONECUST_MAIN_PHONE_NUMBER51344NONECUST_MARITAL_STATUS11NONECUST_POSTAL_CODE623NONECUST_SRC_ID0NONECUST_STATE_PROVINCE145FREQUENCYCUST_STATE_PROVINCE_ID145NONECUST_STREET_ADDRESS49900NONECUST_TOTAL1NONECUST_TOTAL_ID1NONECUST_VALID2NONECUST_YEAR_OF_BIRTH75NONESYS_STUMZ$C3AIHLPBROI#SKA58H_N620HYBRID24rowsselected.SQL>
九、重新查询执行计划
我们看到,在第4步中查询执行计划中,Rows为1;现在呢,是867。这差距也忒大了点儿。
SQL>SQL>EXPLAINPLANFORSELECT*FROMcustomers_testWHEREcust_city='LosAngeles'ANDcust_state_province='CA'ANDcountry_id=52790;23456Explained.SQL>SQL>SELECTPLAN_TABLE_OUTPUTFROMTABLE(DBMS_XPLAN.DISPLAY('plan_table',null,'basicrows'));2Planhashvalue:2112738156----------------------------------------------------|Id|Operation|Name|Rows|----------------------------------------------------|0|SELECTSTATEMENT||867||1|TABLEACCESSFULL|CUSTOMERS_TEST|867|----------------------------------------------------8rowsselected.SQL>
感谢各位的阅读!关于“Oracle 12c新特性之怎么检测有用的多列统计信息”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。