Oracle vs PostgreSQL,研發注意事項(12) - 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           134688TEST-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 explainTEST-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一致.        鄭州不孕不育醫院:http://byby.zztjyy.com/yiyuanzaixian/zztjyy//

testdb=# insert into tbl1 select generate_series(1,100000);INSERT 0 100000testdb=# 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 INDEXtestdb=# 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.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章