سؤال

لماذا شخص ما استخدام مجموعة من مقابل متميزة عندما لا يكون هناك تجمعات به في الاستعلام?

أيضا, هل يعرف أحدا المجموعة مقابل متميزة اعتبارات الأداء في MySQL و SQL Server.وأنا على التخمين أن SQL Server لديه أفضل محسن وأنها قد تكون قريبة من المعادلة هناك ، ولكن في الخلية, أتوقع ميزة كبيرة في الأداء متميزة.

أنا مهتم في dba إجابات.

تحرير:

بيل وظيفة مثيرة للاهتمام, ولكن لا ينطبق.اسمحوا لي أن أكون أكثر تحديدا...

select a, b, c 
from table x
group by a, b,c

مقابل

select distinct a,b,c
from table x
هل كانت مفيدة؟

المحلول

وهناك القليل (القليل جدا) البيانات التجريبية من MS SQL Server و على اثنين من الجداول العشوائية من DB لدينا.

لنمط:

SELECT col1, col2 FROM table GROUP BY col1, col2

و

SELECT DISTINCT col1, col2 FROM table 

وعندما لم يكن هناك مؤشر غطاء للاستعلام، أنتجت في كلا الاتجاهين خطة الاستعلام التالي:

|--Sort(DISTINCT ORDER BY:([table].[col1] ASC, [table].[col2] ASC))
   |--Clustered Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]))

وعندما كان هناك مؤشر تغطية، سواء المنتجة:

|--Stream Aggregate(GROUP BY:([table].[col1], [table].[col2]))
   |--Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]), ORDERED FORWARD)

وذلك من يعامل التي صغير جدا عينة SQL خادم بالتأكيد كلا نفسه.

نصائح أخرى

GROUP BY خرائط مجموعات من الصفوف صف واحد في قيمة متميزة في محددة الأعمدة التي لا يجب أن يكون بالضرورة في اختيار القائمة.

SELECT b, c, d FROM table1 GROUP BY a;

هذا الاستعلام هو قانوني SQL (تصحيح: فقط في الخلية ؛ في الواقع ليس SQL القياسية و غير معتمدة من قبل العلامات التجارية الأخرى).الخلية يقبل ذلك ، وأنه على ثقة من أن كنت تعرف ما تفعلونه ، واختيار b, c, ، d في لبس فيه لأنهم الاعتمادية الوظيفية من a.

ومع ذلك Microsoft SQL Server وغيرها من العلامات التجارية لا تسمح هذا الاستعلام ، لأنه لا يمكن تحديد الاعتمادية الوظيفية بسهولة. تحرير: بدلا من ذلك, SQL القياسية يتطلب منك اتباع واحد قيمة القاعدة, أيكل عمود في تحديد قائمة إما أن يكون اسمه في GROUP BY شرط وإلا تكون حجة على مجموعة وظيفة.

في حين DISTINCT تبدو دائما في جميع الأعمدة في تحديد قائمة ، فقط تلك الأعمدة.فمن سوء فهم الشائع أن DISTINCT يسمح لك بتحديد الأعمدة:

SELECT DISTINCT(a), b, c FROM table1;

على الرغم من الأقواس صنع DISTINCT تبدو وظيفة الدعوة ، فهو ليس كذلك.إنه خيار الاستعلام متميزة قيمة في أي من المجالات الثلاثة من حدد القائمة سوف يؤدي إلى متميزة الصف في نتيجة الاستعلام.واحدة من التعبيرات في هذا حدد القائمة بين قوسين حول ذلك ، ولكن هذا لن يؤثر على النتيجة.

في الخلية لقد وجدت باستخدام GROUP BY غالبا ما يكون أفضل في الأداء من DISTINCT.

والقيام ب "شرح DISTINCT SELECT" يظهر "استخدام حيث، واستخدام مؤقتة". والخلية إنشاء جدول مؤقت

ومقابل على "شرح SELECT أ، ب، ج من T1، T2 حيث T2.A = T1.A GROUP BY على" مجرد معارض "استخدام حيث"

وكلاهما من شأنه أن يولد خطة الاستعلام نفس في MS SQL خادم .... إذا كان لديك MS SQL Server الذي يمكن أن مجرد تمكين خطة التنفيذ الفعلي لرؤية واحد الذي هو أفضل لاحتياجاتك ...

يرجى إلقاء نظرة على تلك الوظائف:

<وأ href = "http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/" يختلط = "نوفولو noreferrer"> http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

http://www.sqlmag.com/Article/ArticleID/24282 /sql_server_24282.html

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

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