大資料量資料查詢最佳化
在Oracle裡面怎麼把切成小資料呢,有兩個辦法,一個是分割槽,另外一個是分表。我這裡選擇的是分割槽,當然了看了這篇文章你也可以分表。
建立一個表P1,在T1的表結構基礎上多加一個欄位HASH_VALUE,並且根據HASH_VALUE進行LIST分割槽
CREATE TABLE P1(
HASH_VALUE NUMBER,
OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(128),
SUBOBJECT_NAME VARCHAR2(30),
OBJECT_ID NUMBER,
DATA_OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE,
LAST_DDL_TIME DATE,
TIMESTAMP VARCHAR2(19),
STATUS VARCHAR2(7),
TEMPORARY VARCHAR2(1),
GENERATED VARCHAR2(1),
SECONDARY VARCHAR2(1),
NAMESPACE NUMBER,
EDITION_NAME VARCHAR2(30)
)
PARTITION BY list(HASH_VALUE)
(
partition p0 values (0),
partition p1 values (1),
partition p2 values (2),
partition p3 values (3),
partition p4 values (4)
)
同樣的,在T2的表結構基礎上多加一個欄位HASH_VALUE,並且根據HASH_VALUE進行LIST分割槽
CREATE TABLE P2(
HASH_VALUE NUMBER,
OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(128),
SUBOBJECT_NAME VARCHAR2(30),
OBJECT_ID NUMBER,
DATA_OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE,
LAST_DDL_TIME DATE,
TIMESTAMP VARCHAR2(19),
STATUS VARCHAR2(7),
TEMPORARY VARCHAR2(1),
GENERATED VARCHAR2(1),
SECONDARY VARCHAR2(1),
NAMESPACE NUMBER,
EDITION_NAME VARCHAR2(30)
)
PARTITION BY list(HASH_VALUE)
(
partition p0 values (0),
partition p1 values (1),
partition p2 values (2),
partition p3 values (3),
partition p4 values (4)
)
注意:P1和P2表的分割槽必須一模一樣
delete t1 where object_id is null;
commit;
delete t1 where object_id is null;
commit;
insert into p1
select ora_hash(object_id,4), a.* from t1 a; ---工作中用append parallel並行插入
commit;
insert into p2
select ora_hash(object_id,4), a.* from t2 a; ---工作中用append parallel並行插入
commit;
這樣就把 T1 和 T2的表的資料轉移到 P1 和 P2 表中了
那麼之前執行的 select * from t1,t2 where t1.object_id=t2.object_id 其實就等價於下面5個SQL了
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=0 and p2.hash_value=0;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=1 and p2.hash_value=1;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=2 and p2.hash_value=2;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=3 and p2.hash_value=3;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=4 and p2.hash_value=4;
有些人在想,開個並行不就得了,用並行 hash hash 跑SQL,其實是不可以的,原因不多說了。
我們可以利用MPP(Greenplum/Teradata/vertica)思想,或者是利用的思想來對上面的SQL進行最佳化。
MPP架構/HADOOP架構的很重要的思想就是把資料切割,把大的資料切割為很多份小的資料,然後再對小的進行關聯,那速度自然就快了
oracle中的hash分割槽就是利用的ora_hash函式
partition by hash(object_id) 等價於 ora_hash(object_id,4294967295)
ora_hash(列,hash桶) hash桶預設是4294967295 可以設定0到4294967295
ora_hash(object_id,4) 會把object_id的值進行hash運算,然後放到 0,1,2,3,4 這些桶裡面,也就是說 ora_hash(object_id,4) 只會產生 0 1 2 3 4
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8568259/viewspace-2103300/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 查詢資料庫的資料量的大小資料庫
- 大資料量查詢容易OOM?試試MySQL流式查詢大資料OOMMySql
- 查詢資料量的大小
- MySQL 百萬級資料量分頁查詢方法及其最佳化MySql
- mysql千萬級資料量根據索引最佳化查詢速度MySql索引
- mysql大資料量分頁查詢方法及其優化MySql大資料優化
- 請教大資料量查詢怎麼分頁查詢?資料量大概有7,8億條。謝謝大資料
- offset新探索:雙管齊下,加速大資料量查詢大資料
- oracle 大資料量資料插入Oracle大資料
- 資料庫之查詢最佳化資料庫
- 資料統計查詢最佳化
- 查詢Oracle資料庫使用者表中的多少資料量Oracle資料庫
- Mysql中使用流式查詢避免資料量過大導致OOMMySqlOOM
- (利用索引)大資料查詢索引大資料
- 報表連 hive,資料量比較大,怎麼分頁查詢?Hive
- 在大資料量下提高查詢效率的方法—ES搜尋引擎大資料
- 騰龍【大資料clickhouse】clickhouse 常用查詢最佳化策略詳解大資料
- 大資料的實時查詢大資料
- 資料庫資料的查詢----連線查詢資料庫
- mysql 表資料量大量查詢慢如何優化MySql優化
- 30個MySQL千萬級大資料SQL查詢最佳化技巧詳解MySql大資料
- 資料結構之三大查詢資料結構
- 關於資料字典的查詢效率最佳化
- 資料庫 - 資料查詢資料庫
- sql 資料庫 龐大資料量 需要分表SQL資料庫大資料
- 資料庫查詢和資料庫(MySQL)索引的最佳化建議資料庫MySql索引
- 資料量很大,分頁查詢很慢,該怎麼優化?優化
- mysql千萬級資料量根據索引優化查詢速度MySql索引優化
- 50種方法最佳化SQL Server資料庫查詢SQLServer資料庫
- TableStore多元索引,大資料查詢的利器索引大資料
- 大資料量高併發的資料庫優化大資料資料庫優化
- access資料庫大資料量分頁的問題資料庫大資料
- MySQL - 資料查詢 - 簡單查詢MySql
- B樹查詢,磁碟查詢資料
- indexedDB 查詢資料Index
- RESTFul資料查詢REST
- MySQL資料查詢MySql
- EF 查詢資料