Laravel-datatables: Rendimiento lento

Creado en 12 mar. 2018  ·  8Comentarios  ·  Fuente: yajra/laravel-datatables

Resumen del problema o solicitud de función

Rendimiento lento al cargar 537 registros
en la carga de la página: 4,34 segundos
en paginar: 3,98 segundos

"pageLength": 10
¿Existe alguna posibilidad de limitar filas por página como 10 de la consulta que cuando se usa la paginación de la tabla de datos, se cargarán las otras 10 ... como la paginación incorporada de laravel?

PD: incluso si la paginación está desactivada, el tiempo de carga sigue siendo de 4,34 segundos

Fragmento de código del problema

Controller

public function membresData()
    {

        $membres = Membre::
        join('equipes', 'equipes.id', '=', 'membres.equipe_id')
        ->join('laboratoires', 'laboratoires.id', '=', 'equipes.laboratoire_id')
        ->join('etablissements as e1', 'e1.id', '=', 'laboratoires.etablissement_id')
        ->leftjoin('etablissements as e2', 'e2.id', '=', 'membres.etablissement_id')
        ->leftjoin('profils', 'profils.id', '=', 'membres.profil_id')
        ->leftjoin('typemembres', 'typemembres.id', '=', 'membres.typemembre_id')
        ->select ('membres.id','equipes.axe_recherche','laboratoires.libelle','laboratoires.periode_accreditation_dd','laboratoires.periode_accreditation_df','e1.abbreviation as etablab','membres.nom', 'membres.prenom', 'membres.cv', 'membres.sujet', 'e2.abbreviation as etabmem', 'profils.typeprofil', 'membres.cin', 'membres.email','typemembres.typemembre')
        ->orderBy('axe_recherche', 'asc')
        ->get();

        if(request()->ajax()){
        return Datatables::of($membres)

         ->addColumn('name', 
                '{{$nom}} {{$prenom}}'
            )

         ->addColumn('cv', function ($membre) {
            if ($membre->cv != null){
            $url=url("uploadedCvMembre/$membre->etablab/$membre->cv");
            return '<div data-provide="photoswipe">
                        <img class="avatar avatar-sm cursor-pointer" src="'.$url.'" alt="Curriculum vitae de : '.$membre->prenom.' '.$membre->nom.'" data-provide="tooltip" data-original-title="Curriculum vitae" data-tooltip-color="primary" aria-describedby="tooltip946475">

                    </div>   ';
            }        
         })

         ->addColumn('laboratoire',
                '« {{$etablab}} » {{ $libelle }} <small>{{ \Carbon\Carbon::parse($periode_accreditation_dd)->format("Y") }} - {{ \Carbon\Carbon::parse($periode_accreditation_df)->format("Y") }}</small>'
            )

         ->addColumn('action', 
            '<nav class="nav gap-1 fs-16">


                            <a class="nav-link disabled hover-warning" data-provide="tooltip" data-tooltip-color="warning" data-original-title="Modifier" href="{{route("membre.edit",$id)}}"><i class="ti-pencil"></i></a>



                            <form method="POST" action="{{ action("MembreController@destroy", ["id" => $id]) }}" class="delete_form">
                            <strong i="16">@csrf</strong>
                            @method("DELETE")
                            <a class="nav-link disabled hover-danger delete-btn" data-provide="tooltip" data-tooltip-color="danger" data-original-title="Supprimer" href="#"><i class="ti-trash"></i></a>
                            </form>


            </nav>'
        )

         ->rawColumns(['cv','laboratoire','action'])
         ->make(true);
        }else{
            abort('404');
        }

Js

app.ready(function(){
        $("#dtable").dataTable().fnDestroy();
        $('#dtable').DataTable({
        "columnDefs": [
            { "visible": false, "targets": [0,1] },
            { "orderable": false, "targets": [-1] }
        ],
        "order": [[ 1, 'asc' ]],
        processing: true,
        serverSide: true,
        ajax: '{!! route('membres') !!}',
        deferRender: true,
        columns: [
            { data: 'laboratoire', name: 'laboratoire' },
            { data: 'axe_recherche', name: 'axe_recherche' },
            { data: 'name', name: 'name' },
            { data: 'cv', name: 'cv', orderable: false, searchable: false },
            { data: 'sujet', name: 'sujet' },
            { data: 'etabmem', name: 'etabmem', orderable: false, searchable: false },
            { data: 'typeprofil', name: 'typeprofil' },
            { data: 'cin', name: 'cin' },
            { data: 'email', name: 'email' },
            { data: 'typemembre', name: 'typemembre' },
            { data: 'action', name: 'action', orderable: false, searchable: false}

        ],
        "drawCallback": function ( settings ) {
            $('[data-provide~="tooltip"]').each(function(){var b="";$(this).hasDataAttr("tooltip-color")&&(b=" tooltip-"+$(this).data("tooltip-color")),$(this).tooltip({container:"body",trigger:"hover",template:'<div class="tooltip'+b+'" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'})});
            var api = this.api();
            var rows = api.rows( {page:'current'} ).nodes();
            var last=null;

            api.column(0, {page:'current'} ).data().each( function ( group, i ) {
                if ( last !== group ) {
                    $(rows).eq( i ).before(
                        '<tr class="group bl-3 br-3 border-primary bg-light text-center" ><td class="fw-500" colspan="9">'+group+'</td></tr>'
                    );

                    last = group;
                }
            } );
            api.column(1, {page:'current'} ).data().each( function ( group, i ) {
                if ( last !== group ) {
                    $(rows).eq( i ).before(
                        '<tr class="group bl-3 border-warning bg-light" ><td class="fw-500" colspan="9">Equipe : '+group+'</td></tr>'
                    );

                    last = group;
                }
            } );

        }
    });


  });

Detalles del sistema

Incluya estos detalles sobre su sistema. Si se omiten, el ticket perderá prioridad sobre las solicitudes / tickets de otros usuarios.
  • Sistema operativo Ubuntu 17.10
  • PHP 7.2.2
  • Laravel 5.6
  • Laravel-Datatables 8.4
performance question

Comentario más útil

Utilice la consulta en lugar de la recopilación eliminando get() en su fuente de datos.

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

Todos 8 comentarios

Utilice la consulta en lugar de la recopilación eliminando get() en su fuente de datos.

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

@yajra Gracias problema resuelto

Hola, ¿puedes explicar por qué la consulta es mucho más rápida que la recopilación?

Porque realiza el resto de funciones en la consulta en lugar de obtener todos los resultados y sus subdatos y tratar de realizar las funciones en aquello que es menos eficiente.

El tiempo de respuesta es lento
carga de página: 13,40 s
paginación: 9s
Fragmento de código

Controlador

función pública lending_return_log_server_side ()
{
$ alluser = Session :: get ('alluser');
$ referencia = $ esto-> base de datos-> getReference ('lending_return_log') -> getSnapshot () -> getValue ();
$ referencia = array_reverse ($ referencia);
$ datos = [];
$ nombre = '';
$ correo electrónico = '';
foreach ($ referencia como $ lending_return_log) {
// dd ($ lending_return_log ['uid']);
foreach ($ alluser as $ key => $ value) {
if ($ key == $ lending_return_log ['uid']) {
$ nombre = $ valor ['nombre de usuario'];
$ correo electrónico = $ valor ['correo electrónico'];
}
}
$ nestedData ['user_info'] = " ". "
". $ correo electrónico".
". $ lending_return_log ['lending_log_id'];
$ nestedData ['time_and_trx_id'] = \ Carbon \ Carbon :: parse ($ lending_return_log ['tiempo']) -> formato ('F j, Y, g: i a'). "
". $ lending_return_log ['trxid']". ";
$ nestedData ['back_amount'] = " " .number_format ($ lending_return_log ['amount_back_nob'], 8). "NOB ";
$ nestedData ['balance_cierre'] = " " .number_format ($ lending_return_log ['final_balance_nob'], 8). "NOB ";
$ nestedData ['nob_price'] = $ lending_return_log ['nob_price_at']. "$";
$ nestedData ['curr_return'] = " " .number_format ($ lending_return_log ['return_of_cur'], 8). "". $ lending_return_log ['cur_type']. " ";

        $data[] = $nestedData;
    }
    // $reference = collect($reference);

    $finalData = Datatables::of($data)->rawColumns(['user_info', 'time_and_trx_id', 'back_amount', 'closing_balance', 'nob_price', 'curr_return'])->make(true);
    return $finalData;
}

JS

(función () {
$ ('# tabla'). DataTable ({
procesamiento: verdadero,
serverSide: cierto,
ajax: '{{url (' project-log-serverside ')}}',
columnas: [
{datos: 'user_info', nombre: 'user_info'},
{datos: 'time_and_trx_id', nombre: 'time_and_trx_id'},
{data: 'back_amount', name: 'back_amount'},
{datos: 'balance_cierre', nombre: 'balance_cierre'},
{datos: 'nob_price', nombre: 'nob_price'},
{datos: 'curr_return', nombre: 'curr_return'},
]
});
});

Versiones del paquete
Laravel 5.7
PHP: 7.2
Tabla de datos de Laravel: 8.13.7
Base de datos: NoSql DB (Firebase)

¿Puedes por favor qué hay de malo en esto?
Gracias

Verifique su indexación

Controlador:
$ trade1 = Tradecum3 :: where ('CODE', Auth :: user () -> ucc_code) -> where ('SCPOPT', '! =', 'EX') -> select ('UNIQUEID', 'CODE' , 'TRDATE', 'BS', 'SCPOPT como INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB :: raw ('ABS (MKTRATE * QTY ) como MKTTOTAL '));

    $trade2 = Tradecum2::where('CODE', Auth::user()->ucc_code)->where('SCPOPT', '!=', 'EX')->select('UNIQUEID', 'CODE', 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB::raw('ABS(MKTRATE * QTY) as MKTTOTAL'));

    $trade = Tradecum1::where('CODE', Auth::user()->ucc_code)->where('SCPOPT', '=', 'EQ')->select('UNIQUEID', 'CODE', 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB::raw('ABS(MKTRATE * QTY) as MKTTOTAL'))->union($trade1)->union($trade2);


    return DataTables::of($trade)
      ->addColumn('INSTNAME', function ($trade) {
       return $trade->SCPNAME."(". $trade->SCPCODE.")";
      })
      ->editColumn('INSTTYPE',function($trade){
        if($trade->INSTTYPE == "CE")
          return "Call Opt";
        else if ($trade->INSTTYPE == "PE")
          return "Put Opt";
        else if ($trade->INSTTYPE == "CF")
          return "Futures(EQ)";
      else if ($trade->INSTTYPE == "IF")
        return "Futures(INDEX)";
      else
        return $trade->INSTTYPE;
      })
  ->rawColumns(['INSTNAME'])
    ->make(true);

Vista:
$ ('# RecentTradeTableAll'). DataTable ({
procesamiento: verdadero,
serverSide: cierto,
destruir: cierto,
ajax: {
url: "{{route ('datatable.trades')}}",
tipo: 'POST',
encabezados: {
'X-CSRF-TOKEN': $ ('meta [nombre = "csrf-token"]'). Attr ('contenido')
},
datos: función (d) {

                d.instrumentType = $("input[name='instrumentType']:checked").val();
                d.transaction_type = $("input[name='transaction_type']:checked").val();
            }
        },
        columns: [{
                data: 'TRDATE',
                name: 'TRDATE'
            },
            {
                data: 'BS',
                name: 'BS'
            },
            {
                data: 'INSTNAME',
                name: 'INSTNAME'
            },
            {
                data: 'STRIKERATE',
                name: 'STRIKERATE'
            },
            {
                data: 'INSTTYPE',
                name: 'INSTTYPE'
            },
            {
                data: 'DUEDATE',
                name: 'DUEDATE'
            },
            {
                data: 'MKTRATE',
                name: 'MKTRATE'
            },
            {
                data: 'QTY',
                name: 'QTY'
            },
            {
                data: 'MKTTOTAL',
                name: 'MKTTOTAL'
            }
        ]
    });

get () carga todos los datos y pageLength no funciona ... lo anterior carga todos los registros.

Utilice la consulta en lugar de la recopilación eliminando get() en su fuente de datos.

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

Esto hizo que mi consulta pasara de 20 segundos a menos de 2. ¡Gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones