sql شرح يمكن اختيار*استخدام أي مبرر؟




where in sql (16)

وأنا أعلم أنني متأخر جدا للحفل ولكنني سأقوم بالتصويت في ذلك أستخدم select * عندما أعرف أني سأرغب دائمًا في كل الأعمدة بغض النظر عن أسماء الأعمدة. قد تكون هذه حالة هامشية إلى حد ما ولكن في تخزين البيانات ، قد أرغب في تنظيم جدول كامل من تطبيق جهة خارجية. عملي القياسي لهذا هو إسقاط الجدول المرحلي وتشغيل

select * 
into staging.aTable 
from remotedb.dbo.aTable

نعم ، إذا كان المخطط على الجدول البعيد يتغير ، قد تعلق التبعيات المتلقين للمعلومات أخطاء ولكن هذا سيحدث بغض النظر.

لطالما وعظت لمطوري بأن SELECT * شر ويجب تجنبه مثل الطاعون.

هل هناك أي حالات يمكن تبريرها؟

لا أتحدث عن COUNT(*) - والتي يمكن لأغلب المحسنين اكتشافها.

تصحيح

أنا أتحدث عن رمز الإنتاج.

وكان أحد الأمثلة الرائعة التي رأيتها من هذه الممارسة السيئة هو تطبيق ASP القديم الذي استخدم select * في إجراء مخزن ، واستخدم ADO للتكرار خلال السجلات التي تم إرجاعها ، ولكن حصلت على الأعمدة حسب الفهرس. يمكنك تخيل ما حدث عندما تمت إضافة حقل جديد في مكان آخر غير نهاية قائمة الحقول.


لقد حصلت على عدد من الإجابات على سؤالك ، ولكن يبدو أنك تستبعد كل ما لا يعيد سماع ما تريد سماعه. لا يزال ، هنا هو للوقت الثالث (حتى الآن): في بعض الأحيان لا يوجد عنق الزجاجة. أحيانًا يكون الأداء أفضل من الغرامة. في بعض الأحيان تكون الجداول في حالة تغير مستمر ، ويعد تعديل كل استعلام من SELECT مجرد جزء واحد فقط من عدم التناسق المحتمل للإدارة. في بعض الأحيان يجب عليك تقديم جدول مستحيل ، وهذا هو آخر شيء تحتاج إلى التفكير فيه.

إذا كنت تعيش في وقت التعداد ، تأكد من كتابة جميع أسماء الأعمدة. لكن لماذا تتوقف عند هذا الحد؟ أعد كتابة تطبيقك في dbms بدون تخطيط. الجحيم ، اكتب dbms الخاصة بك في التجميع. That 'حقا تظهر' م.


كيف يضمن مطورو phpmyadmin عرض جميع حقول جداول DB؟


في رمز الإنتاج ، أميل إلى الموافقة بنسبة 100٪ معك.

ومع ذلك ، أعتقد أن * أكثر مما يبرر وجودها عند تنفيذ الاستعلامات المخصصة.


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


سوف استخدمها في الإنتاج عند العمل مع CTEs. ولكن ، في هذه الحالة ، لا يتم select * بالفعل ، لأنني قمت بالفعل بتحديد الأعمدة في CTE. أنا لا أريد أن أعمل في الاختيار النهائي.

with t as (
    select a, b, c from foo
)

select t.* from t;

لا شيء يمكنني التفكير فيه ، إذا كنت تتحدث عن كود حي.

الأشخاص الذين يقولون أنه يجعل إضافة أعمدة أسهل لتطوير (بحيث يتم إرجاعها تلقائيًا ويمكن استخدامها بدون تغيير الإجراء المخزن) ليس لديهم أي فكرة حول كتابة التعليمات البرمجية / sql المثلى.

لا أستخدمه إلا عند كتابة استعلامات مخصصة لن تتم إعادة استخدامها (معرفة بنية الجدول والحصول على بعض البيانات عندما لا أكون متأكداً من أسماء الأعمدة).


لقد استخدمت select * لاستعلام الجداول المحسنة للقراءة (unormalized ، البيانات المسطحة). مفيد جدا لأن الغرض من الجداول كان ببساطة لدعم وجهات النظر المختلفة في التطبيق.


يعتمد على سياق برنامج الإنتاج.

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

وبعبارة أخرى ، إذا اخترت التعامل مع "اختيار الحقول" من خلال بعض الوسائل الأخرى (كما هو الحال في الفلاتر الآلية أو المحددة من قبل المستخدم بعد استرداد النتائج) ، فيبدو الأمر على ما يرام.

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

