sql並行度
A. sql server 2008最大並行度0什麼意思
表示由幾個CPU並行運算,MAXDOP=0 可以說表示由系統自動調配
MAXDOP的值不能超過CPU數,你可以用
sp_configure設置,也可以在查詢語句上用with option(MAXDOP=1)指定
數據伺服器的設置值也可以用ssms查看
B. SQL調用伺服器核心數(oracle 多線程)
select /*+parallel(t,25)+*/
一、Parallel
1. 用途
強行啟用並行度來執行當前SQL。這個在Oracle 9i之後的版本可以使用,之前的版本現在沒有環境進行測試。也就是說,加上這個說明,可以強行啟用Oracle的多線程處理功能。舉例的話,就像電腦裝了多核的CPU,但大多情況下都不會完全多核同時啟用(2核以上的比較明顯),使用parallel說明,就會多核同時工作,來提高效率。
但本身啟動這個功能,也是要消耗資源與性能的。所有,一般都會在返回記錄數大於100萬時使用,效果也會比較明顯。
2. 語法
/*+parallel(table_short_name,cash_number)*/
這個可以加到insert、delete、update、select的後面來使用(和rule的用法差不多,有機會再分享rule的用法)
開啟parallel功能的語句是:
alter session enable parallel dml;
這個語句是DML語句哦,如果在程序中用,用execute的方法打開。
3. 實例說明
用ERP中的transaction來說明下吧。這個table記錄了所有的transaction,而且每天數據量也算相對比較大的(根據企業自身業務量而定)。假設我們現在要查看對比去年一年當中每月的進、銷情況,所以,一般都會寫成:
select to_char(transaction_date,'yyyymm') txn_month,
sum(
decode(
sign(transaction_quantity),1,transaction_quantity,0
)
) in_qty,
sum(
decode(
sign(transaction_quantity),-1,transaction_quantity,0
)
) out_qty
from mtl_material_transactions mmt
where transaction_date >= add_months(
to_date(
to_char(sysdate,'yyyy')||'0101','yyyymmdd'),
-12)
and transaction_date <= add_months(
to_date(
to_char(sysdate,'yyyy')||'1231','yyyymmdd'),
-12)
group by to_char(transaction_date,'yyyymm')
這個SQL執行起來,如果transaction_date上面有加index的話,效率還算過的去;但如果沒有加index的話,估計就會半個小時內都執行不出來。這是就可以在select 後面加上parallel說明。例如:
select /*+parallel(mmt,10)*/
to_char(transaction_date,'yyyymm') txn_month,
...
這樣的話,會大大提高執行效率。如果要將檢索出來的結果insert到另一個表tmp_count_tab的話,也可以寫成:
insert /*+parallel(t,10)*/
into tmp_count_tab
(
txn_month,
in_qty,
out_qty
)
select /*+parallel(mmt,10)*/
to_char(transaction_date,'yyyymm') txn_month,
...
插入的機制和檢索機制差不多,所以,在insert後面加parallel也會加速的。關於insert機制,這里暫不說了。
Parallel後面的數字,越大,執行效率越高。不過,貌似跟server的配置還有oracle的配置有關,增大到一定值,效果就不明顯了。所以,一般用8,10,12,16的比較常見。我試過用30,發現和16的效果一樣。不過,數值越大,佔用的資源也會相對增大的。如果是在一些package、function or procere中寫的話,還是不要寫那麼大,免得佔用太多資源被DBA開K。
4. Parallel也可以用於多表
多表的話,就是在第一後面,加入其他的就可以了。具體寫法如下:
/*+parallel(t,10) (b,10)*/
5. 小結
關於執行效率,建議還是多按照index的方法來提高效果。Oracle有自帶的explan road的方法,在執行之前,先看下執行計劃路線,對寫好的SQL tuned之後再執行。實在沒辦法了,再用parallel方法。Parallel比較邪惡,對開發者而言,不是好東西,會養成不好習慣,導致很多bad SQL不會暴漏,SQL Tuning的能力得不到提升。我有見過某些人create table後,從不create index或primary key,認為寫SQL時加parallel就可以了。
C. oracle設置表的並行度是什麼意思
查看dba_tables數據字典時,可以發現有「DEGREE」欄位,這個欄位表示的就是數據表的並行度。這個參數的設置,關系著資料庫的I/O,以及sql的執行效率。
並行度的優點就是能夠最大限度的利用機器的多個cpu資源,是多個cpu同時工作,從而達到提高資料庫工作效率的目的。在系統空閑時間,使用並行是個不錯的選擇,但是好東西總是相對而言,沒有絕對的好壞,不當的使用,同樣會引起資料庫的新的問題產生。
1、 此參數的大小設置
orcl@ SCOTT> select table_name,degree from user_tables;
TABLE_NAME DEGREE
------------------------------ --------------------
T1 1
TAB_REGISTER 1
EMP 1
EMP_BAK 1
SALGRADE 1
BONUS 1
DEPT 1
LETTER_USER 1
T2 1
BASE_LOG 1
T 1
通過上例的例子大家可以觀察,此參數的默認值為1,這個數值,我們認為的增加,當設置表的並行度非常高的時候,sql優化器將可能對表進行全表掃描,引起 Direct Path Read 等待 。
在使用並行查詢前需要慎重考慮, 因為並行查詢盡管能提高程序的響應時間, 但是會
消耗比較多的資源。 對於低配置的資料庫伺服器需要慎重。 此外, 需要確認並行度的設置要與 IO 系統的配置相符(建議並行度為 2~4 * CPU 數) 。
2、 並行度的修改
alter table t parallel(degree 1);------直接指定表的並行度
alter table t parallel; ----------設置表的並行度為default
3、 如何在sql語句中使用表的並行度,並選擇合適的並行等級
示例:使用並行查詢的執行計劃
並行度為4
orcl@ SCOTT> SELECT /*+ PARALLEL(4) */
2 MAX(sal),
3 AVG(comm)
4 FROM emp,dept
5 WHERE emp.deptno=dept.deptno
6 GROUP BY 1
D. sql中怎樣修改表的名字
1、首先在電腦中打開SQL Developer,右擊要操作的資料庫,選擇【連接】,如下圖所示。
E. 2019-03-05 SparkSQL集群性能調優 CheatSheet
0.買高性能機器,增加節點
1.設置磁碟文件預讀值大小為16384,使用linux命令:
echo 16384 > /sys/block/{磁碟名}/queue/read_ahead_kb
2. Spark 任務序列化只支持JavaSerializer,數據序列化支持JavaSerializer和 KryoSerializer 。KryoSerializer能達到JavaSerializer的十倍。
3.在spark.driver.extraJavaOptions和spark.executor.extraJavaOptions配置項中添加參數:" -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps ",如果頻繁出現Full GC,需要優化GC。把RDD做Cache操作,通過日誌查看RDD在內存中的大小,如果數據太大,需要改變RDD的存儲級別來優化。
4.一般並行度設置為集群CPU總和的2-3倍
5.大表和小表做join操作時可以把小表Broadcast到各個節點,從而就可以把join操作轉變成普通的操作,減少了shuffle操作。
6. 合理設計DAG,減少shuffle //TODO
7.使用 mapPartitions 可以更靈活地操作數據,例如對一個很大的數據求TopN,當N不是很大時,可以先使用mapPartitions對每個partition求TopN,collect結果到本地之後再做排序取TopN。這樣相比直接對全量數據做排序取TopN效率要高很多。
8.當之前的操作有很多filter時,使用 coalesce 減少空運行的任務數量
9.當任務數過大時候Shuffle壓力太大導致程序掛住不動,或者出現linux資源受限的問題。此時需要對數據重新進行分區,使用 repartition 。
10.配置多個磁碟給 localDir ,shuffle時寫入數據速度增快
11. 別collect大數據量,數據會回到driver端,容易OOM。非要collect,請配置 spark.sql.bigdata.thriftServer.useHdfsCollect 為true,會存在hdfs再讀
12.盡量用receByKey,會在Map端做本地聚合
13. broadcase set/map而不是Iterator, set/map 查詢效率O(1) ,iteratorO(n)
14. 數據發生傾斜,repartition大法 ,查出key,salt it
15.使用Hash Shuffle時,通過設置 spark.shuffle.consolidateFiles 為true,來合並shuffle中間文件,減少shuffle文件的數量,減少文件IO操作以提升性能
16.Spark SQL 小表join,把小表broadcast出去。配置 spark.sql.autoBroadcastJoinThreshold 和 spark.sql.bigdata.useExecutorBroadcast 。小表在join 右端。
17.SparkSQL數據傾斜,配置 spark.sql.planner.skewJoin 和 spark.sql.planner.skewJoin.threshold
18. SparkSQL 小文件,配置 spark.sql.small.file.combine 和 spark.sql.small.file.split.size