COALESCE VS ليس أداء فارغًا عند التحقق من سلسلة فارغة
سؤال
بعض المقالات التي وجدتها على الإنترنت قارنت isnull مع coalesce ، لذلك أعتقد أن سؤالي مختلف قليلاً.
أنا أتساءل أيهما أفضل من حيث الأداء?
SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';
أو
SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> '';
بخلاف الأداء ، هل هناك أي مخاوف أخرى يجب أن أفكر فيها عند اتخاذ قرار؟
تعديل:
أنا أستخدم Teradata.
المحلول
هذا الإصدار أكثر قابلية للسرقة ويسمح باستخدام فهرس (يحتمل)
SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';
يمكن تبسيطه إلى
SELECT * FROM mytable WHERE mycolumn <> '';
السبب في أنني أقول "قليلاً" و "يحتمل أن يكون" هو أن مسند غير المساواة قد يعني أنك تنتهي بفحص كامل على أي حال.
نصائح أخرى
قد تفكر أيضًا في استخدام ansi_null على الإعداد. سيؤدي ذلك إلى تصفية القيم الخالية ضمنيًا على عمود حيث تصدر وسيطة بحث. القيام بذلك يبسط استفسارك ، لست متأكدًا مما إذا كان يجعله أسرع. من الناحية المنطقية ، يجب أن يتم تقييم وسيطات الترشيح الأقل ، ولا يتم استخدام أي وظائف في جملة يجب أن تتيح انتقائية الفهرس الكاملة. كمثال ، يمكنك إعادة تشغيل استفسارك مثل هذا:
SET ANSI_NULLS ON;
SELECT * FROM mytable WHERE NOT mycolumn = '';
آمل أن يساعد هذا.