Oracle 12c新特性之:APPROX_COUNT_DISTINCT 函式
在Oracle 11g中,已經新增APPROX_COUNT_DISTINCT函式,但相關文件中沒有體現,用於提高使用DBMS_STATS包收集統計資訊時計算不同值(NDV)數量的速度。 Oracle資料庫12c(12.1.0.2)中,文件中已經包含了此函式,因此我們可以在應用程式中將其作為支援的SQL函式使用。
基本用法
在以前的資料庫版本中,如果我們想要執行不同值的計數,我們可能會做如下。
SELECT COUNT(DISTINCT object_name) AS obj_count
FROM all_objects;
OBJ_COUNT
----------
47171
1 row selected.
SQL>
此查詢為我們提供了基於Oracle的讀一致性模型的不同值的確切計數。 因此,我們可以看到所有提交的資料,以及當前會話提交的任何未提交的更改。
相比之下,新的APPROX_COUNT_DISTINCT函式不提供準確的結果,但應該給出“可以忽略不計的精確結果”。
SELECT APPROX_COUNT_DISTINCT(object_name) AS obj_count
FROM all_objects;
OBJ_COUNT
----------
46788
1 row selected.
SQL>
該函式也可以用作組查詢的一部分。
SELECT tablespace_name, APPROX_COUNT_DISTINCT(table_name) AS tab_count
FROM all_tables
GROUP BY tablespace_name
ORDER BY tablespace_name;
TABLESPACE_NAME TAB_COUNT
------------------------------ ----------
SYSAUX 73
SYSTEM 36
USERS 7
44
4 rows selected.
SQL>
效能
即使在下面的簡單示例中,我們可以看到兩種方法的速度的可重複的差異,但是效能差異似乎不太引人注目。
SET TIMING ON
SELECT COUNT(DISTINCT object_name) AS obj_count
FROM all_objects;
OBJ_COUNT
----------
47171
1 row selected.
Elapsed: 00:00:02.39
SQL>
SELECT APPROX_COUNT_DISTINCT(object_name) AS obj_count
FROM all_objects;
OBJ_COUNT
----------
46788
1 row selected.
Elapsed: 00:00:02.00
SQL>
實際上,APPROX_COUNT_DISTINCT函式旨在處理比這更大的工作負載,因此我們可以建立一個更大的表來測試。
DROP TABLE t1 PURGE;
CREATE TABLE t1 AS
SELECT level AS data
FROM dual
CONNECT BY level <= 10000;
INSERT /*+ APPEND */ INTO t1
SELECT a.data FROM t1 a
CROSS JOIN t1 b;
COMMIT;
EXEC DBMS_STATS.gather_table_stats(USER,'T1');
現在我們有一個表,有一個超過1億行和10,000不同的值。 現在我們可以看到兩種方法的效能差異更為顯著。
SET TIMING ON
SELECT COUNT(DISTINCT data) AS data_count
FROM t1;
DATA_COUNT
----------
10000
1 row selected.
Elapsed: 00:00:19.66
SQL>
SELECT APPROX_COUNT_DISTINCT(data) AS data_count
FROM t1;
DATA_COUNT
----------
10050
1 row selected.
Elapsed: 00:00:10.46
SQL>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29337971/viewspace-2130193/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 12c新特性之Sequence的Session特性OracleSession
- Oracle 12c 新特性之 temp undoOracle
- oracle 21c 新特性之 CHECKSUM 分析函式Oracle函式
- Oracle12c中效能最佳化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值計數函式OracleAPP函式
- Oracle 12C 新特性之級聯truncateOracle
- Oracle 12C 新特性之 恢復表Oracle
- Oracle 12C R2-新特性-轉換函式的增強Oracle函式
- Oracle 12c新特性Oracle
- Oracle11.2新特性之listagg函式Oracle函式
- oracle 12c 新特性之不可見欄位Oracle
- oracle 12C 新特性之臨時undo控制Oracle
- Oracle 12c 新特性(四)Oracle
- Oracle 12c 新特性(三)Oracle
- Oracle 12c 新特性(二)Oracle
- Oracle 12c 新特性(一)Oracle
- java8 新特性之函式式介面Java函式
- JDK8新特性之函式式介面JDK函式
- [重慶思莊每日技術分享]-oracle12c新特性 去重統計函式APPROX_COUNT_DISTINCTOracle函式APP
- PHP 7.4 新特性之箭頭函式PHP函式
- PHP新特性之閉包、匿名函式PHP函式
- Java8新特性探索之函式式介面Java函式
- Oracle 12C新特性-History命令Oracle
- Oracle 12c 兩個新特性Oracle
- Oracle 12C新特性In-MemoryOracle
- Oracle GoldenGate 12c 新特性OracleGo
- Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHEDOracleIndexBAT
- Oracle 12c新特性--ASMFD(ASM Filter Driver)特性OracleASMFilter
- Oracle 12c DG新特性Far SyncOracle
- ORACLE 12C新特性——CDB與PDBOracle
- 12c RMAN新特性之Recover Table
- Oracle 12c 新特性之臨時Undo--temp_undo_enabledOracle
- Oracle goldengate 12c 新特性之完美支援Active Data GuardOracleGo
- Oracle 12C 新特性之表分割槽部分索引(Partial Indexes)Oracle索引Index
- Oracle 12C 新特性之 sqlplus檢視History命令OracleSQL
- Oracle 12C 新特性之資料檔案線上遷移Oracle
- 【Mysql】MySQL 5.7新特性之Generated Column(函式索引)MySql函式索引
- Oracle 12C新特性-RMAN恢復表Oracle
- 12c新特性-Oracle Sharding簡介Oracle