Oracle 12c新特性之檢測有用的多列統計資訊
之前和大家分享過Oracle 11g下的一個新特性——收集多列統計資訊(http://blog.itpub.net/30162081/viewspace-1637387/),今天和大家分享Oracle 12c的一個新特性——自動檢測有用列組資訊。二者相得益彰,大家可以具體情況酌情使用。
言歸正傳,我們可以針對一個表,基於特定的工作負荷,透過使用DBMS_STATS.SEED_COL_USAGE和REPORT_COL_USAGE來確定我們需要哪些列組。當你不清除需要建立哪個擴充套件統計資訊時,這個技術是非常有用的。需要注意的是,這種技術不適用於包含表示式列的統計工作。
接下來,我們透過例子來學習這個的新特性。
從執行計劃來看,查詢結果只有1列。我們暫且記下這個結果。
我們看到,Oracle幫我們檢測到了一個有用的列組資訊,包括customers_test、cust_city和cust_state_province三列。
~~~~~~~ the end~~~~~~~~~
hoegh
2016.09.07
言歸正傳,我們可以針對一個表,基於特定的工作負荷,透過使用DBMS_STATS.SEED_COL_USAGE和REPORT_COL_USAGE來確定我們需要哪些列組。當你不清除需要建立哪個擴充套件統計資訊時,這個技術是非常有用的。需要注意的是,這種技術不適用於包含表示式列的統計工作。
接下來,我們透過例子來學習這個的新特性。
1.環境準備
首先,我們建立測試表customers_test,基於sh示例使用者下的customers表。點選(此處)摺疊或開啟
-
SQL> select banner from v$version;
-
-
BANNER
-
--------------------------------------------------------------------------------
-
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
-
PL/SQL Release 12.1.0.2.0 - Production
-
CORE 12.1.0.2.0 Production
-
TNS for Linux: Version 12.1.0.2.0 - Production
-
NLSRTL Version 12.1.0.2.0 - Production
-
-
SQL>
-
SQL> conn sh/sh@HOEGH
-
Connected.
-
SQL>
-
SQL> DROP TABLE customers_test;
-
DROP TABLE customers_test
-
*
-
ERROR at line 1:
-
ORA-00942: table or view does not exist
-
-
-
SQL> CREATE TABLE customers_test AS SELECT * FROM customers;
-
-
Table created.
-
-
SQL> select count(*) from customers_test;
-
-
COUNT(*)
-
----------
-
55500
-
- SQL>
2.收集統計資訊
點選(此處)摺疊或開啟
-
SQL>
-
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(user, 'customers_test');
-
-
PL/SQL procedure successfully completed.
-
- SQL>
3.開啟負載監控
另外開啟一個會話,透過sys使用者登入,開啟負載監控。其中,SEED_COL_USAGE的第三個參數列示監控的時間,單位是秒,300表示5分鐘。點選(此處)摺疊或開啟
-
SQL> show user
-
USER is “SYS”
-
SQL> BEGIN
-
DBMS_STATS.SEED_COL_USAGE(null,null,300);
-
END;
-
/ 2 3 4
-
-
PL/SQL procedure successfully completed.
- SQL>
4.使用explain plan for查詢執行計劃
點選(此處)摺疊或開啟
-
SQL>
-
SQL> EXPLAIN PLAN FOR
-
SELECT *
-
FROM customers_test
-
WHERE cust_city = 'Los Angeles'
-
AND cust_state_province = 'CA'
-
AND country_id = 52790; 2 3 4 5 6
-
-
Explained.
-
-
SQL>
-
SQL> SELECT PLAN_TABLE_OUTPUT
-
FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table', null,'basic rows')); 2
-
-
PLAN_TABLE_OUTPUT
-
--------------------------------------------------------------------------------
-
Plan hash value: 2112738156
-
-
----------------------------------------------------
-
| Id | Operation | Name | Rows |
-
----------------------------------------------------
-
| 0 | SELECT STATEMENT | | 1 |
-
| 1 | TABLE ACCESS FULL| CUSTOMERS_TEST | 1 |
-
----------------------------------------------------
-
-
8 rows selected.
-
- SQL>
5.檢視列使用資訊
此時,我們可以透過REPORT_COL_USAGE來檢視列的使用資訊。我們看到,Oracle幫我們檢測到了一個有用的列組資訊,包括customers_test、cust_city和cust_state_province三列。
點選(此處)摺疊或開啟
-
SQL>
-
SQL> SET LONG 100000
-
SQL> SET LINES 120
-
SQL> SET PAGES 0
-
SQL> SELECT DBMS_STATS.REPORT_COL_USAGE(user, 'customers_test')
-
2 FROM DUAL;
-
LEGEND:
-
.......
-
-
EQ : Used in single table EQuality predicate
-
RANGE : Used in single table RANGE predicate
-
LIKE : Used in single table LIKE predicate
-
NULL : Used in single table is (not) NULL predicate
-
EQ_JOIN : Used in EQuality JOIN predicate
-
NONEQ_JOIN : Used in NON EQuality JOIN predicate
-
FILTER : Used in single table FILTER predicate
-
JOIN : Used in JOIN predicate
-
GROUP_BY : Used in GROUP BY expression
-
...............................................................................
-
-
###############################################################################
-
-
COLUMN USAGE REPORT FOR SH.CUSTOMERS_TEST
-
.........................................
-
-
1. COUNTRY_ID : EQ
-
2. CUST_CITY : EQ
-
3. CUST_STATE_PROVINCE : EQ
-
4. (CUST_CITY, CUST_STATE_PROVINCE,
-
COUNTRY_ID) : FILTER
-
###############################################################################
-
-
-
- SQL>
6.建立擴充套件統計資訊
檢測工作完成後,我們可以透過CREATE_EXTENDED_STATS方法來建立擴充套件統計資訊。其中,黃色標註部分就是建立物件的名稱。點選(此處)摺疊或開啟
-
SQL>
-
SQL> SELECT DBMS_STATS.CREATE_EXTENDED_STATS(user, 'customers_test') FROM DUAL;
-
###############################################################################
-
-
EXTENSIONS FOR SH.CUSTOMERS_TEST
-
................................
-
-
1. (CUST_CITY, CUST_STATE_PROVINCE,
-
COUNTRY_ID) : SYS_STUMZ$C3AIHLPBROI#SKA58H_N created
-
###############################################################################
-
-
-
- SQL>
7.重新收集統計資訊
點選(此處)摺疊或開啟
-
SQL>
-
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(user,'customers_test');
-
-
PL/SQL procedure successfully completed.
-
- SQL>
8.檢視USER_TAB_COL_STATISTICS,確認列統計資訊
透過查詢USER_TAB_COL_STATISTICS,我們可以獲取到剛剛建立的列組物件,和第6步的輸出結果是一致的。點選(此處)摺疊或開啟
-
SQL>
-
SQL> COL COLUMN_NAME FOR A30
-
SQL> SELECT COLUMN_NAME, NUM_DISTINCT, HISTOGRAM
-
FROM USER_TAB_COL_STATISTICS
-
WHERE TABLE_NAME = 'CUSTOMERS_TEST'
-
ORDER BY 1; 2 3 4
-
COUNTRY_ID 19 FREQUENCY
-
CUST_CITY 620 HYBRID
-
CUST_CITY_ID 620 NONE
-
CUST_CREDIT_LIMIT 8 NONE
-
CUST_EFF_FROM 1 NONE
-
CUST_EFF_TO 0 NONE
-
CUST_EMAIL 1699 NONE
-
CUST_FIRST_NAME 1300 NONE
-
CUST_GENDER 2 NONE
-
CUST_ID 55500 NONE
-
CUST_INCOME_LEVEL 12 NONE
-
CUST_LAST_NAME 908 NONE
-
CUST_MAIN_PHONE_NUMBER 51344 NONE
-
CUST_MARITAL_STATUS 11 NONE
-
CUST_POSTAL_CODE 623 NONE
-
CUST_SRC_ID 0 NONE
-
CUST_STATE_PROVINCE 145 FREQUENCY
-
CUST_STATE_PROVINCE_ID 145 NONE
-
CUST_STREET_ADDRESS 49900 NONE
-
CUST_TOTAL 1 NONE
-
CUST_TOTAL_ID 1 NONE
-
CUST_VALID 2 NONE
-
CUST_YEAR_OF_BIRTH 75 NONE
-
SYS_STUMZ$C3AIHLPBROI#SKA58H_N 620 HYBRID
-
-
24 rows selected.
-
- SQL>
9.重新查詢執行計劃
我們看到,在第4步中查詢執行計劃中,Rows為1;現在呢,是867。這差距也忒大了點兒。點選(此處)摺疊或開啟
-
SQL>
-
SQL> EXPLAIN PLAN FOR
-
SELECT *
-
FROM customers_test
-
WHERE cust_city = 'Los Angeles'
-
AND cust_state_province = 'CA'
-
AND country_id = 52790; 2 3 4 5 6
-
-
Explained.
-
-
SQL>
-
SQL> SELECT PLAN_TABLE_OUTPUT
-
FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table', null,'basic rows')); 2
-
Plan hash value: 2112738156
-
-
----------------------------------------------------
-
| Id | Operation | Name | Rows |
-
----------------------------------------------------
-
| 0 | SELECT STATEMENT | | 867 |
-
| 1 | TABLE ACCESS FULL| CUSTOMERS_TEST | 867 |
-
----------------------------------------------------
-
-
8 rows selected.
-
- SQL>
~~~~~~~ the end~~~~~~~~~
hoegh
2016.09.07
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30162081/viewspace-2124652/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 11g新特性之收集多列統計資訊Oracle
- Oracle 11g新特性:多列統計資訊(MultiColumn Statistics)Oracle
- Oracle多列統計資訊Oracle
- Oracle 12c新特性之Sequence的Session特性OracleSession
- Oracle 12C 新特性之 sqlplus檢視History命令OracleSQL
- Oracle 12c 新特性之 temp undoOracle
- Oracle 12C 新特性之級聯truncateOracle
- Oracle 12C 新特性之 恢復表Oracle
- Oracle 12c新特性Oracle
- Oracle 12C 資料泵新特性測試Oracle
- oracle 12c 新特性之不可見欄位Oracle
- oracle 12C 新特性之臨時undo控制Oracle
- Oracle 12c 新特性(四)Oracle
- Oracle 12c 新特性(三)Oracle
- Oracle 12c 新特性(二)Oracle
- Oracle 12c 新特性(一)Oracle
- ORACLE19c新特性-實時統計資訊收集Oracle
- ORACLE表統計資訊與列統計資訊Oracle
- oracle 12c新特性:Rman表恢復之直接匯入系統Oracle
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- Oracle 12C新特性-History命令Oracle
- Oracle 12c 兩個新特性Oracle
- Oracle 12C新特性In-MemoryOracle
- Oracle GoldenGate 12c 新特性OracleGo
- 11g新特性--檢視錶的歷史統計資訊差異
- 11G新特性,待定的統計資訊
- 11.2新特性之不可見索引-臨時統計資訊索引
- 新的Oracle時間資訊特性Oracle
- Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHEDOracleIndexBAT
- Oracle 12c新特性--ASMFD(ASM Filter Driver)特性OracleASMFilter
- Oracle檢視查詢慢之統計資訊收集Oracle
- oracle11g新特性之--虛擬列Oracle
- Oracle 12C 新特性:Rman的單個表恢復測試--未匯入系統Oracle
- Oracle 12c DG新特性Far SyncOracle
- ORACLE 12C新特性——CDB與PDBOracle
- 12c RMAN新特性之Recover Table
- Oracle 12c 新特性之臨時Undo--temp_undo_enabledOracle
- Oracle 12c新特性之:APPROX_COUNT_DISTINCT 函式OracleAPP函式