تحرير: أوه وعندما يكون الجدول المصدر إجراء مخزناً لمشغل أو عرض ، يجب أن يكون "* SELECT **" جيدًا لأنك تقوم بإدارة resultset عبر وسائل أخرى (تعريف العرض أو resultset proc's المخزنة).


  1. لقد احتجت عدة مرات لعرض البيانات من جدول كانت أسماء الأعمدة الخاصة به غير معروفة. لذلك فعلت SELECT * وحصلت على أسماء الأعمدة في وقت التشغيل.

  2. لقد تسلمت تطبيقًا قديمًا حيث كان الجدول يحتوي على 200 عمودًا وكان عرضه 300. كان التعرض للمخاطرة من SELECT * ليس أسوأ من إدراج جميع الأعمدة البالغ عددها 300 عمود بشكل صريح.


Select * في رمز الإنتاج له ما يبرره في أي وقت:

  • انها ليست عنق الزجاجة الأداء
  • وقت التطوير أمر بالغ الأهمية

لماذا أريد أن أعود إلى الوراء وتقلق بشأن تغيير الإجراءات المخزنة ذات الصلة ، في كل مرة أقوم بإضافة حقل إلى الجدول؟

لماذا أريد حتى أن أفكر فيما إذا كنت قد اخترت الحقول المناسبة أم لا ، عندما تكون الغالبية العظمى من الوقت أريد معظمها على أية حال ، والغالبية العظمى من المرات القليلة التي لا أفعلها ، شيء آخر هو عنق الزجاجة؟

إذا كان لدي مشكلة أداء محددة ، فسوف أعود وأصلح ذلك. خلاف ذلك في بيئتي ، إنه مجرد تحسين سابق لأوانه (ومكلفة) يمكنني القيام به بدونه.

تحرير .. بعد المناقشة ، أعتقد أنني سأضيف إلى هذا:

... وحيث لم يفعل الناس أشياء أخرى غير مرغوب فيها مثل حاول الوصول إلى الأعمدة (ط) ، والتي يمكن أن تكسر في حالات أخرى على أي حال :)


أنا سعيد للغاية باستخدام * في محفزات المراجعة.

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

(مثل dotjoe ) أنا سعيد أيضًا باستخدامه في الجداول المشتقة وتعبيرات جدول الأعمدة. على الرغم من أنني عادة ما تفعل ذلك العكس.

WITH t
     AS (SELECT *,
                ROW_NUMBER() OVER (ORDER BY a) AS RN
         FROM   foo)
SELECT a,
       b,
       c,
       RN
FROM   t; 

أنا على دراية في معظم الأحيان مع SQL Server وهناك على الأقل المحسن ليس لديه مشكلة في التعرف على أن الأعمدة فقط a,b,c ستكون مطلوبة واستخدام * في تعبير الجدول الداخلي لا يسبب أي النفقات العامة غير الضرورية استرداد وتجاهل الأعمدة غير الضرورية .

من حيث المبدأ ، يجب أن يكون SELECT * جيدًا في طريقة العرض بالإضافة إلى أنه هو SELECT النهائي من العرض حيث يجب تجنبه ، ولكن في SQL Server يمكن أن يسبب هذا مشاكل لأنه يخزن بيانات تعريف الأعمدة لوجهات النظر التي لا يتم تحديثها تلقائيًا عندما تغيير الجداول الأساسية واستخدام * يمكن أن يؤدي إلى نتائج مربكة وغير صحيحة ما لم يتم تشغيل sp_refreshview لتحديث بيانات التعريف هذه.


كأداة استخدمها لتحديث ذاكرتي بسرعة لما يمكنني الحصول عليه من طلب البحث. ك a استعلام مستوى الإنتاج نفسه .. بأي حال من الأحوال.


وتذكر ما إذا كنت تستخدم select * ولديك صلة يجب إرسال حقل واحد على الأقل مرتين (حقل الصلة). هذا النفايات موارد قاعدة البيانات وموارد الشبكة من دون سبب.


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

كان هناك مكان حديث استخدم فيه فريقي SELECT * وأعتقد أنه كان على ما يرام ... لدينا قاعدة بيانات موجودة كواجهة أمام قاعدة بيانات أخرى (نسميها DB_Data) ، بحيث تتكون بشكل أساسي من المشاهدات مقابل الجداول في قاعدة البيانات الأخرى. عندما نقوم بإنشاء مشاهدات نقوم بالفعل بإنشاء قوائم الأعمدة ، ولكن هناك مجموعة واحدة من طرق العرض في قاعدة بيانات DB_Data التي يتم إنشاؤها تلقائيًا عند إضافة صفوف إلى جدول بحث عام (كان هذا التصميم في مكانه قبل الوصول إلى هنا). لقد كتبنا مشغل DDL بحيث عندما يتم إنشاء ملف شخصي في DB_Data بهذه العملية ، يتم إنشاء طريقة عرض أخرى تلقائيًا في الواجهة. بما أن العرض يتم إنشاؤه دائمًا لمطابقة العرض في DB_Data ويتم تحديثه دائمًا والاحتفاظ به متزامناً ، استخدمنا SELECT * ببساطة للتبسيط.

لن أكون مندهشًا لو أن معظم المطورين ذهبوا إلى مسيرتهم الكاملة دون وجود استخدام مشروع لـ SELECT * في كود الإنتاج بالرغم من ذلك.


نعم ، ولكن فقط في الحالات التي تكون فيها النية هي الحصول فعليًا على جميع الأعمدة من جدول لا لأنك تريد جميع الأعمدة التي يحتوي عليها الجدول حاليًا.

على سبيل المثال ، في أحد الأنظمة التي عملت عليها ، كان لدينا UDFs (حقول معرفة من قبل المستخدم) حيث يمكن للمستخدم اختيار الحقول التي يريدها في التقرير ، والترتيب بالإضافة إلى التصفية. عند إنشاء مجموعة نتائج ، يكون من المنطقي ببساطة "تحديد *" من الجداول المؤقتة التي كنت أقوم ببنائها بدلاً من الاضطرار إلى تعقب أي الأعمدة كانت نشطة.







select