簡體   English   中英

將查詢數據插入到相同的 sql 查詢中

[英]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.8postgresql

我在處理大型數據庫方面沒有太多經驗,但是在您的解決方案中,您將進行 120k 單獨插入,這將是無效的。

如果您的 $var 數組中的記錄已經在您的表中采用正確的格式,您可以嘗試使用查詢生成器的插入方法

    // Not certain what your table name is
    DB::table('rendim_actual')->insert($var);
    DB::commit();

如果 $var 數組變得太大以至於您無法在一次插入中插入所有數據,您可以查看這個關於分塊插入的 SO Question 。

您當前正在做的是為每個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM