Stories

Detail Return Return

parallel index - Stories Detail

select * from tablename tb
為提高查詢效率,可使用一下方法:
(1)並行查詢:/*+ parallel(tb,32) * /

select /*+ parallel(tb,32) */ count(*) from leo1 tb;

(2)強制走索引:/*+ index(tb, indexname) */

select /*+ parallel(tb, idx_tb$clear) */ count(*) from leo1 tb;

一、Hint
/* */在Oracle中是hint

Hint 使用規則及注意事項
1、hint 其實是一種註釋,如果目標 SQL 的文本出現了 hint,則優化器會選擇 hint 的執行計劃,而不會考慮最優的執行計劃,但前提是這個 HINT 是可選的執行計劃之一。

2、hint 的用法:必須緊隨關鍵字 select、insert、update,delete 後,hint 中第一個星號和加號之間不能有空格,一般寫法 /*+ gather_plan_statistics */,如果有兩個 hint,用空格隔開。hint 中指定具體對象時,不能帶上該對象所在 schema 的名稱。即使該 sql 文本中已經有對應的 schema的名稱。

在 hint 中指定具體表名時,如果該表在對應 sql 文本中有別名,則應該使用該表的別名。oracle 數據庫中的query block 是指一個語義上完整的查詢語句,hint 生效範圍僅限於它本身所在的 query block。如果一個語句有子查詢,那麼主查詢的 hint 只能作用於主查詢,如果想讓 Hint 作用於子查詢,那麼 hint 要加在子查詢上。

舉例:/*+ full(table_name)*/ 表示查詢表table_name時強制使用全表掃描,強制表掃描也是避免使用索引的一個方法

SQL>Select /*+full(a)*/ * from t a; -- 使用 hint
SQL>Select /*+full(t) */ * from t a; --不使用 hint,失效
AI運行代碼
sql
參考資料:Oracle Hint 語法詳解-CSDN博客

二、強制走索引:/*+ index(tb, indexname) */
Oracle性能分析8:使用索引_oracle parallel index-CSDN博客

三、並行查詢:/*+ parallel(tb,32) * /
3.1 並行概念
並行執行(parallel execution)是Oracle企業版才有的特性(標準版中沒有這個特性),指能夠將一個大型串行任務(任何DML,或者一般的DDL)物理地劃分為多個較小的部分,這些較小的部分可以同時得到處理。

並行包括:

並行查詢:這是指能使用多個操作系統進程或線程來執行一個查詢。Oracle會發現能並行執行的操作(如全表掃描或大規模排序),並創建一個查詢計劃來實現)。
並行DML(PDML):這在本質上與並行查詢很相似,但是PDML主要是使用並行處理來執行修改(INSERT、UPDATE、DELETE和MERGE)。
並行DDL:並行DDL是指Oracle能並行地執行大規模的DDL操作。例如,索引重建、創建一個新索引、數據加載以及大表的重組等都可以使用並行處理。
並行恢復:這是指數據庫能並行地執行實例(甚至介質)恢復,以減少從故障恢復所需的時間。
過程並行化:這是指能並行地運行所開發的代碼。
3.2 何時使用並行
在應用並行執行之前,需要保證以下兩點成立:

必須有一個非常大的任務,如對50GB數據進行全面掃描。
必須有足夠的可用資源(CPU、I/O、內存)。在並行全面掃描50GB數據之前,你要確保有足夠的空閒CPU(以容納並行進程),還要有足夠的I/O通道。
如果只有一個小任務(通常OLTP系統中執行的查詢就是這種典型的小任務),或者你的可用資源不足(這也是OLTP系統中很典型的情況),其中CPU和I/O資源通常已經得到最大限度的使用,那就根本不用考慮並行執行。

如果一個任務只需要幾秒(或更短時間)就能串行地完成,引入並行執行後,相關的管理開銷可能會讓整個過程花費更長的時間。

舉例如,寫一頁文檔若12個人來寫,需要開會分段等,可能並不如一個人來寫更快。而如果寫1200頁,12個人寫需要的時間只為原來的1/12,就算分配任務可能也就1/12,還是比一個人寫要快多了。

3.3 並行查詢
並行查詢允許將一個SQL SELECT語句劃分為多個較小的查詢,每個部分的查詢併發地運行,然後會將各個部分的結果組合起來,提供最終的答案。

在並行進程和掃描文件之間並不存在1對1映射,可以多個進程掃描同一個文件。

各個並行進程可稱為並行執行服務器(parallel execution server),有時也稱為並行查詢(parallel query,PQ)從屬進程。各個並行執行服務器都是單獨的會話,就像是專業服務器進程一樣連接數據庫。每個並行執行服務器分別負責掃描表中一個部分(各個部分都不重疊),彙總其結果子集,將其輸出發回給協調服務器(即原始會話的服務器進程),它再將這些子結果彙總為最終答案。

在默認情況下,Oracle是不啓用並行查詢的。啓用並行查詢有多種方法,可以直接在查詢中使用一個提示,或者修改表要求考慮並行執行路徑等。

3.3.1 並行查詢方法
1.暗示hints式 臨時有效 >>> 常用

select /*+ parallel(leo1, 2) */ count(*) from leo1;

