parallel index
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

浙公網安備 33010602011771號