關於ORACLE MYSQL在非字首分割槽索引上分割槽剪裁的比較
ORACLE:
CREATE TABLE testpur (i NUMBER, j NUMBER , f varchar2(20))
PARTITION BY RANGE(i)
(PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p2 VALUES LESS THAN (40),
PARTITION p2 VALUES LESS THAN (50));
declare
i number(10);
begin
for i in 1..1000
loop
insert into purge
values(mod(i,50),i,'gaopeng');
end loop;
end;
MYSQL:
CREATE TABLE testpur (i int, j int , f varchar(20))
PARTITION BY RANGE(i)
(PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20),
PARTITION p3 VALUES LESS THAN (30),
PARTITION p4 VALUES LESS THAN (40),
PARTITION p5 VALUES LESS THAN (50));
delimiter //
create procedure myproc()
begin
declare num int;
set num=1;
while num <= 1000 do
insert into testpur values(mod(num,50),num,'test');
set num=num+1;
end while;
end//
這樣ORACLE和MYSQL同樣的建立了相同的分割槽表,在ORACLE中,即使查詢中使用的索引是本地非字首索引,也就是本LOCAL索引
不包含分割槽鍵本身,這種情況下即使使用本索引也不會觸發分割槽剪裁,但是如果謂詞中包含分割槽鍵,索引分割槽剪裁的特效能夠用到
如上,我們建立本地非字首分割槽索引
SQL> create index testpur_l_nopre on testpur(j) local;
Index created
然後檢視他的執行計劃
explain plan for select * from testpur where j=10 and i=19;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 717037044
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 2 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 15 | 2 (0)| 00:00:01 | 2 | 2 |
|* 2 | TABLE ACCESS BY LOCAL INDEX ROWID| TESTPUR | 1 | 15 | 2 (0)| 00:00:01 | 2 | 2 |
|* 3 | INDEX RANGE SCAN | TESTPUR_L_NOPRE | 1 | | 1 (0)| 00:00:01 | 2 | 2 |
----------------------------------------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("I"=19)
3 - access("J"=10)
可以看到及時如此索引任然是在分割槽2中進行的掃描,也就是說特定條件下非字首分割槽索引是可以起到字首索引效果的
然後我們看看MYSQL的表現,MYSQL沒有GLOBAL分割槽索引一說。只有本地分割槽索引
我們建立索引
create index testpur_l_nopre on testpur(j) ;
檢視執行計劃
mysql> explain partitions select * from testpur where j=10 and i=19;
+----+-------------+---------+------------+------+-----------------+-----------------+---------+-------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------------+------+-----------------+-----------------+---------+-------+------+-------------+
| 1 | SIMPLE | testpur | p2 | ref | testpur_l_nopre | testpur_l_nopre | 5 | const | 1 | Using where |
很顯然MYSQL也是用了同樣技術,這裡不僅用到分割槽剪裁而且使用到了分割槽索引 testpur_l_nopre。
另外題外話,MYSQL,ORACLE的主鍵唯一鍵必須是分割槽鍵的一部分,如果分割槽鍵是i,j,那麼主鍵唯一鍵必須是其中一個。
其原因很簡單,在ORACLE 9I 10G 程式設計藝術中有明確說明,如果允許包含非分割槽鍵的區域性唯一索引,那麼其分割槽特性
將被消耗殆盡,因為這樣不得不去每次掃描全部分割槽來保證其唯一性,只有包含了分割槽鍵才能做到事先判斷。
CREATE TABLE testpur (i NUMBER, j NUMBER , f varchar2(20))
PARTITION BY RANGE(i)
(PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p2 VALUES LESS THAN (40),
PARTITION p2 VALUES LESS THAN (50));
declare
i number(10);
begin
for i in 1..1000
loop
insert into purge
values(mod(i,50),i,'gaopeng');
end loop;
end;
MYSQL:
CREATE TABLE testpur (i int, j int , f varchar(20))
PARTITION BY RANGE(i)
(PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20),
PARTITION p3 VALUES LESS THAN (30),
PARTITION p4 VALUES LESS THAN (40),
PARTITION p5 VALUES LESS THAN (50));
delimiter //
create procedure myproc()
begin
declare num int;
set num=1;
while num <= 1000 do
insert into testpur values(mod(num,50),num,'test');
set num=num+1;
end while;
end//
這樣ORACLE和MYSQL同樣的建立了相同的分割槽表,在ORACLE中,即使查詢中使用的索引是本地非字首索引,也就是本LOCAL索引
不包含分割槽鍵本身,這種情況下即使使用本索引也不會觸發分割槽剪裁,但是如果謂詞中包含分割槽鍵,索引分割槽剪裁的特效能夠用到
如上,我們建立本地非字首分割槽索引
SQL> create index testpur_l_nopre on testpur(j) local;
Index created
然後檢視他的執行計劃
explain plan for select * from testpur where j=10 and i=19;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 717037044
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 2 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 15 | 2 (0)| 00:00:01 | 2 | 2 |
|* 2 | TABLE ACCESS BY LOCAL INDEX ROWID| TESTPUR | 1 | 15 | 2 (0)| 00:00:01 | 2 | 2 |
|* 3 | INDEX RANGE SCAN | TESTPUR_L_NOPRE | 1 | | 1 (0)| 00:00:01 | 2 | 2 |
----------------------------------------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("I"=19)
3 - access("J"=10)
可以看到及時如此索引任然是在分割槽2中進行的掃描,也就是說特定條件下非字首分割槽索引是可以起到字首索引效果的
然後我們看看MYSQL的表現,MYSQL沒有GLOBAL分割槽索引一說。只有本地分割槽索引
我們建立索引
create index testpur_l_nopre on testpur(j) ;
檢視執行計劃
mysql> explain partitions select * from testpur where j=10 and i=19;
+----+-------------+---------+------------+------+-----------------+-----------------+---------+-------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------------+------+-----------------+-----------------+---------+-------+------+-------------+
| 1 | SIMPLE | testpur | p2 | ref | testpur_l_nopre | testpur_l_nopre | 5 | const | 1 | Using where |
很顯然MYSQL也是用了同樣技術,這裡不僅用到分割槽剪裁而且使用到了分割槽索引 testpur_l_nopre。
另外題外話,MYSQL,ORACLE的主鍵唯一鍵必須是分割槽鍵的一部分,如果分割槽鍵是i,j,那麼主鍵唯一鍵必須是其中一個。
其原因很簡單,在ORACLE 9I 10G 程式設計藝術中有明確說明,如果允許包含非分割槽鍵的區域性唯一索引,那麼其分割槽特性
將被消耗殆盡,因為這樣不得不去每次掃描全部分割槽來保證其唯一性,只有包含了分割槽鍵才能做到事先判斷。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-1789508/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle關於分割槽相關操作Oracle
- mysql~關於mysql分割槽表的測試MySql
- MySQL大量資料入庫的效能比較(分割槽)MySql
- Oracle分割槽表及分割槽索引Oracle索引
- mysql 分割槽MySql
- MySQL分割槽MySql
- Oracle帶區域性分割槽索引的分割槽表刪除舊分割槽新增新分割槽Oracle索引
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- 關於分割槽表和分割槽索引(About Partitioned Tables and Indexes)索引Index
- 簡單ORACLE分割槽表、分割槽索引Oracle索引
- oracle分割槽表和分割槽表exchangeOracle
- 關於分割槽表的操作
- oracle 分割槽Oracle
- 關於 Oracle 分割槽索引的失效和重建Oracle索引
- (轉)關於NAND flash的MTD分割槽與uboot中分割槽的理解NaNboot
- MySQL分割槽表的分割槽原理和優缺點MySql
- ORACLE 範圍分割槽 partition-range分割槽Oracle
- oracle分割槽表和非分割槽表exchangeOracle
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- 如何查詢分割槽表的分割槽及子分割槽
- MySQL的分割槽(一)MySql
- MySQL的分割槽(二)MySql
- 理解MySQL分割槽MySql
- 搞懂MySQL分割槽MySql
- 【MYSQL】 分割槽表MySql
- MySql建立分割槽MySql
- MySQL 子分割槽MySql
- MySQL KEY分割槽MySql
- MySQL HASH分割槽MySql
- MySQL COLUMNS分割槽MySql
- MySQL LIST分割槽MySql
- MySQL RANGE分割槽MySql
- MySQL 分割槽表MySql
- MySQL分割槽表MySql
- mysql分割槽nullMySqlNull
- mysql 分割槽示例MySql
- MySql資料分割槽操作之新增分割槽操作MySql
- MySQL 分割槽表 partition線上修改分割槽欄位MySql