交換分割槽之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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WITH VALIDATION 與WITHOUT VALIDATION對分割槽交換的影響
- 【SQL】Oracle交換分割槽中引數without validation引發的症狀(二)SQLOracle
- 【SQL】Oracle交換分割槽中引數without validation引發的症狀(一)SQLOracle
- oracle之分割槽交換Oracle
- linux交換分割槽Linux
- unbuntu新增交換分割槽
- 全面學習分割槽表及分割槽索引(10)--交換分割槽索引
- Ubuntu 啟用交換分割槽Ubuntu
- oracle 之全文索引表的分割槽交換案例Oracle索引
- linux交換分割槽調整Linux
- oracle分割槽交換(exchange)技術Oracle
- 擴充套件aix交換分割槽套件AI
- Oracle Vs MsSQL 之交換分割槽OracleSQL
- 雲端計算:交換分割槽管理 Swap
- 【LINUX學習】設定交換分割槽Linux
- aix擴充 交換分割槽的步驟AI
- Linux SWAP 交換分割槽配置說明Linux
- 不用swap分割槽,用交換檔案(轉)
- Seven 儲存結構與磁碟劃分 主分割槽交換分割槽的作用!
- 使用 fdisk 和 fallocate 命令建立交換分割槽
- Linux Swap交換分割槽介紹總結Linux
- oracle 交換分割槽歷史資料歸檔Oracle
- AIX 管理交換分割槽經常用到的命令AI
- MySql資料分割槽操作之新增分割槽操作MySql
- Oracle分割槽之五:建立分割槽索引總結Oracle索引
- 【實驗】【PARTITION】交換分割槽時分割槽表有主鍵目標表亦需有主鍵
- Linux下swap(交換分割槽)的增刪改Linux
- 【Solaris】Solaris檔案系統管理2 SWAP交換分割槽管理
- [引用分割槽表]Oracle 11g新特性之引用分割槽表Oracle
- linux之硬碟分割槽管理Linux硬碟
- Linux分割槽之parted命令Linux
- 如何查詢分割槽表的分割槽及子分割槽
- PLSQL根據分割槽表的分割槽名批次truncate分割槽SQL
- Linux主分割槽,擴充套件分割槽,邏輯分割槽Linux套件
- oracle交換分割槽所引起的索引失效問題探究測試Oracle索引
- Oracle分割槽表及分割槽索引Oracle索引
- INTERVAL分割槽表鎖分割槽操作
- Oracle帶區域性分割槽索引的分割槽表刪除舊分割槽新增新分割槽Oracle索引