[英]insert query data into same sql query
我正在嘗試插入查詢的數據,目前我正在使用 laravel 的 eloquent ORM 執行此操作,但它需要很長時間,因為我想知道他們是否可以幫助我,如果他們有大約 1 的記錄,可以在同一個查詢中完成
這是查詢:
$var = DB::select("
select selrs.*, sim.emin, sim.emax
from (select rac.*, sup.zona, sup.sitio, sup.manejo
from datos_rendim_actual rac
left join super sup on (sup.codigo = (rac.fundo::int8 * 1000000 + rac.rodal::int8 ))) selrs
left join sitman sim on (sim.sitio = selrs.sitio and sim.manejo = selrs.manejo)
where selrs.edad >= sim.emin and selrs.edad <= sim.emax
");
這是 $var 的 dd
array:123921 [▼
0 => {#813 ▼
+"id": 255214
+"fundo": 101
+"rodal": 196826
+"codigo": null
+"edad": 10
+"densidad": "1019"
+"vol_prod1": "0"
+"vol_prod2": "113.95"
+"created_at": null
+"updated_at": null
+"zona": 5
+"sitio": 1
+"manejo": 7
+"emin": 10
+"emax": 20
}
所以這就是我插入它們的方式:
foreach ($var as $lista) {
$rendimA = new RendimActual;
$rendimA->codigo = $lista->fundo.$lista->rodal;
$rendimA->edad = $lista->edad;
$rendimA->densidad = $lista->densidad;
$rendimA->vol_prod1 = $lista->vol_prod1;
$rendimA->vol_prod2 = $lista->vol_prod2;
$rendimA->vol_prod3 = $lista->vol_prod3;
$rendimA->save();
}
我必須填寫的字段位於rendim_actual
表中,如下所示:
codigo
= concat(fundo, rodal) 從$var
edad
= 來自$var
densidad
= 來自$var
vol_prod1
到 n(實際上有 36 個,但作為示例只留下 3 個)從$var
就Eloquent插入的時間而言,大約需要15分鍾,希望你能幫助我,ty
我正在使用laravel-5.8
和postgresql
您當前正在做的是為每個 RendimActual 運行插入查詢。 你應該做的是通過::insert()批量插入
這將插入 1 個具有 120K 值的查詢
$insert = [];
foreach ($var as $lista) {
$insert[] = [
'codigo' => $lista->fundo . $lista->rodal,
'edad' => $lista->edad,
'densidad' => $lista->densidad,
'vol_prod1' => $lista->vol_prod1,
'vol_prod2' => $lista->vol_prod2,
'vol_prod3' => $lista->vol_prod3
];
}
RendimActual::insert($insert);
由於您在 1 個查詢中插入 120K 值,因此有可能消耗大量 memory 。 因此,如果有 2000 行,最好將數據分塊()並首先插入這 2K 行。 即使您將運行 120K/2K = 60 個查詢......至少這樣每個查詢都不會消耗 memory 與 1 個大(120K)插入查詢相比。
foreach (array_chunk($insert, 2000) as $inst) {
RendimActual::insert($inst);
}
讓我在下面的評論中發布。 干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.