it-swarm.asia

فرق الأداء لـ COALESCE مقابل ISNULL؟

لقد رأيت الكثير من الناس يستخدمون دالة COALESCE بدلاً من ISNULL. من عمليات البحث على الإنترنت ، وجدت أن COALESCE هو معيار ANSI ، لذلك هناك ميزة أننا نعرف ما يمكن توقعه عند استخدامه. ومع ذلك ، يبدو ISNULL أسهل للقراءة لأنه يبدو أكثر وضوحًا ما يفعله.

أدرك أيضًا أن ISNULL نوعًا ما من الصعوبة لأنه يعمل بشكل مختلف على خوادم قواعد البيانات المختلفة وبلغات مختلفة.

كل ذلك ، في رأيي ، يتلخص في الأسلوب والمعايير. بالنظر إلى أن هذا النمط غير موضوعي ، فهل هناك أي سبب لاستخدام COALESCE على ISNULL (أو العكس)؟ على وجه التحديد ، هل هناك ميزة أداء واحدة على الأخرى؟

51
Richard

COALESCE يُترجم داخليًا إلى تعبير CASE ، ISNULL هي وظيفة محرك داخلية.

COALESCE هي دالة قياسية لـ ANSI ، ISNULL هي T-SQL.

يمكن أن تظهر الاختلافات في الأداء وتحدث عندما يؤثر الاختيار على خطة التنفيذ ولكن الفرق في سرعة الوظيفة الأولية ضئيل .

28
Mark Storey-Smith
  • ISNULL خاص Sybase/SQL Server
  • COALESCE محمولة

ثم

  • تأخذ ISNULL وسيطتين
  • يأخذ COALESCE وسيطات 1-n

أخيرا ، والمرح قليلا. نوع بيانات النتيجة والطول/الدقة/المقياس

هذا الجزء الأخير هو سبب استخدام ISNULL عادة لأنه أكثر قابلية للتنبؤ (؟) ويمكن لـ COALESCE إضافة تحويلات نوع بيانات غير مقصودة: من أين تأتي البتات "إنها أبطأ"

DECLARE @len10 varchar(10); --leave it NULL
SELECT
    ISNULL(@len10, '0123456789ABCDEF'),     -- gives 0123456789
    COALESCE(@len10, '0123456789ABCDEF');   -- gives 0123456789ABCDEF

جميع أنواع البيانات هي نفسها ، لن ترى أي فرق عملي ...

42
gbn

كما أشار مارك ، سوف تجد صعوبة في العثور على اختلافات في الأداء ؛ أعتقد أن العوامل الأخرى ستكون أكثر أهمية. بالنسبة لي ، أنا = دائمًا أستخدم COALESCE ، وقد ذكرت أنت أو مارك معظم هذا بالفعل:

  • COALESCE هو معيار ANSI. إنه شيء أقل يجب أن أقلق بشأنه إذا كنت سأقوم بنقل الرمز الخاص بي. بالنسبة لي شخصياً ، هذا ليس بهذه الأهمية ، لأنني أعرف كيف تحدث مثل هذه المنافذ بشكل نادر خارج عالم الفصول الدراسية في Celko ، ولكن هذه فائدة لبعض الناس.
  • على عكس ما قلته عن سهولة القراءة ، أجد أنه قد يكون أصعب قراءة ISNULL خاصة للمستخدمين القادمين من لغات أو منصات أخرى حيث ترجع ISNULL قيمة منطقية ( وهو غير موجود في SQL Server). من المؤكد أن COALESCE يصعب تهجئتها ، ولكنها على الأقل لا تؤدي إلى افتراضات غير صحيحة.
  • COALESCE أكثر مرونة بكثير ، كما يمكنني أن أقول COALESCE (a، b، c، d) بينما في ISNULL كان علي القيام بالكثير من التعشيش لتحقيق نفس الشيء.

يجب أن تتأكد أيضًا من أنك على دراية بكيفية معالجة أسبقية نوع البيانات باستخدام الدالتين إذا كنت تستخدمها مع أنواع/دقة بيانات مختلفة وما إلى ذلك.

ملاحظة

هناك استثناء واحد. يتم التعامل مع هذه بشكل مختلف في الإصدارات الحالية من SQL Server:

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

المتغير COALESCE سينفذ فعلا some_aggregate_query مرتين (مرة للتحقق من القيمة ، ومرة ​​لإعادتها عندما لا تكون صفراً) ، بينما ISNULL سيقوم بتنفيذ الاستعلام الفرعي مرة واحدة فقط. أتحدث عن بعض الاختلافات الأخرى هنا:

24
Aaron Bertrand