Oracle12c中效能最佳化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值計數函式
Oracle11g中,為了改善DBMS_STATS包收集統計資訊時的唯一值計數功能,增加了 APPROX_COUNT_DISTINCT函式,但文件中未記載。Oracle12c文件中包括了該函式,因此,我們現在可以在應用中隨意使用它。
1. 基本用法
先前的資料庫版本中,如果我們想進行唯一值計數,我們可能會這麼做。
SELECT COUNT(DISTINCT c_name) AS nm_cnt
FROM test;
NM_CNT
----------
58172
1 row selected.
SQL>
該查詢會基於Oracle的讀一致模型得出精確的唯一值結果。即,我們會看到已提交的資料,及當前會話做的未提交修改。
相反,新函式APPROX_COUNT_DISTINCT不會給出精確結果,但會和精確結果有所偏差。
SELECT APPROX_COUNT_DISTINCT(c_name) AS nm_cnt
FROM test;
NM_CNT
----------
56789
1 row selected.
SQL>
該函式能用於分組查詢中。
SELECT tablespace_name,APPROX_COUNT_DISTINCT(table_name) AS tab_count
FROM user_tables
GROUP BY tablespace_name
ORDER BY tablespace_name;
TABLESPACE_NAME TAB_COUNT
------------------------------ ----------
SYSAUX 78
SYSTEM 22
USERS 7
48
4 rows selected.
SQL>
2. 效能
下例中,我們會看到兩種方法效能的差別,但似乎不是特別大。
SET TIMING ON
SELECT COUNT(DISTINCT c_name) AS nm_cnt
FROM test;
NM_CNT
----------
58172
1 row selected.
Elapsed: 00:00:02.39
SQL>
SELECT APPROX_COUNT_DISTINCT(c_name) AS nm_cnt
FROM test;
NM_CNT
----------
56789
1 row selected.
Elapsed: 00:00:02.00
SQL>
事實上,APPROX_COUNT_DISTINCT函式被用來處理大得多的負載,下面,我們建立一個大得多的表。
DROP TABLE test PURGE;
CREATE TABLE test AS
SELECT level AS data
FROM dual
CONNECT BY level <= 10000;
INSERT /*+ APPEND */ INTO test
SELECT a.data FROM test a
CROSS JOIN test b;
COMMIT;
EXEC DBMS_STATS.gather_table_stats(‘Test’,'Test');
現在表中有100多萬資料,1萬個唯一值。我們會看到兩種方法的效能差別比較大。
SET TIMING ON
SELECT COUNT(DISTINCT data) AS data_count
FROM test;
DATA_COUNT
----------
10000
1 row selected.
Elapsed: 00:00:19.66
SQL>
SELECT APPROX_COUNT_DISTINCT(data) ASdata_count
FROM test;
DATA_COUNT
----------
10030
1 row selected.
Elapsed: 00:00:10.46
SQL>
透過測試會發現,之前的方法,當資料量越來越大時,消耗的時間和資源也會越來越大,而新函式APPROX_COUNT_DISTINCT在資料量越來越大時,消耗的時間和資源基本不變。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2120389/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 12c新特性之:APPROX_COUNT_DISTINCT 函式OracleAPP函式
- Oracle12c中效能最佳化&功能增強新特性之臨時undoOracle
- [重慶思莊每日技術分享]-oracle12c新特性 去重統計函式APPROX_COUNT_DISTINCTOracle函式APP
- Oracle12c中效能最佳化&功能增強新特性之重大突破——記憶體列儲存新特性Oracle記憶體
- Oracle12c中SQL最佳化(SQL TUNING)新特性之SQL計劃指令OracleSQL
- Oracle12c中容錯&效能新特性之表空間組Oracle
- Oracle12c中效能最佳化增強新特性之資料庫智慧快閃記憶體Oracle資料庫記憶體
- Oracle12c中SQL最佳化新特性之自動重最佳化(automatic reoptimization)OracleSQL
- Oracle12c新特性之基本操作Oracle
- java8 新特性之函式式介面Java函式
- JDK8新特性之函式式介面JDK函式
- PHP 7.4 新特性之箭頭函式PHP函式
- PHP新特性之閉包、匿名函式PHP函式
- 函式中引數傳值函式
- Oracle12c中效能最佳化&功能增強新特性之全域性索引DROP和TRUNCATE 分割槽的非同步維護Oracle索引非同步
- Oracle12c中PL/SQL(DBMS_SQL)新特性之隱式語句結果OracleSQL
- Oracle 11g 中SQL效能最佳化新特性之SQL效能分析器(SQLPA)OracleSQL
- Java8新特性探索之函式式介面Java函式
- 3.5 新增新函式函式
- oracle12c中新能最佳化新特性之熱度圖和自動資料最佳化Oracle
- JDK 8 新特性之函數語言程式設計 → Stream APIJDK函數程式設計API
- 07:函式之函式的引數和返回值函式
- Oracle12c 中RAC功能增強新特性之ASM&GridOracleASM
- 【Mysql】MySQL 5.7新特性之Generated Column(函式索引)MySql函式索引
- oracle 21c 新特性之 CHECKSUM 分析函式Oracle函式
- Oracle12c中功能及效能新特點之with子句的增強Oracle
- Oracle11.2新特性之listagg函式Oracle函式
- Oracle 12cR1中效能最佳化新特性之全資料庫緩衝模式Oracle資料庫模式
- 函式(三)作用域之變數作用域、函式巢狀中區域性函式作用域、預設值引數作用域函式變數巢狀
- Java8 新特性 —— 函數語言程式設計Java函數程式設計
- Oracle12C新特性_DDL日誌Oracle
- Java8的新特性--函式式介面Java函式
- Spring 5 新特性:函式式Web框架Spring函式Web框架
- Oracle11g新特性 - 快速線上新增not null欄位OracleNull
- Oracle12c功能增強 新特性之管理功能的增強Oracle
- 函式的祕密之 函式返回值函式
- oracle12c新特性列舉說明Oracle
- oracle12c新特性(5)- 臨時undoOracle