一段SQL陳述句里面有自定義函式 然后插入到某一張表
SQL: insert Iito 表 select 函式回傳的欄位,。。from 表 這種SQL插入到表里面特別慢,有沒有大神能給個意見。
uj5u.com熱心網友回復:
1、如果是你的SELECT太慢,優化SELECT陳述句。2、如果資料量很大,可以拆解成多個陳述句,并行執行。
uj5u.com熱心網友回復:
查詢很快,就是插入的時候特別慢,就因為SQL里面有函式,函式里面很復雜,屬于函式套函式那種
uj5u.com熱心網友回復:
insert 有什么 函式 ? 觸發器?
uj5u.com熱心網友回復:
插入SQL陳述句 Iisert into 后面的SQL陳述句Sslect 函式。。。from表 自定義函式 不是觸發器uj5u.com熱心網友回復:
insert屬于硬決議,很慢,看能不能先根據欄位匯出為txt檔案,然后再匯入進去uj5u.com熱心網友回復:
看能不能優化,最后看下慢在哪塊?實在不行可以考慮加并行uj5u.com熱心網友回復:
優化函式呀,



uj5u.com熱心網友回復:
插入SQL陳述句 Iisert into 后面的SQL陳述句Sslect 函式。。。from表 自定義函式 不是觸發器
ctas 看看什么速度 。
uj5u.com熱心網友回復:
試過了,還是挺慢的,應該就是函式寫的不行uj5u.com熱心網友回復:
插入幾行?平均行長多少?目標表是否有索引,觸發器?先看看select是否慢?
uj5u.com熱心網友回復:
插入幾行?平均行長多少?目標表是否有索引,觸發器?
先看看select是否慢?
uj5u.com熱心網友回復:
/* + nologging paralle 4 */uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
并行本身就是直接物理讀或者物理寫,不僅select可以并行,DML、DDL都可以并行,看你怎么用了。當然并行并不一定能帶來性能收益,在一個復雜的系統上,大量肆無忌憚的并行基本上是拖后腿的。
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
并行本身就是直接物理讀或者物理寫,不僅select可以并行,DML、DDL都可以并行,看你怎么用了。當然并行并不一定能帶來性能收益,在一個復雜的系統上,大量肆無忌憚的并行基本上是拖后腿的。
你可以測驗一下 在insert 與select 同時加parallel 它是如何運行的例如
insert /*+parallel(8)*/into a select /*+parallel(1)*/ from a
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
并行本身就是直接物理讀或者物理寫,不僅select可以并行,DML、DDL都可以并行,看你怎么用了。當然并行并不一定能帶來性能收益,在一個復雜的系統上,大量肆無忌憚的并行基本上是拖后腿的。
你可以測驗一下 在insert 與select 同時加parallel 它是如何運行的例如
insert /*+parallel(8)*/into a select /*+parallel(1)*/ from a
不知如何測驗它如何運行?愿聞其詳
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
并行本身就是直接物理讀或者物理寫,不僅select可以并行,DML、DDL都可以并行,看你怎么用了。當然并行并不一定能帶來性能收益,在一個復雜的系統上,大量肆無忌憚的并行基本上是拖后腿的。
你可以測驗一下 在insert 與select 同時加parallel 它是如何運行的例如
insert /*+parallel(8)*/into a select /*+parallel(1)*/ from a
不知如何測驗它如何運行?愿聞其詳
/*+monitor*/ dbms_sqltune.report_sql_monitor
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
并行本身就是直接物理讀或者物理寫,不僅select可以并行,DML、DDL都可以并行,看你怎么用了。當然并行并不一定能帶來性能收益,在一個復雜的系統上,大量肆無忌憚的并行基本上是拖后腿的。
你可以測驗一下 在insert 與select 同時加parallel 它是如何運行的例如
insert /*+parallel(8)*/into a select /*+parallel(1)*/ from a
不知如何測驗它如何運行?愿聞其詳
/*+monitor*/ dbms_sqltune.report_sql_monitor
可否更詳細點?怎么用這個包觀察并行sql是怎么運行的?
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
并行本身就是直接物理讀或者物理寫,不僅select可以并行,DML、DDL都可以并行,看你怎么用了。當然并行并不一定能帶來性能收益,在一個復雜的系統上,大量肆無忌憚的并行基本上是拖后腿的。
你可以測驗一下 在insert 與select 同時加parallel 它是如何運行的例如
insert /*+parallel(8)*/into a select /*+parallel(1)*/ from a
不知如何測驗它如何運行?愿聞其詳
/*+monitor*/ dbms_sqltune.report_sql_monitor
可否更詳細點?怎么用這個包觀察并行sql是怎么運行的?
私密我一下
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
并行本身就是直接物理讀或者物理寫,不僅select可以并行,DML、DDL都可以并行,看你怎么用了。當然并行并不一定能帶來性能收益,在一個復雜的系統上,大量肆無忌憚的并行基本上是拖后腿的。
你可以測驗一下 在insert 與select 同時加parallel 它是如何運行的例如
insert /*+parallel(8)*/into a select /*+parallel(1)*/ from a
不知如何測驗它如何運行?愿聞其詳
/*+monitor*/ dbms_sqltune.report_sql_monitor
可否更詳細點?怎么用這個包觀察并行sql是怎么運行的?
私密我一下
發論壇吧,和大家一起共同進步
uj5u.com熱心網友回復:
/* + nologging paralle 4 */
nologging不是提示,順帶著后面的parallel 。。。
可以這樣用的
nologging是關鍵字,不是提示,但這么寫當然不會報錯。如果想要得到少些日志的效果,需要alter table <tablename> nologging; 只不過通常非倉庫類生產環境不會允許這么干,干了也可能白干罷了……
這算hint類非常常見的誤區。
回到樓主主題帖,個人覺得問題應該出在自定義函式上,而且恐怕還很難優化,樓主可以貼代碼出來看看。
好像這樣加nologging是 沒啥用哎,問一下:paralle 加載是direct 方式,應該不用加append了吧?
理論上來講,parallel和append都是用了直接路徑插入,不過個人感覺使用中append的效率更高,也沒想明白確切的原因,若有頭緒,請不吝分享。
parallel 是并行器指示而不是方式,實際還是生效于select,append是加載方式,nologging需要配合資料模式 noarchive模式才有明細效果
并行本身就是直接物理讀或者物理寫,不僅select可以并行,DML、DDL都可以并行,看你怎么用了。當然并行并不一定能帶來性能收益,在一個復雜的系統上,大量肆無忌憚的并行基本上是拖后腿的。
你可以測驗一下 在insert 與select 同時加parallel 它是如何運行的例如
insert /*+parallel(8)*/into a select /*+parallel(1)*/ from a
不知如何測驗它如何運行?愿聞其詳
/*+monitor*/ dbms_sqltune.report_sql_monitor
可否更詳細點?怎么用這個包觀察并行sql是怎么運行的?
私密我一下
發論壇吧,和大家一起共同進步
論壇溝通很困難 我大概說一下 你用/*+monitor*/指示器監控你的sql,然后SELECT dbms_sqltune.report_sql_monitor(sql_id =>'9smd2fs2mx42u',TYPE=>'HTML') FROM DUAL; 里面有實際運用的資源包括并行器 IO 時間等
uj5u.com熱心網友回復:
@riven2011手頭暫時沒有更低版本的庫,我在11.2做了一些測驗,簡單地看了下IO的情況,這個圖里的資料感覺不好解釋:
uj5u.com熱心網友回復:
@riven2011
手頭暫時沒有更低版本的庫,我在11.2做了一些測驗,簡單地看了下IO的情況,這個圖里的資料感覺不好解釋:


