اذهب إلى المحتوى
  • 0

لدي مشكلة في مشروع لارافل في التطابق الجزئي في مُنشئ الاستعلامات query builder

Abdelrahman Mostafa10

السؤال

مرحبًا، استخدم هذا الاستعلام في وحدة التحكم الخاصة بي ويعمل، يعرض هذا الاستعلام بيانات التوزيع اليومي للقيم التي تم تصفيتها باستخدام نموذج،، وذلك قابل للتعديل لأنه عندما لا تُعين بعض معلمات التصفية، فإنني لا استخدمها في استعلامي.

$query = Measure::query()
    ->select(DB::raw('DATEPART(hour, DATETIME_D) AS HOUR_N'))
    ->selectRaw('SUM(CASE WHEN STATUS_N > 0 THEN 1 ELSE 0 END) AS OK_N')
    ->selectRaw('SUM(CASE WHEN STATUS_N <= 0 THEN 1 ELSE 0 END) AS NOK_N')
    ->where('MEASUREID_N', '>', 0)
    ->where('DATETIME_D', '>=', $dfrom)
    ->where('DATETIME_D', '<=', $dto);

$query->when($serial_number, function (Builder $q, string $serial_number) {
    $q->where('PRODSN_S', '=', $serial_number);
});

$query->when($user_id, function (Builder $q, string $user_id) {
    $q->where('USERID_S', '=', $user_id);
});

$query->when($product_id, function (Builder $q, string $product_id) {
    $q->where('PRODID_S', 'LIKE', '%' . $product_id . '%');
});

$query->when($area, function (Builder $q, string $area) {
    $q->join('AREAS_DEF', 'MEASURES.AREAID_N', '=', 'AREAS_DEF.AREAID_N')
        ->where('AREAS_DEF.NAME_S', '=', $area);
});

$query->when($phase, function (Builder $q, string $phase) {
    $q->join('PHASES_DEF', 'MEASURES.PHASEID_N', '=', 'PHASES_DEF.PHASEID_N')
        ->where('PHASES_DEF.NAME_S', 'LIKE', '%' . $phase . '%');
});

$query->groupBy(DB::raw('DATEPART(hour, DATETIME_D)'))
    ->orderBy(DB::raw('DATEPART(hour, DATETIME_D)'));

ذلك يعمل بشكل جيد وبسرعة.

ولكن عندما استخدم نفس الاستعلام مع بعض المعلمات المختلفة التي تعيد توزيعًا أسبوعيًا، لا يتم حل الاستعلام ويبدو أنه معلق ومجمد، وهذا هو الاستعلام:

$query = Measure::query()
    ->select(DB::raw('DATEPART(dw, DATETIME_D) AS DAY_N'))
    ->selectRaw('SUM(CASE WHEN STATUS_N > 0 THEN 1 ELSE 0 END) AS OK_N')
    ->selectRaw('SUM(CASE WHEN STATUS_N <= 0 THEN 1 ELSE 0 END) AS NOK_N')
    ->where('MEASUREID_N', '>', 0)
    ->where('DATETIME_D', '>=', $dfrom)
    ->where('DATETIME_D', '<=', $dto);

$query->when($serial_number, function (Builder $q, string $serial_number) {
    $q->where('PRODSN_S', '=', $serial_number);
});

$query->when($user_id, function (Builder $q, string $user_id) {
    $q->where('USERID_S', '=', $user_id);
});

$query->when($product_id, function (Builder $q, string $product_id) {
    $q->where('PRODID_S', 'LIKE', '%' . $product_id . '%');
});

$query->when($area, function (Builder $q, string $area) {
    $q->join('AREAS_DEF', 'MEASURES.AREAID_N', '=', 'AREAS_DEF.AREAID_N')
        ->where('AREAS_DEF.NAME_S', '=', $area);
});

$query->when($phase, function (Builder $q, string $phase) {
    $q->join('PHASES_DEF', 'MEASURES.PHASEID_N', '=', 'PHASES_DEF.PHASEID_N')
        ->where('PHASES_DEF.NAME_S', 'LIKE', '%' . $phase . '%');
});

$query->groupBy(DB::raw('DATEPART(dw, DATETIME_D)'))
    ->orderBy(DB::raw('DATEPART(dw, DATETIME_D)'));

حاولت إزالة معلمات 'LIKE' وتعيين '=' بدلاً منها وأصبح الأمر سريعًا، وهذا غريب لأن عندما أجرب الاستعلام في SQL Manager، يكون سريعًا وبدون أخطاء، لقد واجهت تلك المشكلة بالفعل مع استعلامات أخرى كان فيها التطابق الجزئي.

هل واجه أحدكم مشاكل مماثلة من قبل؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

يبدو أن المشكلة التي تواجهها متعلقة بأداء الاستعلام عند استخدام العملية LIKE في Laravel. العملية LIKE، خاصة عندما تستخدم العلامات النسبية %، يمكن أن تكون بطيئة جداً في قواعد البيانات الكبيرة لأنها تتطلب مسح كامل للجداول. هذا يفسر لماذا يصبح الاستعلام أسرع عند استبدال LIKE بـ =، الذي يؤدي عمليات مقارنة دقيقة وأكثر كفاءة.

لحل هذه المشكلة، يمكنك اتباع النصائح التالية:

استخدام الفهارس (Indexes):

تأكد من وجود فهارس على الأعمدة التي تستخدمها في شروط الفلترة (WHERE) والربط (JOIN).

للأعمدة المستخدمة في LIKE '%...%', قد تكون الفهارس غير فعالة، لكن يمكنك البحث عن استراتيجيات فهرسة أكثر تقدماً مثل فهرسة النص الكامل إذا كانت تدعمها قاعدة البيانات الخاصة بك.

تقييد نطاق البيانات:

حاول تقييد نطاق البيانات قدر الإمكان قبل تطبيق عمليات الفلترة LIKE.

استخدم شروط WHERE فعالة قبل تطبيق الفلترة بـ LIKE لتقليل عدد السجلات التي يحتاج الاستعلام إلى فحصها.

تجزئة الاستعلام (Query Chunking):

إذا كانت البيانات كبيرة جداً، قد يكون من المفيد تجزئة الاستعلام إلى أجزاء أصغر وتنفيذ كل جزء على حدة.

التحقق من أداء الاستعلام في قاعدة البيانات:

استخدم أدوات تحليل الأداء في نظام إدارة قاعدة البيانات لفهم سبب بطء الاستعلام. قد تكشف هذه الأدوات عن مشكلات لم تكن واضحة في البداية.

تعديل منطق الاستعلام:

بدلاً من استخدام LIKE '%...%'، حاول استخدام استراتيجيات بحث أخرى قد تكون أكثر كفاءة. على سبيل المثال، إذا كنت تبحث عن بداية النص فقط، استخدم LIKE '...%' الذي يمكن أن يستفيد من الفهارس بشكل أفضل.

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...