久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Oracle與PostgreSQL的NULL和索引使用區別是什么

159次閱讀
沒有評論

共計 3961 個字符,預計需要花費 10 分鐘才能閱讀完成。

這篇文章主要講解了“Oracle 與 PostgreSQL 的 NULL 和索引使用區別是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“Oracle 與 PostgreSQL 的 NULL 和索引使用區別是什么”吧!

Oracle 在創建索引時, 不會存儲 NULL 值, 而 PostgreSQL 在創建索引時則會存儲 NULL 值. 在查詢時, 如使用 Column is null 這樣的條件查詢,Oracle 不會使用索引而 PostgreSQL 則會使用索引.

Oracle
插入數據,200w 多行的數據, 然后插入一行值為 null 的數據.

TEST-orcl@DESKTOP-V430TU3 create table tbl1(id int);
Table created.
TEST-orcl@DESKTOP-V430TU3 create global temporary table tmp(id int);
Table created.
TEST-orcl@DESKTOP-V430TU3 insert into tmp select rownum from dba_objects;
133456 rows created.
TEST-orcl@DESKTOP-V430TU3 insert into tmp select * from tmp;
133455 rows created.
TEST-orcl@DESKTOP-V430TU3 /
266910 rows created.
TEST-orcl@DESKTOP-V430TU3 /
533820 rows created.
TEST-orcl@DESKTOP-V430TU3 /
1067640 rows created.
TEST-orcl@DESKTOP-V430TU3 insert into tbl1 select * from tmp;
2135296 rows created.
TEST-orcl@DESKTOP-V430TU3 commit;
Commit complete.
TEST-orcl@DESKTOP-V430TU3 exec dbms_stats.gather_table_stats(TEST , TBL1 ,cascade= true);
PL/SQL procedure successfully completed.
TEST-orcl@DESKTOP-V430TU3 select index_name,index_type,blevel,leaf_blocks,num_rows,status,distinct_keys from user_indexes where table_name= TBL1 
INDEX_NAME INDEX_TYPE BLEVEL
------------------------------ --------------------------- ----------
LEAF_BLOCKS NUM_ROWS STATUS DISTINCT_KEYS
----------- ---------- -------- -------------
IDX_TBL1_ID NORMAL 2
 4662 2103843 VALID 134688
TEST-orcl@DESKTOP-V430TU3 insert into tbl1 values(null);
1 row created.
TEST-orcl@DESKTOP-V430TU3 commit;
Commit complete.
TEST-orcl@DESKTOP-V430TU3 
TEST-orcl@DESKTOP-V430TU3 exec dbms_stats.gather_table_stats(TEST , TBL1 ,cascade= true);
PL/SQL procedure successfully completed.
TEST-orcl@DESKTOP-V430TU3 select index_name,index_type,blevel,leaf_blocks,num_rows,status,distinct_keys from user_indexes where table_name= TBL1 
INDEX_NAME INDEX_TYPE BLEVEL
------------------------------ --------------------------- ----------
LEAF_BLOCKS NUM_ROWS STATUS DISTINCT_KEYS
----------- ---------- -------- -------------
IDX_TBL1_ID NORMAL 2
 4771 2152683 VALID 134688

執行查詢

TEST-orcl@DESKTOP-V430TU3 set autotrace on explain
TEST-orcl@DESKTOP-V430TU3 select * from tbl1 where id is null;
 ID
----------
Execution Plan
----------------------------------------------------------
Plan hash value: 312383637
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 898 (2)| 00:00:11 |
|* 1 | TABLE ACCESS FULL| TBL1 | 1 | 5 | 898 (2)| 00:00:11 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 1 - filter(ID  IS NULL)
TEST-orcl@DESKTOP-V430TU3

PostgreSQL
數據表 tbl1 結構與 Oracle 一致.

testdb=# insert into tbl1 select generate_series(1,100000);
INSERT 0 100000
testdb=# explain (analyze,verbose) select * from tbl1 where id is null;
 QUERY PLAN 
--------------------------------------------------------------------------------------------------------
 Seq Scan on public.tbl1 (cost=0.00..1569.33 rows=11 width=4) (actual time=26.052..130.752 rows=1 loops=1)
 Output: id
 Filter: (tbl1.id IS NULL)
 Rows Removed by Filter: 110000
 Planning Time: 1.403 ms
 Execution Time: 130.814 ms
(6 rows)
testdb=# create index idx_tb1_id on tbl1(id);
CREATE INDEX
testdb=# explain (analyze,verbose) select * from tbl1 where id is null;
 QUERY PLAN 
--------------------------------------------------------------------------------------------------------
 Index Only Scan using idx_tb1_id on public.tbl1 (cost=0.42..8.56 rows=4 width=4) (actual time=0.133..0.136 rows=1 loops=1)
 Output: id
 Index Cond: (tbl1.id IS NULL)
 Heap Fetches: 1
 Planning Time: 1.512 ms
 Execution Time: 0.199 ms
(6 rows)

使用 id is null 進行查詢, 使用的是 Index Only Scan.

感謝各位的閱讀,以上就是“Oracle 與 PostgreSQL 的 NULL 和索引使用區別是什么”的內容了,經過本文的學習后,相信大家對 Oracle 與 PostgreSQL 的 NULL 和索引使用區別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-24發表,共計3961字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 岐山县| 偃师市| 永年县| 维西| 宜丰县| 双峰县| 潜江市| 安徽省| 常宁市| 东山县| 扶余县| 扎囊县| 荣成市| 贵州省| 措美县| 天津市| 商城县| 峨山| 昆山市| 乌鲁木齐市| 娱乐| 法库县| 内黄县| 潼南县| 乌什县| 南投市| 巴彦淖尔市| 长葛市| 阳谷县| 依安县| 金溪县| 西乌珠穆沁旗| 芒康县| 仁布县| 嘉鱼县| 如皋市| 日土县| 万荣县| 离岛区| 宁国市| 循化|