بطء شديد في جملة UPDATE
#1
السلام عليكم ورحمة الله وبركاته
السادة الكرام
لدي جدول1 فيه اعمدة (رقم المادة-اسم المادة -رصيد المادة) ID_PROD-NAME_PROD-RASEED  (عدد المواد 100)
       جدول2 فيه اعمدة (رقم المادة-الكمية) ID_PROD-QTY (عدد السجلات 14000 سجل)

لكي احصل على رصيد كل مادة ووضعه في جدول1 . كتبت جملة ال update التالية:
كود :
update Table1 set raseed = (select sum(Table2.qty) from Table2 where Table1.id_prod = Table2.id_prod)

الكود يعمل بشكل جيد
لكن المشكلة في بطء النتيجة (10ثواني تقريباً) وهذا يعد عيباً كبيراً
كوني محاسباً واعمل على برنامج محاسبة بقاعدة بيانات برادوكس و1800 مادة و14000 سجل والامر لايستغرق كبسة الزر فقط

جربت قاعدة بيانات absolute  و bde و access والنتيجة واحدة

فهل من حل اخر للحصول على الرصيد والتقليل من الوقت
الرد
#2
السلام عليكم

للاسف يعتري هاذا المنتدى شيء من الخمول

 مع وجود مبرمجين محترفين وخبرات سنوات عديدة . لم أر رداً واحداً

- تابعت التجربة على قاعدة بيانات sql server وكانت النتيجة ممتازة . ألفان ومئتا مادة مع عشرين الف سجل للمواد .ظهرت النتيجة بكبسة زر

لكن ارجع واقول
كوني محاسباً واعمل على برنامج محاسبة بقاعدة بيانات برادوكس و1800 مادة و14000 سجل للمواد والامر لايستغرق كبسة الزر فقط

بانتظار الاحبة
الرد
#3
و عليكم السلام و رحمة الله و بركاته
لما لا تستعمل حقل حسابي (CalculatedField) و تستغني عن تعليمة الـ Update. شيء مثل :

كود :
SELECT Table1.ProdID, Table1.ProdName, Sum(Table2.Quantity) AS TotalQuantity FROM Table1 INNER JOIN Table2 ON Table1.ProdID = Table2.ProdID GROUP BY Table1.ProdID, Table1.ProdName;
من قال حاد عن أصله أو قال مات فقد كذب
[-] كل من 1 user says قال شكرا ل h-farid على المشاركة المفيدة
  • samnaj00
الرد
#4
(17-08-2020, 10:50 AM)h-farid كتب : و عليكم السلام و رحمة الله و بركاته
لما لا تستعمل حقل حسابي (CalculatedField) و تستغني عن تعليمة الـ Update. شيء مثل :

كود :
SELECT Table1.ProdID, Table1.ProdName, Sum(Table2.Quantity) AS TotalQuantity FROM Table1 INNER JOIN Table2 ON Table1.ProdID = Table2.ProdID GROUP BY Table1.ProdID, Table1.ProdName;

استاذي الكريم جزاك الله خيراً

هذا ينفع في حال اردت اظهار البيانات والمجاميع فقط دون تعديل او اضافة
لكن الجدول الاول فيه (اضافة -تعديل ) مباشرة
هل يمكن تعديل جملة الاسكيول لكي يتم تطبيقها على عمود رصيد المادة؟
الرد
#5

و عليكم السلام و رحمة الله و بركاته
أكتب الكود الكامل المستعمل وليس فقط جملة الإستعلام (إن أمكنك إرفاق مثال لكان أحسن) حتى يمكن توجيهك لمكان الخلل.
رَبَّنَا اغْفِرْ لِي وَلِوَالِدَيَّ وَلِلْمُؤْمِنِينَ يَوْمَ يَقُومُ الْحِسَابُ
الرد
#6
(17-08-2020, 12:54 PM)B.M.AbdelAziZ كتب :
و عليكم السلام و رحمة الله و بركاته
أكتب الكود الكامل المستعمل وليس فقط جملة الإستعلام (إن أمكنك إرفاق مثال لكان أحسن) حتى يمكن توجيهك لمكان الخلل.
لا يوجد سوى هذه الجملة فقط
كود :
update daleel_prod set raseed = (select sum(prod.qty_in) from prod where daleel_prod.id_prod = prod.id_prod)

