關於分區的高可用性實驗

今天看Concepts第四章 分區時

其中有一個特性:

  • Increased availability

    The unavailability of a partition does not entail the unavailability of the object. The query optimizer automatically removes unreferenced partitions from the query planso queries are not affected when the partitions are unavailable.

對其中的含義不太明確(還要謝謝dingjun123兔子哥的提醒)

經過實驗以後,這段文本的譯文變成如下:

          一個分區的不可用,不會導致整個對象的不可用。比如查詢某個表,當返回的數據(通過where條件判斷)不可能會存在一個分區,則CBO不會對這個分區訪問,而當這個分區損壞時,因爲CBO生成的執行計劃中並沒有去訪問這個分區,那麼語句看起來和執行起來都是正常的。

實驗如下:

過程簡述:1、創建分區表,且放入不同表空間。2、將其中一個表空間offline,造成分區不可用的現象。3、分別使用不同的where條件查詢


一、創建分區表,每個分區都插入數據:

SQL> create table test_part(no number) partition by range(no)(
partition part1 values less than (5) tablespace test,
partition part2 values less than (10),
partition part3 values less than (maxvalue));

Table created.

SQL> insert into test_part values(1);

1 row created.

SQL> insert into test_part values(9);

1 row created.

SQL> insert into test_part values(11);

1 row created.

SQL> commit;
查看一下:
SQL> select segment_name,partition_name from user_segments where segment_name='TEST_PART';

SEGMENT_NAME	     PARTITION_NAME
-------------------- ------------------------------
TEST_PART	     PART1
TEST_PART	     PART2
TEST_PART	     PART3

二、將test表空間offline

SQL> alter tablespace test offline;

Tablespace altered

三、使用不同sql訪問test_part表

    1、請求的數據包含 不可用 的表分區時  結論:會報錯

SQL> select * from test_part;  --數據包含了第一個表分區 <5的值
select * from test_part
              *
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/test.dbf'

執行計劃如下,可以看到從 第一個分區掃描到第三個分區
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3584404593

-------------------------------------------------------------------------------------------------
| Id  | Operation	    | Name	| Rows	| Bytes | Cost (%CPU)| Time	| Pstart| Pstop |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |		|   246 |  3198 |     2   (0)| 00:00:01 |	|	|
|   1 |  PARTITION RANGE ALL|		|   246 |  3198 |     2   (0)| 00:00:01 |     1 |     3 | --注意這裏 1 - 3
|   2 |   TABLE ACCESS FULL | TEST_PART |   246 |  3198 |     2   (0)| 00:00:01 |     1 |     3 | --注意這裏 1 - 3
-------------------------------------------------------------------------------------------------

  2、請求的數據不包含 不可用 分區時

SQL> select * from test_part where no>5;     ---數據正常查出了

	NO
----------
	 9
	11

執行計劃如下,可以看到,這裏CBO自動規避掉 沒有數據返回的第一個損壞分區
所以 第一個分區損壞了,對這個sql沒有任何影響。
注:第一個分區的定義是no<5。而這裏的where條件爲no>5
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4294476422

------------------------------------------------------------------------------------------------------
| Id  | Operation		 | Name      | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT	 |	     |	   3 |	  39 |	  18   (0)| 00:00:01 |	     |	     |
|   1 |  PARTITION RANGE ITERATOR|	     |	   3 |	  39 |	  18   (0)| 00:00:01 |	   2 |	   3 | --注意這裏 2 - 3
|*  2 |   TABLE ACCESS FULL	 | TEST_PART |	   3 |	  39 |	  18   (0)| 00:00:01 |	   2 |	   3 | --注意這裏 2 - 3
------------------------------------------------------------------------------------------------------


因爲這裏是分區1 失效了,但是這個執行計劃並沒有訪問分區1,那麼這裏執行起來是很正常的!不會報錯



====================================================

勤學如春起之苗,不見其增日有所長。輟學如磨刀之石,不見其損日有所虧


Email:    [email protected]
QQ: 88285879



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