سؤال

هل هناك طريقة يمكنني تحسين هذا النوع من أداء استعلام 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)

.. أنا أكثر كفاءة. كما قال آخرون، تأكد من أن لديك فهارس على أي حقول بحث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top