這個可以看到并行器的使用情況
uj5u.com熱心網友回復:
@riven2011
手頭暫時沒有更低版本的庫,我在11.2做了一些測驗,簡單地看了下IO的情況,這個圖里的資料感覺不好解釋:
這個可以看到并行器的使用情況
沒有打開parallel dml?否則應該不會是傳統load方式
uj5u.com熱心網友回復:
@riven2011 挺有意思,各種工具一起上,發現有些東西對不上號了。1、v$sql:

2、gather_plan_statistics hint + dbms_xplan.display_cursor:

3、monitor hint + dbms_sqltune.report_sql_monitor:
uj5u.com熱心網友回復:
改成文本模式就有了,不過只有直接物理寫的請求次數和寫的空間大小,轉成8k資料塊寫入次數,與v$sql中的direct_writes保持一致:SQL Monitoring Report
SQL Text
------------------------------
insert /*+monitor parallel(t 4)*/into t select /*+parallel(a 4)*/ * from t2 a
Global Information
------------------------------
Status : DONE
Instance ID : 1
Session : SYS (2853:16591)
SQL ID : 2r7b49phnp2pb
SQL Execution ID : 16777217
Execution Started : 12/13/2019 16:48:08
First Refresh Time : 12/13/2019 16:48:08
Last Refresh Time : 12/13/2019 16:48:16
Duration : 8s
Module/Action : sqlplus@sjfx-db7 (TNS V1-V3)/-
Service : SYS$USERS
Program : sqlplus@sjfx-db7 (TNS V1-V3)
Global Stats
=================================================================================================
| Elapsed | Cpu | IO | Concurrency | Other | Buffer | Read | Read | Write | Write |
| Time(s) | Time(s) | Waits(s) | Waits(s) | Waits(s) | Gets | Reqs | Bytes | Reqs | Bytes |
=================================================================================================
| 31 | 0.76 | 29 | 0.00 | 0.80 | 175K | 1164 | 1GB | 898 | 222MB |
=================================================================================================
Parallel Execution Details (DOP=4 , Servers Allocated=4)
============================================================================================================================================================
| Name | Type | Server# | Elapsed | Cpu | IO | Concurrency | Other | Buffer | Read | Read | Write | Write | Wait Events |
| | | | Time(s) | Time(s) | Waits(s) | Waits(s) | Waits(s) | Gets | Reqs | Bytes | Reqs | Bytes | (sample #) |
============================================================================================================================================================
| PX Coordinator | QC | | 0.02 | 0.00 | | | 0.02 | 133 | | . | | . | |
| p000 | Set 1 | 1 | 7.75 | 0.21 | 7.42 | 0.00 | 0.12 | 67806 | 490 | 469MB | 209 | 52MB | reliable message (1) |
| | | | | | | | | | | | | | direct path read (4) |
| | | | | | | | | | | | | | direct path write (3) |
| p001 | Set 1 | 2 | 7.72 | 0.14 | 6.92 | | 0.66 | 25532 | 158 | 149MB | 173 | 43MB | reliable message (1) |
| | | | | | | | | | | | | | direct path read (1) |
| | | | | | | | | | | | | | direct path write (6) |
| p002 | Set 1 | 3 | 7.70 | 0.20 | 7.50 | | 0.00 | 42309 | 269 | 256MB | 258 | 64MB | direct path read (3) |
| | | | | | | | | | | | | | direct path write (5) |
| p003 | Set 1 | 4 | 7.74 | 0.20 | 7.54 | | | 39566 | 247 | 234MB | 258 | 64MB | direct path read (3) |
| | | | | | | | | | | | | | direct path write (4) |
============================================================================================================================================================
SQL Plan Monitoring Details (Plan Hash Value=https://bbs.csdn.net/topics/3136303183)
================================================================================================================================================================================
| Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Read | Read | Write | Write | Mem | Activity | Activity Detail |
| | | | (Estim) | | Active(s) | Active | | (Actual) | Reqs | Bytes | Reqs | Bytes | (Max) | (%) | (# samples) |
================================================================================================================================================================================
| 0 | INSERT STATEMENT | | | | 1 | +8 | 5 | 4 | | | | | | 6.25 | reliable message (2) |
| 1 | PX COORDINATOR | | | | 1 | +8 | 5 | 4 | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 1M | 10674 | 1 | +8 | 4 | 4 | | | | | | | |
| 3 | LOAD AS SELECT | | | | 7 | +2 | 4 | 4 | | | 890 | 222MB | 2M | 59.37 | Cpu (1) |
| | | | | | | | | | | | | | | | direct path write (18) |
| 4 | PX BLOCK ITERATOR | | 1M | 10674 | 7 | +2 | 4 | 2M | | | | | | | |
| 5 | TABLE ACCESS FULL | T2 | 1M | 10674 | 8 | +1 | 52 | 2M | 1160 | 1GB | | | | 34.37 | direct path read (11) |
================================================================================================================================================================================
uj5u.com熱心網友回復:
@minsic78 老哥作業不飽和啊
uj5u.com熱心網友回復:
@minsic78 老哥作業不飽和啊
你這話看的我直哆嗦
uj5u.com熱心網友回復:
跟你說個快的 sqlload 85萬條資料 26s不到uj5u.com熱心網友回復:
用外部表,sqlloaduj5u.com熱心網友回復:
弄個臨時表,存盤需要插入的資料uj5u.com熱心網友回復:
贊成1樓樓主的辦法轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/19540.html
標籤:開發
上一篇:幫助求期初期末庫存的SQL陳述句
