ลำดับของคอลัมน์มีความสำคัญในกลุ่มตามข้อหรือไม่?


85

ถ้าฉันมีสองคอลัมน์คอลัมน์หนึ่งมีคาร์ดินาลลิตี้สูงมากและอีกคอลัมน์หนึ่งมีคาร์ดินาลลิตี้ต่ำมาก (# ของค่าที่ไม่ซ้ำกัน) จะมีความสำคัญในลำดับใดที่ฉันจัดกลุ่มตาม?

นี่คือตัวอย่าง:

select 
     dimensionName, 
     dimensionCategory, 
     sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by 
    d.dimensionName,  -- large number of unique values
    d.dimensionCategory -- small number of unique values

มีสถานการณ์ที่สำคัญหรือไม่?


2
ดูโพสต์ที่เกี่ยวข้องเช่นกัน: MYSQL5 ลำดับของกลุ่มโดย ...
trcarden

คำตอบ:


74

ไม่คำสั่งไม่สำคัญสำหรับคำสั่ง GROUP BY

MySQL และ SQLite เป็นฐานข้อมูลเดียวที่ฉันทราบว่าอนุญาตให้คุณเลือกคอลัมน์ที่ละเว้นจากกลุ่มโดย (ไม่ใช่แบบมาตรฐานไม่ใช่แบบพกพา) แต่คำสั่งไม่สำคัญเช่นกัน


27

SQL เป็นประกาศ

ในกรณีนี้คุณได้บอกผู้เพิ่มประสิทธิภาพว่าคุณต้องการให้จัดกลุ่มข้อมูลอย่างไรและมีวิธีดำเนินการอย่างไร

จะไม่ประเมินทีละบรรทัด (ขั้นตอน) และดูที่คอลัมน์เดียวก่อน

ลำดับคอลัมน์สถานที่หลักมีความสำคัญสำหรับดัชนี col1, col2ไม่เหมือนกับcol2, col1. เลย.


15
นอกจากนี้ยังมีความสำคัญสำหรับ ORDER BY
Vincent McNabb

12

มีคุณลักษณะที่ไม่เป็นมาตรฐานเดิมของ Microsoft SQL Server ที่เรียกว่า ROLLUP ROLLUP เป็นส่วนขยายของไวยากรณ์ GROUP BY และเมื่อใช้ลำดับของคอลัมน์ GROUP BY จะกำหนดคอลัมน์ที่ควรจัดกลุ่มในผลลัพธ์ ROLLUP เลิกใช้งานแล้ว ทางเลือกของ SQL มาตรฐานคือการใช้ชุดการจัดกลุ่มซึ่งรองรับโดย SQL Server 2008 และเวอร์ชันที่ใหม่กว่า


10

เนื่องจากยังไม่ได้กล่าวถึงที่นี่ คำตอบข้างต้นถูกต้องกล่าวคือลำดับของคอลัมน์หลังส่วนคำสั่ง "group by" จะไม่ส่งผลต่อความถูกต้องของข้อความค้นหา (เช่นจำนวนเงินรวม)

อย่างไรก็ตามลำดับของแถวที่ดึงข้อมูลจะแตกต่างกันไปตามลำดับของคอลัมน์ที่ระบุหลังจากอนุประโยค "group by" ตัวอย่างเช่นพิจารณาตารางที่Aมีแถวต่อไปนี้:

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1จะดึงข้อมูลแถวที่Col2เรียงลำดับจากน้อยไปหามาก

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

Col1, Col2ตอนนี้เปลี่ยนการสั่งซื้อของคอลัมน์ในกลุ่มโดยการ Col1แถวดึงจะได้รับคำสั่งเรียงโดย

กล่าวคือ select *, sum(Col3) from A group by Col1, Col2

Col1 Col2 Col3 sum(Col3)
1   xyz 100 100
2   abc 200 200
3   xyz 300 700

หมายเหตุ: จำนวนผลรวม (เช่นความถูกต้องของแบบสอบถาม) ยังคงเท่าเดิมทุกประการ


7
แต่ถ้าไม่มีการใช้ "ORDER BY" ลำดับแถวของผลลัพธ์ที่เลือกก็ยังไม่ได้กำหนดใช่หรือไม่ ดังนั้นคุณไม่ควรพึ่งพาลำดับแถวใด ๆ แม้ว่าจะไม่ได้ใช้ GROUP BY เลยก็ตาม
avl_sweden

เห็นด้วยกับ @avl_sweden ฉันคิดว่าอย่างน้อยที่สุดคำตอบควรบ่งชี้ว่าพฤติกรรมนี้เป็นพฤติกรรมเฉพาะการนำไปใช้งาน ไม่มีการรับประกันว่าเซิร์ฟเวอร์ SQL เวอร์ชันใหม่กว่า (หรือรุ่นเดียวกัน) จะไม่สร้างลำดับที่แตกต่างกัน
NobodysNightmare

2

ถ้าฉันมีสองคอลัมน์คอลัมน์หนึ่งมีคาร์ดินาลลิตี้สูงมากและอีกคอลัมน์หนึ่งมีคาร์ดินาลลิตี้ต่ำมาก (# ของค่าที่ไม่ซ้ำกัน) จะมีความสำคัญในลำดับใดที่ฉันจัดกลุ่มตาม?

แบบสอบถาม -1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

แบบสอบถาม -2

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt)
GROUP BY catid, spec_id,spec_display_value;

ทั้งสองเท่ากันคำสั่งไม่ทำงานในกลุ่มตามข้อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.