แถวใดที่เรียงลำดับคำสั่งที่หายไปโดยเรียงลำดับ?


11

โปรแกรมเมอร์คนหนึ่งกำลังทดสอบและเปรียบเทียบแอปพลิเคชันเดียวกันซึ่งใช้โครงสร้างฐานข้อมูลเดียวกันและข้อมูลเดียวกันเฉพาะในฐานข้อมูลที่แยกกันสองแห่งหนึ่งแห่งคือ Oracle 8 และอีกแห่งหนึ่งกับ Oracle 9

แอปรันคิวรีโดยไม่มี ORDER BYส่วนคำสั่ง

เขาอ้างว่าแบบสอบถาม ORDER-BY-less ควรส่งคืนแถวตามลำดับเดียวกันในฐานข้อมูลทั้งสอง

ฉันบอกเขาว่าไม่มีการรับประกันของคำสั่งแถวเดียวกันเว้นแต่ว่าคุณจะอธิบายคำสั่ง ORDER BY

ฐานข้อมูลมีดัชนีและคีย์เหมือนกัน แต่แผนอธิบายแสดงให้เห็นว่าในฐานข้อมูลหนึ่งเอ็นจินกำลังใช้คีย์ของหนึ่งในตารางที่เข้าร่วมขณะที่ในอีกฐานข้อมูลหนึ่งกำลังใช้ของอีกอัน

เขายืนยันว่าสภาพแวดล้อมฐานข้อมูลทั้งสองนั้นไม่เท่ากันซึ่งเป็นเพราะพวกเขามีสถิติที่แตกต่างกันเครื่องยนต์ rdbms ที่แตกต่างกัน ฯลฯ แต่ไม่ใช่เพราะฉันไม่สามารถทำซ้ำทุกดัชนีที่ฐานข้อมูลเดิมมี

ฉันบอกเขาว่าเขาต้องอธิบายให้ORDER BYประโยคถ้าคำสั่งนั้นสำคัญจริงๆ

คำถาม

ดังนั้นฉันสามารถอธิบายเขาได้ดีกว่า:

แบบสอบถามดึงข้อมูลแถวใดเมื่อคุณไม่อธิบายให้เรียงลำดับ ORDER BY และทำไมแบบสอบถามนั้นไม่ส่งคืนแถวในลำดับเดียวกัน


3
มันไม่ได้กำหนด ฉันไม่เชื่อว่าข้อกำหนด SQL นั้นระบุลำดับเฉพาะที่จะส่งคืนเรกคอร์ดดังนั้นจึงขึ้นอยู่กับการนำไปใช้งาน
Robert Harvey

1
@ RobertHarvey นั่นเป็นเหตุผลที่ฉันบอกเขา ในความเป็นจริง: ตามคำนิยามตารางสัมพันธ์จะต้องไม่มีคำสั่งโดยเฉพาะ
Tulains Córdova

1
มันอาจสมเหตุสมผลแม้แต่กับซอฟต์แวร์รุ่นเดียวกันที่แน่นอนที่จะใช้ดัชนีที่แตกต่างกันเพราะมันอาจจะเลือกได้มากขึ้นตามสถิติดัชนีที่รวบรวมไว้สำหรับข้อมูลที่แน่นอนในฐานข้อมูลนั้น ดังนั้นคุณจริงๆไม่สามารถพึ่งพาการสั่งซื้อถ้าคุณไม่ได้ระบุว่า
psr

คุณสามารถคาดหวังข้อความค้นหาแรกได้โดยสมจริงโดยคอลัมน์ที่ไม่มีดัชนีจะทำตามคำสั่ง "แทรกเวลา" โดยจัดทำดัชนี "เวลาอัปเดต" คำขอที่ต่อเนื่องกันอาจ "เสีย" โดยผลลัพธ์ที่แคชไว้และมีการสุ่มค่อนข้างมาก อย่างไรก็ตามมันไม่ได้ขึ้นอยู่กับมัน - มันอาจเปลี่ยนจากเวอร์ชั่นเป็นเวอร์ชั่น, ตามพารามิเตอร์, โดยการอัพเดท "ไม่ได้กำหนด" เป็นคำตอบที่ถูกต้องและสิ่งอื่นใดที่มีการคาดเดาอย่างดีที่สุด
เอสเอฟ

1
ชุดผลลัพธ์ที่ส่งคืนโดย RDMBS-es เป็นเพียง: ชุดซึ่งโดยนิยามไม่มีคำสั่งซื้อเฉพาะ ดังนั้น RDBMS สามารถส่งคืนในลำดับใดก็ได้ที่มันชอบและเปลี่ยนลำดับอีกครั้งในการดำเนินการค้นหาครั้งถัดไป การใช้คำสั่งซื้อที่ไม่มีคำสั่ง ORDER BY นั้นเป็นความผิดพลาด ฉันพยายามอธิบายเรื่องนี้กับเพื่อนร่วมงานเสมอ แต่ฉันทำได้เพียงครึ่งเดียว: D
Radu Murzea