2.alter table對象式, 直接修改對象屬性 長期有效

alter table leo1 parallel 4; 定義leo1表並行度為4

3.alter session會話式,會話生命週期有效

alter session force parallel query parallel 4; 強制定義並行度為4

4.並行DDL式,會話生命週期有效

並行查詢和並行DDL可以無障礙使用並行,如果想使用並行DML,就需要啓動會話DML並行功能

alter session enable parallel dml;

對於前兩種方式,若省略num則Oracle將自動根據負載確定並行度。並行度要隨着系統上工作負載的增減而變化。如果有充足的空閒資源,並行度會上升;如果可用資源有限,並行度則會下降。這樣就不會為機器強加一個固定的並行度。利用這種方法,允許Oracle動態地增加或減少查詢所需的併發資源量。

參加:Oracle並行詳解_oracle 並行-CSDN博客

3.3.2 parallel-hints式語法
/*+parallel(table_short_name,cash_number)*/

/*+ parallel(leo1,2) parallel(leo2,2) parallel(leo3,2) ……*/ 後面同理延續

select /*+parallel(table_name num)*/ count(*) from table_name;

-- 多表關聯時多表並行:
select /*+parallel(tb1,num1) parallel(tb2,num2)*/ count(*) from table_name1 tb1, table_name2 tb2;
AI運行代碼
sql
3.3.3 使用前需考慮&確認點
3.3.3.1考慮點
基於並行查詢要啓動並行進程、分配任務與系統資源、合併結果集,都是比較消耗硬件資源的,優化時通常在邏輯上沒有明顯進步空間才使用硬件優化方式,故啓用Parallel前應該考慮:
1、當前數據庫設備有充足硬件資源;
2、查詢表的數據量很大,超過一千萬,可通過改變Parallel明顯提高效率;
3、系統的當前負載較低,執行任務時不影響其它業務的使用。

3.3.3.2 確認點
使用前我們需要看我們的電腦有幾個cpu,並且每個cpu能夠並行的線程數。

並行度:就是oracle在進行並行處理時,會啓動幾個並行服務進程來同時處理數據,注意看看數據需要幾步處理,每一步都啓n個進程而不是隻啓n個進程

並行度設定:一般來講一個CPU內核可以支撐一個並行度,一台多核服務器中通常採用CPU核數50%來設定並行度,餘下的CPU處理其他程序

並行度與硬件關係密切,同樣並行度在不同硬件上體現的效果是截然不同的

並行度與併發數關係:總並行數=並行度*併發數,當並行度確立後,併發數越多總並行數越高

參見資料:[轉]Oracle 並行原理與示例總結

查看Oracle能利用的最大並行度:
SQL> show parameters cpu
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 80
parallel_threads_per_cpu integer 2
resource_manager_cpu_allocation integer 80
AI運行代碼
sql
1.cpu_count表示cpu數
2.parallel_threads_per_cpu表示每個cpu允許的並行進程數
3.default情況下,並行數為cpu_count*parallel_threads_per_cpu
————————————————
版權聲明:本文為CSDN博主「猿藝」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_52561535/article/details/141459660

Add a new Comments

Some HTML is okay.