交換分割槽之without validation
看了 全面學習分割槽表及分割槽索引(10)--交換分割槽 這篇,最後是關於使用了without validation子句後,不會再驗證資料的有效性。究竟使用不當會有什麼結果,試下。
(所用的表是 全面學習分割槽表及分割槽索引(10)--交換分割槽 的表)。
SQL> select * from v$version; BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE 10.2.0.5.0 Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production
create table t_partition_range (id number,name varchar2(50)) partition by range(id)(
partition t_range_p1 values less than (10) ,
partition t_range_p2 values less than (20),
partition t_range_p3 values less than (30) ,
partition t_range_pmax values less than (maxvalue)
);
insert into t_partition_range values (11,'a');
insert into t_partition_range values (12,'b');
insert into t_partition_range values (13,'c');
commit;
insert into t_partition_range_tmp values (15,'d');
insert into t_partition_range_tmp values (16,'e');
insert into t_partition_range_tmp values (17,'d');
commit;
SQL> select * from t_partition_range partition(t_range_p2); ID NAME SQL> select * from t_partition_range_tmp; ID NAME --和分割槽1交換
SQL> alter table t_partition_range exchange partition t_range_p1 2 with table t_partition_range_tmp ; with table t_partition_range_tmp * ERROR at line 2: ORA-14099: all rows in table do not qualify for specified partition
--和分割槽1交換,加上without validation SQL> alter table t_partition_range exchange partition t_range_p1
2 with table t_partition_range_tmp without validation; Table altered.
SQL> select * from t_partition_range partition(t_range_p1);
ID NAME
---------- -------------------------------------------------- 15 d 16 e 17 d 8 g SQL> set autotrace on
SQL> select * from t_partition_range where id>10; ID NAME
---------- -------------------------------------------------- 11 a 12 b 13 c Execution Plan ---------------------------------------------------------- Plan hash value: 955328034 --------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | 120 | 3 (0)| 00:00:01 | | | | 1 | PARTITION RANGE ITERATOR| | 3 | 120 | 3 (0)| 00:00:01 | 2 | 4 | |* 2 | TABLE ACCESS FULL | T_PARTITION_RANGE | 3 | 120 | 3 (0)| 00:00:01 | 2 | 4 | -------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - filter("ID">10)
Note
----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 5 recursive calls 0 db block gets 30 consistent gets 0 physical reads 0 redo size 639 bytes sent via SQL*Net to client 488 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 3 rows processed SQL> select * from t_partition_range; ID NAME
---------- -------------------------------------------------- 15 d 16 e 17 d 8 g 11 a 12 b 13 c 7 rows selected.
可以看到,當查詢where id>10時,使用分割槽特性過濾了分割槽1,掃描了2-4。 一個分割槽裡存在著不屬於這個分割槽的資料,查詢查不到一些本該查到的資料。 這就是without validation使用不慎的結果吧。 最後,再看這個 SQL> select * from t_partition_range partition(t_range_p1) where id>10; ID NAME
------------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): 2 - filter("ID">10) Note
按照分割槽表的定義,其實這個分割槽不該有大於10的資料。當然剛剛製造了些。Oracle在這裡以及之前的查詢都有一個 filter("ID">10),或者這樣更可靠些?畢竟存在著不該出現的資料的可能。 不加 without validation子時,會檢驗 資料的有效性 ,是做了全表掃描麼(如果對應id如有索引呢?)?如果需要做全表掃描,還很快麼? |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23650854/viewspace-693878/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- linux交換分割槽Linux
- unbuntu新增交換分割槽
- linux交換分割槽調整Linux
- Ubuntu 啟用交換分割槽Ubuntu
- oracle分割槽交換(exchange)技術Oracle
- 交換分割槽時報錯:ORA-14098
- 雲端計算:交換分割槽管理 Swap
- Linux下swap(交換分割槽)的增刪改Linux
- Seven 儲存結構與磁碟劃分 主分割槽交換分割槽的作用!
- [20190503]12C R2 分割槽交換.txt
- 非分割槽錶轉換成分割槽表
- Oracle 12.2之後ALTER TABLE .. MODIFY轉換非分割槽表為分割槽表Oracle
- Linux交換分割槽相關都有哪些命令?Linux運維基礎Linux運維
- oracle交換分割槽所引起的索引失效問題探究測試Oracle索引
- MySql資料分割槽操作之新增分割槽操作MySql
- 非分割槽錶轉換成分割槽表以及注意事項
- 如何檢視 Linux 下 CPU、記憶體和交換分割槽的佔用率?Linux記憶體
- 分割槽表之自動增加分割槽(11G)
- Linux分割槽之parted命令Linux
- linux之硬碟分割槽管理Linux硬碟
- linux系統swappiness引數在記憶體與交換分割槽間最佳化LinuxAPP記憶體
- 雲端計算學習路線教程大綱課件:交換分割槽管理 Swap
- Linux核心之磁碟和分割槽Linux
- Linux分割槽方案、分割槽建議Linux
- MapReduce之自定義分割槽器Partitioner
- oracle分割槽表和分割槽表exchangeOracle
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- Linux 分割槽擴容(根分割槽擴容,SWAP 分割槽擴容,掛載新分割槽為目錄)Linux
- 小白自制Linux開發板 五. Debian檔案系統製作,以及WIFI配置、交換分割槽配置LinuxWiFi
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- oracle分割槽表和非分割槽表exchangeOracle
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- LightDB 22.4 新特性之相容Oracle線上轉換普通表為分割槽表Oracle
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- openGauss 分割槽
- mysql 分割槽MySql
- 分割槽Partition
- lvs 分割槽
- Kafka 分割槽Kafka