سؤال

لقد غاضب هذا السؤال ولا يمكن أن يجد رأي متسق، أو العديد من الآراء التي تستند إلى البيانات الصلبة. أرغب ببساطة في معرفة ما إذا كان استخدام Wildcard في عبارة SELECT SELECT يتغلب على نفقات إضافية من الاتصال بكل عنصر بشكل فردي. لقد قارنت خطط التنفيذ الخاصة بكل من خلال العديد من استفسارات الاختبار المختلفة، ويبدو أن التقديرات دائما قراءة نفس الشيء. هل من الممكن تكبد بعض النفقات العامة في مكان آخر، أم أنها تعاملت معها حقا؟

ما أشير إليه على وجه التحديد:

SELECT *

ضد.

SELECT item1, item2, etc.
هل كانت مفيدة؟

المحلول

SELECT * FROM...

و

SELECT every, column, list, ... FROM...

سوف أداء نفسه لأن كلاهما هو فحص غير مخطط

والفرق هو:

  • البحث الإضافي في sys.columns لحل *
  • تغيير العقد / التوقيع عندما يتغير مخطط الجدول
  • عدم القدرة على إنشاء مؤشر تغطية. في الواقع، لا خيارات ضبط على الإطلاق، حقا
  • يجب تحديث طرق العرض اللازمة إذا لم تكن المخطط
  • لا يمكن فهرس أو تخطيطي عرض باستخدام *
  • ...وغيرها من الاشياء

أخرى حتى الأسئلة حول نفس الموضوع ...

نصائح أخرى

هل تعني select * from ... بدلا من select col1, col2, col3 from ...?

أعتقد أنه من الأفضل دائما تسمية العمود واسترداد الحد الأدنى من المعلومات، لأن

  • سيعمل الرمز الخاص بك بشكل مستقل عن الترتيب المادي للأعمدة في DB. لا ينبغي أن يؤثر طلب العمود على طلبك، لكن سيكون الأمر كذلك إذا كنت تستخدم *. وبعد يمكن أن يكون خطيرا في حالة ترحيل DB، إلخ.
  • إذا قمت بتسمية الأعمدة، فيمكن ل DBMS تحسين المزيد من التنفيذ. على سبيل المثال، إذا كان هناك فهرس يحتوي على جميع البيانات المهتمين بك، فلن يتم الوصول إلى الجدول على الإطلاق.

إذا كنت تعني شيئا آخر مع "Wildcard"، فقط تجاهل إجابتي ...

تحرير: إذا كنت تتحدث عن البطاقة البرية النجمية كما في Select * From ... ثم انظر ردود أخرى ...

إذا كنت تتحدث عن أحرف البدل في بنود المسند، أو تعبيرات الاستعلام الأخرى باستخدام المشغل، (_ , % ) كما هو موضح أدناه، ثم:

يجب أن يفعل ذلك مع ما إذا كان استخدام Wildcard يؤثر على ما إذا كان SQL هو "SARG قادرة" أم لا. SARGABLE، (يمكن استخدام حجة البحث) ما إذا كان يمكن استخدام وسيطات البحث أو الفرز في الاستعلام أو لا يمكن استخدامها كمعلمات دخول إلى فهرس موجود. إذا قمت بإعداد البطاقة البرية إلى بداية حجة

 Where Name Like '%ing'

ثم لا توجد طريقة لاجتياز فهرس على حقل الاسم للعثور على العقد التي نهاية في "جي".

إذا otoh أنت إلحاق البدل إلى النهاية،

Where Name like 'Donald%' 

ثم لا يزال بإمكان المحسن استخدام فهرس على عمود الاسم، والاستعلام لا يزال سارج

إذا كنت تسمون السيارة البرية SQL هي *. انها لا تعني الأداء العلوية عن طريق الذات. ومع ذلك، إذا تم تمديد الجدول، فيمكنك العثور على نفسك استرجاع الحقول التي لا تبحث فيها. بشكل عام لا تكون محددة في الحقول التي تبحث فيها أو إدراجها عادة سيئة. انصح

insert into mytable values(1,2)

ما يحدث إذا تم تمديد الجدول إلى ثلاثة حقول؟

قد لا يكون الأمر أكثر عمل من وجهة نظر خطة التنفيذ. ولكن إذا كنت جلب الأعمدة، فلا تحتاجها بالفعل، فهذا يتم استخدام عرض النطاق الترددي الشبكي الإضافي بين قاعدة البيانات والتطبيق الخاص بك. أيضا إذا كنت تستخدم API عميل رفيع المستوى يقوم بتنفيذ بعض العمل على البيانات التي تم إرجاعها (على سبيل المثال، PERL selectall_hashref) ثم تفرض هذه الأعمدة الإضافية تكلفة الأداء على جانب العميل. كم الثمن؟ يعتمد على.

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