คำตอบ:


25

จากวิกิพีเดีย :

ส่วนคำสั่งซื้อโดยระบุคอลัมน์ที่จะใช้ในการเรียงลำดับข้อมูลที่เกิดขึ้นและในทิศทางที่พวกเขาควรจะเรียงลำดับ (ตัวเลือกจะขึ้นหรือลง) หากไม่มีข้อ ORDER BY ลำดับของแถวที่ส่งกลับโดยเคียวรี SQL จะไม่ถูกกำหนด

ดังนั้นจึงไม่ได้กำหนด

ข้อกำหนด SQL ไม่ได้ระบุลำดับเฉพาะที่จะส่งคืนเรกคอร์ดดังนั้นจึงขึ้นอยู่กับการนำไปใช้งาน

หากไม่มีดัชนีบนโต๊ะลำดับที่เหมาะสมจะเป็นลำดับที่แทรกเร็กคอร์ด ด้วยการกำหนดคีย์หลักลำดับที่เหมาะสมจะเป็นลำดับของคีย์หลัก แต่เนื่องจากข้อกำหนดของ ANSI ไม่ต้องการคำสั่งซื้อที่เฉพาะเจาะจงจึงขึ้นอยู่กับผู้ขายและความอ่อนไหวอาจแตกต่างจากของคุณหรือของฉัน

เนื่องจากคำสั่งซื้อไม่ได้ระบุไว้ในข้อมูลจำเพาะมันไม่ฉลาดที่จะพึ่งพาพฤติกรรมของการใช้งานของผู้ขายรายใดรายหนึ่งเนื่องจากสามารถเปลี่ยนแปลงจากผู้ขายรายหนึ่งไปอีกรายหนึ่งและผู้ขายอาจเปลี่ยนคำสั่งซื้อได้ตลอดเวลาโดยไม่มีการเตือนล่วงหน้า

อย่างที่คุณพูดให้ใส่ORDER BYข้อถ้าสำคัญคือลำดับ


แบบสอบถามมีหลายตารางที่เข้าร่วม ดังนั้นหนึ่งเครื่องยนต์ DB เรียงลำดับ resultset ตามเกณฑ์หนึ่งและฐานข้อมูลอื่น ๆ ที่ใช้เกณฑ์อื่น Obvioulsy เมื่อคำสั่งย่อย ORDER BY ถูกจัดเตรียมไว้เคียวรีทั้งสองจะส่งคืนแถวในลำดับที่ระบุ
Tulains Córdova

+1 AFAICR คำสั่งจะได้รับอนุญาตให้เปลี่ยนแปลงในแต่ละครั้งที่คุณเรียกใช้แบบสอบถามใด ๆ ในอินสแตนซ์ฐานข้อมูลที่เฉพาะเจาะจง
MarkJ

2
ฉันจะบอกว่าไม่มีคำสั่ง ORDER BY คำสั่งที่สมเหตุสมผลเพียงอย่างเดียวคือสิ่งที่สร้างค่าโสหุ้ยน้อยที่สุด สำหรับเอ็นจินการจัดเก็บฐานข้อมูลอย่างง่ายและแบบสอบถามที่มักจะเป็นลำดับการแทรก (และสำหรับคีย์หลักที่สร้างขึ้นเหมือนกับลำดับคีย์หลัก) แต่ทันทีที่คุณมีแฮ็ชเข้าร่วมฉันก็คาดว่าคำสั่งนั้นจะสุ่ม
Michael Borgwardt

2

เห็นได้ชัดว่าชี้ให้เห็นว่าสเป็คไม่ได้พูดว่าสิ่งที่สั่งซื้อข้อมูลเข้ามาไม่ได้ทำงาน อาจเป็นเพราะเขารู้ว่าข้อมูลอยู่ในดิสก์หรือในหน่วยความจำที่ไหนสักแห่งและทำให้มีการสั่งซื้อ ถามเขาว่าอะไรคือลำดับของข้อมูลที่คำนวณได้จากหลาย ๆ ตาราง เช่นสร้างตัวอย่างที่คุณเข้าร่วม 4 ตารางทำการคำนวณกับ 2 ของพวกเขาและส่งกลับเพียงค่าที่คำนวณได้

เอ็นจิ้นส่งคืนข้อมูลตามลำดับที่พบ (ขาดคำสั่งซื้อ) แต่วิธีการค้นหานั้นขึ้นอยู่กับปัจจัยที่สามารถเปลี่ยนแปลงได้ - ดัชนี, สถิติ, แคช โดยทั่วไปข้อมูลจะอยู่ในลำดับที่สอดคล้องกัน - แต่หากคุณขึ้นอยู่กับคำสั่งซื้อคุณจะต้องขอข้อมูลนั้น

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