لم تعمل جملة sql لقاعدة بيانات اكسس طلب عمل استعلام تحديث

في المرفقات نموذجين (bde - absolute ) مع exe - ضع المجلدين في القرص c


الملفات المرفقة
.rar   BDE.rar (الحجم : 396.68 ك ب / التحميلات : 23)
.rar   absolute.rar (الحجم : 586.25 ك ب / التحميلات : 26)
الرد
#7
وعليكم السلام ورحمة الله

إطلعت على المشروع الذي استخدمت فيه Absolute DB, فوجدت بعض النقائص مثل:
  • لم تحدد Primary key في الجدول daleel_prod, المفتاح الرئيسي بشكل افتراضي يكون مع unique index "فهرس".
  • عدم استخدام الفهارس Indexes, الفهرس يساعد بشكل كبير في اختصار الوقت عند استخدام select, وفي هذه الحالة يسرع الاستعلام الذي وضعته داخل update.
  • عموما الجداول تبدو غير مركبة بشكل جيد, مثلا لا يوجد مفتاح خارجي في الجدول prod, ربما لأنك تستخدم absolute db؟ لانه لا يحتوي عليها وهو أمر غريب.


جربت نفس مثالك على قاعدة ب SQLite, والفارق كبير جدا في السرعة, لم يأخذ أكثر من ثانية ونصف عندي حتى بدون استخدام فهرس.

للعلم جربت المثالين خارج Rad studio, يعني واحدة داخل sqlite, والاخرى Absolute DB Manager حتى يتبين ان البطئ ليس من مكونات الاتصال.

الحل: غير قاعدة البيانات, حاول الالتزام بأساسيات SQL في انشاء الجداول.
الرد
#8
استاذي الكريم سفيان
جزاك الله كل خير على المشاركة


(17-08-2020, 09:27 PM)sofiane201 كتب :
  • عموما الجداول تبدو غير مركبة بشكل جيد, مثلا لا يوجد مفتاح خارجي في الجدول prod, ربما لأنك تستخدم absolute db؟ لانه لا يحتوي عليها وهو أمر غريب.

ماهو المفتاح الخارجي ؟

(17-08-2020, 09:27 PM)sofiane201 كتب : جربت نفس مثالك على قاعدة ب SQLite, والفارق كبير جدا في السرعة, لم يأخذ أكثر من ثانية ونصف عندي حتى بدون استخدام فهرس.

ذكرت في مشاركاتي أني جربت على sql server وكانت النتيجة بكبسة زر فقط مع 2000 في daleel_prod و20000 سجل في prod
(17-08-2020, 09:27 PM)sofiane201 كتب : الحل: غير قاعدة البيانات, حاول الالتزام بأساسيات SQL في انشاء الجداول.
يمكن تغيير قاعدة البيانات
لكن الذي يدفعني للبحث عن حل بدلاً من تغيير القاعدة . هو مثال حي لدي وهو برنامج محاسبة اعمل عليه بقاعدة برادوكس دلفي7 وبأقل من ثانية يتم تحديث الرصيد

أكيد يوجد طريقة معينة لذلك . والله أعلم
الرد
#9

جرب المرفق مع مثال Absolute
لاحظ الفرق بعد اضافة دليل Index للجدول الثاني


الملفات المرفقة
.rar   data1.rar (الحجم : 17.4 ك ب / التحميلات : 28)
رَبَّنَا اغْفِرْ لِي وَلِوَالِدَيَّ وَلِلْمُؤْمِنِينَ يَوْمَ يَقُومُ الْحِسَابُ
الرد
#10
(18-08-2020, 01:35 PM)B.M.AbdelAziZ كتب : جرب المرفق مع مثال Absolute
لاحظ الفرق بعد اضافة دليل Index للجدول الثاني
جزاك الله خيراً  استاذي الكريم
انخفضت المدة الى الثلث تقريباً

قمت باضافة فهرس للجدول الاول لكنه لم يتغير شيئ
هل من طريقة ثانية لتقليل الزمن ؟؟
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم