Oracle和PostgreSQL在使用NULL和索引方面有什么区别?

分类:编程技术 时间:2024-02-20 15:50 浏览:0 评论:0
0
本文主要讲解《Oracle和PostgreSQL中NULL和索引的使用有什么区别》。文章中的解释简单明了,易于学习和理解。请跟随小编的思路慢慢深入,一起研究学习《Oracle和PostgreSQL中NULL和索引使用有什么区别?》

Oracle在创建索引时不会存储NULL值,而PostgreSQL在创建索引时会存储NULL值。查询时,如果使用Column is null等条件查询,Oracle将不会使用索引。 PostgreSQL会使用索引。

Oracle
插入数据,200万行数据,然后插入一行空值数据。

< pre >TEST-orcl@DESKTOP-V430TU3>创建表 tbl1(id int);表已创建。TEST-orcl@DESKTOP-V430TU3>创建全局临时表 tmp(id int);表已创建。TEST-orcl@DESKTOP-V430TU3>插入 TMP 从 DBA_OBJECTS 选择 Rownum; 133456 行已创建。测试-ORCL@desktop-V430tu3> 插入 TMP 从 TMP 选择*; 133455 行已创建。TEST-ORC l@Desktop-V430TU3>/266910 行已创建。TEST-ORCl@desktop-V430TU3>/533820 行已创建。TEST-orcl@DESKTOP-V430TU3>/1067640 行已创建。TEST-orcl@DESKTOP- V430TU3>insert 到 tbl1 select * from tmp;创建了 2135296 行。TEST-orcl@DESKTOP-V430TU3>commit;提交完成。TEST-orcl@DESKTOP-V430TU3>exec dbms_stats.gather_table_stats('TEST','TBL1',cascade= > true);PL/SQL 过程成功完成。TEST-orcl@DESKTOP-V430TU3>从 user_indexes 中选择 index_name、index_type、blevel、leaf_blocks、num_rows、status、distinct_keys,其中 table_name='TBL1';INDEX_NAME INDEX_TYPE                BLEVEL----- - ------------------------------------------------- ---- - ----------LEAF_BLOCKS NUM_ROWS 状态 DISTINCT_KEYS------------ ---------- -------- -- ----- ------IDX_TBL1_ID NORMAL 2 4662 2103843 VALID 134688TEST-orcl@DESKTOP-V430 TU3>插入 tbl1 值(空);创建 1 行。TEST-orcl@DESKTOP-V430TU3>提交;提交完整.TEST-orcl@DESKTOP -V430TU3>TEST-orcl@DESKTOP-V430TU3>exec dbms_stats.gather_table_stats('TEST','TBL1',cascade=>true);PL/SQL 过程成功完成。TEST-orcl@DESKTOP-V430TU3>从 user_indexes 中选择 index_name、index_type、blevel、leaf_blocks、num_rows、status、distinct_keys,其中 table_name='TBL1';INDEX_NAME                                                                INDEX_TYPE                                                                                                                                                                                                             INDEX_TYPE ------------------ ------ ----LEAF_BLOCKS NUM_ROWS 状态 DISTINCT_KEYS-------------------------------- --------------------------IDX_TBL1_ID NORMAL 2 4771 2152683 VALID   134688

执行查询

TEST-orcl@DESKTOP-V430TU3>在explainTEST-orcl@DESKTOP-V430TU3上设置自动跟踪>select * from tbl1 where id is null; ID----------执行计划------------------------------------ - -  -  -  -  -  -  -  -  -  - 计划哈希值:312383637-------------------------------------------------------- ------------------------------------------------|身份证 |操作                                                             ----------------------------------------| 0 |选择语句 | | 1 1 | 1 5 | 898(2)| 00:00:11 ||* 1 |表访问已满| TBL1 | 1 | 5 | 898(2)| 00:00:11 |------------------------------------ -------------------- ------------------------------谓词信息(通过操作id标识):------------ ---------------------------------- --------- 1 - 过滤器("ID" IS NULL)TEST-orcl@DESKTOP-V430TU3>

PostgreSQL
数据表tbl1结构与Oracle一致。

testdb=# insert into tbl1 selectgenerate_series(1,100000);INSERT 0 100000testdb=#explain (analyze,verbose) select * from tbl1 where id is null; -------------------------------------------------- --------对public.tbl1进行顺序扫描(成本=0.00..1569.33行=11宽度=4)(实际时间=26.052..130.752行=1循环=1)输出:id 过滤器: (tbl1.id IS NULL) 过滤器删除的行数: 110000 计划时间: 1.403 毫秒 执行时间: 130.814 毫秒(6 行)testdb=# 在 tbl1(id) 上创建索引 idx_tb1_id;CREATE INDEXtestdb=# 解释 (analyze,详细) select * from tbl1 where id is null;自从  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - - - -------------------------------- 仅使用 idx_tb1_id 对 public.tbl1 进行索引扫描(成本=0.42..8.56 行) =4宽度=4)(实际时间=0.133..0.136行=1循环=1)输出:id索引条件:(tbl1.id IS NULL)堆获取:1计划时间:1.512毫秒执行时间:0.199毫秒(6 rows)

使用 id is null 进行查询,并使用 Index Only Scan。

感谢您的阅读。以上就是《Oracle和PostgreSQL中NULL和索引的使用有什么区别》的内容。看完文章相信大家对于“N的使用有什么区别”这个问题有了一定的了解Oracle和PostgreSQL中的ULL和索引》更深刻的理解和具体使用需要通过实践来验证。这里,小编将为大家推送更多相关知识点的文章,欢迎关注!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Oracle和PostgreSQL在使用NULL和索引方面有什么区别?

用户评论