SQL - تحسين لا يوجد أداء الاستعلام
-
23-08-2019 - |
سؤال
هل هناك طريقة يمكنني تحسين هذا النوع من أداء استعلام SQL:
INSERT
INTO ...
WHERE NOT EXISTS(Validation...)
المشكلة هي عندما يكون لدي العديد من البيانات في طاولتي (مثل مليون صفوف)، تنفيذ WHERE NOT EXISTS
جملة إذا بطيئة جدا. يجب أن أفعل هذا التحقق لأنني لا أستطيع إدراج بيانات مكررة.
يمكنني استخدام SQLServer 2005
شكرا
المحلول
تأكد من أنك تبحث عن الأعمدة المفهرسة، مع عدم وجود معالجة للبيانات داخل تلك الأعمدة (مثل Substring وما إلى ذلك)
نصائح أخرى
خارج الجزء العلوي من رأسي، يمكنك تجربة شيء مثل:
TRUNCATE temptable
INSERT INTO temptable ...
INSERT INTO temptable ...
...
INSERT INTO realtable
SELECT temptable.* FROM temptable
LEFT JOIN realtable on realtable.key = temptable.key
WHERE realtable.key is null
حاول استبدال غير موجود بانضمام خارجي يساري، فإنه يعمل في بعض الأحيان بشكل أفضل في مجموعات البيانات الكبيرة.
الانتباه إلى الإجابة الأخرى المتعلقة بفهرسة. لا يوجد هو عادة بسرعة كبيرة إذا كان لديك فهارس جيدة.
لكن أنا يملك كان مشاكل الأداء مع البيانات مثلك تصف. طريقة واحدة اعتدت على الالتزام بها هي استخدام جدول TEMP للقيم المرشحة، وأداء حذف من ... حيث يوجد (...)، ثم إدراج الباقي عمياء. داخل الصفقة، بالطبع، لتجنب ظروف السباق. تقسيم الاستعلامات يتيح في بعض الأحيان للمحسن القيام بعمله دون الخلط.
إذا استطعت في الإطلاق تقليل مساحة المشكلات الخاصة بك، فسوف تكسب أكوام من الأداء. هل أنت متأكد تماما من أن كل واحد من تلك الصفوف في هذا الجدول يحتاج إلى فحص؟
الشيء الآخر الذي قد ترغب في المحاولة هو DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria>
قبل إدراجك. ومع ذلك، قد تختلف الأميال الخاص بك
insert into customers
select *
from newcustomers
where customerid not in (select customerid
from customers)
.. أنا أكثر كفاءة. كما قال آخرون، تأكد من أن لديك فهارس على أي حقول بحث.