【SQL】Oracle交換分割槽中引數without validation引發的症狀(二)
前面我們知道無法查出資料原因了,詳情請參考http://blog.itpub.net/29487349/viewspace-1764438/ 【SQL】Oracle交換分割槽中引數without validation引發的症狀(一)
這次是透過實驗測試,下面呈現環境部署:
建立一個分割槽表(SCOTT使用者)
點選(此處)摺疊或開啟
-
create table emp_p(EMPNO number(4),ENAME varchar2(10),job varchar2(9),mgr number(4),hiredate date,sal number(7,2),comm number(7,2),deptno number(2))
-
partition by range(empno)
-
(partition p1 values less than(7000),
-
partition p2 values less than (8000)
- partition p3 values less than (9000));
該分割槽表與表EMP進行資料交換:
點選(此處)摺疊或開啟
- alter table emp_p exchange partition p1 with table emp without validation; --這裡我新增了不驗證資料
分析表,並檢視該表無效資料:
點選(此處)摺疊或開啟
-
SQL> @?/rdbms/admin/utlvalid.sql
- SQL> analyze table scott.emp_p partition(p1) validate structure
- -----
-
SQL> col owner_name for a10
SQL> select * from invalid_rows;
OWNER_NAME TABLE_NAME PARTITION_NAME SUBPARTITION_NAME HEAD_ROWID ANALYZE_TIMESTAMP
---------- --------------- ------------------------------ ------------------------------ ------------------ -------------------
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAA 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAB 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAC 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAD 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAE 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAF 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAG 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAH 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAI 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAJ 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAK 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAL 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAM 2015-08-06 15:40:50
SCOTT EMP_P P1 N/A AAAVRiAAEAAAACXAAN 2015-08-06 15:40:50
這是還原問題,再診斷輕鬆、容易太多,當真出現該問題時,也許需要耗費更多東西,也就促使我們不斷學習,掌握更多方法。此次試驗過程如有其他問題,請聯絡,一起進步。
下面是透過另一種方式呈現該問題:
點選(此處)摺疊或開啟
-
SQL> create table test (id int,name varchar2(30));
-
-
Table created.
- SQL> alter table test add primary key(id);
-
Table altered.
-
SQL> exec sys.DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE('test_emp_rewrite','select * from test where id=1','select * from test where 1=2');
-
-
PL/SQL procedure successfully completed.
-
-
SQL> insert into test values(1,'firsoul');
-
-
1 row created.
-
-
SQL> commit;
-
SQL> alter session set query_rewrite_integrity=trusted;
-
-
Session altered.
-
-
SQL> select * from test where id=1;
-
-
no rows selected
-
-
SQL> select * from test where to_char(id)=1;
-
-
ID NAME
-
---------- ------------------------------
-
1 firsoul
-
- SQL>
我們看看該兩條語句的執行計劃:
點選(此處)摺疊或開啟
-
SQL> explain plan for select * from test where id=1;
-
-
Explained.
-
-
SQL> select * from table(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
------------------------------------------------------------------------------------------------------------------------
-
Plan hash value: 766971379
-
-
---------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
---------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 1 | 30 | 0 (0)| |
-
|* 1 | FILTER | | | | | |
-
| 2 | TABLE ACCESS FULL| TEST | 1 | 30 | 3 (0)| 00:00:01 |
-
---------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
-
1 - filter(NULL IS NOT NULL)
-
-
Note
-
-----
-
- dynamic sampling used for this statement (level=2)
-
-
18 rows selected.
-
-
SQL> explain plan for select * from test where to_char(id)=1;
-
-
Explained.
-
-
SQL> select * from table(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
------------------------------------------------------------------------------------------------------------------------
-
Plan hash value: 1357081020
-
-
--------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
--------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 1 | 30 | 3 (0)| 00:00:01 |
-
|* 1 | TABLE ACCESS FULL| TEST | 1 | 30 | 3 (0)| 00:00:01 |
-
--------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
-
1 - filter(TO_NUMBER(TO_CHAR("ID"))=1)
-
-
Note
-
-----
-
- dynamic sampling used for this statement (level=2)
-
-
17 rows selected.
-
- SQL>
附,Oracle大牛老楊說的幾種實現的方法,有興趣的可以看看:
構建表和索引資料衝突;構建不滿足約束條件的表記錄;構建不滿足分割槽條件的資料;高階查詢重寫;DB FIREWALL;方法應該還有很多。
文盲筱燁 2015年8月7日
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29487349/viewspace-1764509/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SQL】Oracle交換分割槽中引數without validation引發的症狀(一)SQLOracle
- 交換分割槽之without validation
- WITH VALIDATION 與WITHOUT VALIDATION對分割槽交換的影響
- 分割槽表中的maxvalue引數設定
- oracle之分割槽交換Oracle
- oracle儲存過程將引數字串分割sqlOracle儲存過程字串SQL
- 重建Windows引導分割槽Windows
- 交換2個整形數引發的思考
- oracle分割槽交換(exchange)技術Oracle
- Oracle Vs MsSQL 之交換分割槽OracleSQL
- linux系統swappiness引數在記憶體與交換分割槽間優化LinuxAPP記憶體優化
- 使用預計算分割槽優化引數化優化
- pl/sql中的引數模式SQL模式
- linux系統swappiness引數在記憶體與交換分割槽間最佳化LinuxAPP記憶體
- 11g中的"_memory_imm_mode_without_autosga"引數
- oracle分割槽索引(二)Oracle索引
- 網路分割槽引發的oplog亂序問題
- 一個bug引發的Android分割槽儲存的思考Android
- unbuntu新增交換分割槽
- linux交換分割槽Linux
- 全面學習分割槽表及分割槽索引(10)--交換分割槽索引
- Qt 訊號槽如何傳遞引數(或帶引數的訊號槽)QT
- oracle 之全文索引表的分割槽交換案例Oracle索引
- 檢視Oracle隱藏引數的SQLOracleSQL
- Oracle引數-隱藏引數Oracle
- oracle 交換分割槽歷史資料歸檔Oracle
- oracle實用sql(14)--查詢分割槽表的分割槽列和子分割槽列OracleSQL
- oracle中的processes,session,transaction引數OracleSession
- Ubuntu 啟用交換分割槽Ubuntu
- Oracle中INITRANS和MAXTRANS引數Oracle
- oracle 引數Oracle
- oracle分割槽表學習(二)Oracle
- 選購交換機的引數依據和主要的引數指標詳解指標
- C#中的值引數,引用引數及輸出引數C#
- Oracle 是分割槽表,但條件不帶分割槽條件的SQLOracleSQL
- 使用PARTITION_OPTIONS引數控制資料泵分割槽表匯入
- 查詢oracle中的隱形引數Oracle
- Oracle升級中的引數補充Oracle