เหตุใด SSMS จึงแทรกแถวใหม่ที่ด้านบนของตารางไม่ใช่ด้านล่าง


14

เมื่อใดก็ตามที่ฉันแทรกแถวลงในตารางด้วยตนเองใน SQL Server Management Studio 2008 (ฐานข้อมูลคือ SQL Server 2005) แถวใหม่ของฉันจะปรากฏที่ด้านบนของรายการมากกว่าด้านล่าง ฉันใช้คอลัมน์ข้อมูลประจำตัวและผลลัพธ์เช่นนี้

id  row
42 first row
1 second row
2 third row

เมื่อแถวถูกดึงออกมาและไม่ได้เรียงลำดับอย่างชัดเจน สิ่งนี้ส่งผลให้มีลักษณะที่แตกต่างเมื่อดึงแถวสำหรับเว็บแอปและเปลี่ยนสิ่งที่TOP 1แบบสอบถามส่งกลับ

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


อย่างที่ฉันได้เห็นบางครั้งก็ขึ้นอยู่กับการเรียงลำดับของการเรียงลำดับของ PK หากคุณเลือกตารางเดียว หากคุณเข้าร่วมบางอย่างก็สามารถเปลี่ยนแปลงได้ขึ้นอยู่กับตารางอื่น ๆ ของ PK, FK และดัชนี ...
Guillermo Gutiérrez

ระวังการสแกนไปรอบๆ ด้วย
Michael Green

คำตอบ:


21

ในโลก SQL การสั่งซื้อไม่ใช่คุณสมบัติโดยธรรมชาติของชุดข้อมูล ดังนั้นคุณจะไม่ได้รับการรับรองจาก RDBMS ว่าข้อมูลของคุณจะกลับมาในลำดับที่แน่นอนหรือแม้กระทั่งในลำดับที่สอดคล้องกันเว้นแต่ว่าคุณจะสืบค้นข้อมูลด้วยORDER BYประโยค

จากCraig Freedman :

การรวมค่า TOP กับ ORDER BY เข้าด้วยกันจะเป็นการกำหนดระดับของแถวที่ส่งคืน หากไม่มี ORDER BY ชุดของแถวที่คืนจะขึ้นอยู่กับแผนแบบสอบถามและอาจแตกต่างกันไปจากการดำเนินการจนถึงการดำเนินการ

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


13

เพียงเพื่อเพิ่มคำตอบอื่น ๆ : ตารางคือตามคำนิยามชุดของแถวที่ไม่เรียงลำดับ หากคุณไม่ได้ระบุORDER BYอนุประโยคไว้ SQL Server มีอิสระในการส่งคืนแถวในลำดับใดก็ตามที่เห็นว่ามีประสิทธิภาพมากที่สุด สิ่งนี้จะเกิดขึ้นบ่อยครั้งเพื่อให้ตรงกับลำดับของการแทรกเนื่องจากตารางส่วนใหญ่มีดัชนีคลัสเตอร์ที่ระบุตัวตนวันที่และเวลาหรือคอลัมน์อื่น ๆ ที่เพิ่มความน่าเบื่อหน่าย แต่คุณควรปฏิบัติเหมือนกันนั่นคือเรื่องบังเอิญ มันสามารถเปลี่ยนแปลงได้ด้วยข้อมูลใหม่การอัพเดตสถิติการตั้งค่าสถานะการติดตามการเปลี่ยนแปลง maxdop คำแนะนำการค้นหาการเปลี่ยนแปลงการเข้าร่วมหรือที่ส่วนคำสั่งในแบบสอบถามการเปลี่ยนแปลงโปรแกรมเพิ่มประสิทธิภาพเนื่องจากเซอร์วิสแพ็ค / การปรับปรุงสะสม / โปรแกรมแก้ไข / สะสม ย้ายฐานข้อมูลไปยังเซิร์ฟเวอร์อื่น ฯลฯ

กล่าวอีกนัยหนึ่งและฉันรู้ว่าคุณรู้คำตอบแล้ว แต่ไม่สามารถระบุได้เพียงพอ:

หากคุณต้องการที่จะพึ่งพาคำสั่งของแบบสอบถามเสมอ ORDER BYเพิ่ม


ฉันไม่ได้วางแผนโดยขึ้นอยู่กับคำสั่งซื้อ แต่จริงๆแล้วมันน่ารำคาญนิดหน่อยที่รายการที่แทรกล่าสุดของฉันอยู่ด้านบนสุด
Ben Brocka

ฉันคิดว่านี่เป็นเพราะคุณใช้ Open Table ใน Management Studio 2008 คำสั่งนี้ถูกแยกออกเป็น "แก้ไขแถวบนสุด n" และ "เลือกแถวบนสุด N" - เมื่อคุณเลือกหลังคุณมีอิสระที่จะแก้ไขแบบสอบถามที่เป็นผลลัพธ์เช่นลบด้านบนและเพิ่มคำสั่งซื้อโดย
Aaron Bertrand

เป็นสตูดิโอการจัดการ 2008 เซิร์ฟเวอร์ในปี 2005 ควรจะชัดเจนขึ้น ผมไม่ทราบว่ามีคำสั่ง "ตารางเปิด" ผมเคยใช้เสมอselectstatments
เบน Brocka

4
ตกลงดียังคงยืนอยู่ฉันเข้าใจว่ามันน่ารำคาญที่ข้อมูลกลับมาในลำดับที่คุณไม่คาดหวัง แต่ฉันหวังว่ามันชัดเจนแล้วตอนนี้ทำไม SQL Server ไม่สนใจสิ่งที่คุณคาดหวังเว้นแต่คุณจะบอกว่าคุณใส่ใจ โดยการเพิ่มคำสั่งโดยข้อ :-)
Aaron Bertrand

1

เป็นเพราะตารางเป็นตารางฮีป (เป็นไปได้มากที่สุด) และไม่มีการทำดัชนี ทำให้คอลัมน์ ID เช่นเดียวกับPRIMARY KEY IDENTITYSQL Server จะจัดเก็บข้อมูลตามดัชนีตัวอย่างเช่นถ้า id เป็นดัชนีคลัสเตอร์ (เช่นคีย์หลัก) ข้อมูลจะถูกจัดเก็บทางกายภาพตามลำดับรหัสและจะส่งคืนวิธีนั้นในคิวรีแม้จะไม่มีORDER BYข้อ มิฉะนั้นการเรียงลำดับแถวไม่สำคัญกับฐานข้อมูลเลย ดังนั้นการมีแอปพลิเคชันขึ้นอยู่กับลำดับของแถวในฐานข้อมูล (รวมถึงขึ้นอยู่กับคอลัมน์ที่อยู่ในลำดับที่แน่นอน) ไม่ใช่วิธีปฏิบัติที่ดี แอปพลิเคชันต้องทำงานกับคีย์ใดก็ตามที่มีอยู่ในฐานข้อมูลเพื่อระบุแถว


ดีแล้วที่รู้. ฉันรู้ว่านี่เป็นคำใบ้ในการเปลี่ยนแอพที่จะใช้order by(เป็นแอพที่สืบทอดมาพร้อมกับการฝึกฝนที่ไม่ดี) แต่ฉันสงสัยว่าทำไมมันถึงเกิดขึ้น
Ben Brocka

5
เปลี่ยนโครงสร้างของตารางเพื่อSELECT *ไม่ให้ORDER BY อาจกลับมาตามลำดับ "ถูกต้อง" (แต่ยังไม่รับประกัน)
Aaron Bertrand

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

5
ไม่สำคัญว่าดัชนีคลัสเตอร์คืออะไร SQL Server อาจยังคงส่งคืนใบสั่งตามดัชนีอื่น ๆ ตามปัจจัยที่หลากหลาย การสร้างคีย์หลักในบางคอลัมน์ไม่รับประกันว่าการเลือกโดยไม่มีคำสั่งจะกลับมาเรียงลำดับโดยคอลัมน์นั้นเสมอ คุณอาจสังเกตว่าส่วนใหญ่เวลา? แน่ใจ แต่นั่นไม่เหมือนกับการรับประกัน ฉันไม่เคยเห็นหมีขั้วโลกบนถนนของฉัน แต่ไม่มีสนามพลังหมีขั้วโลกที่ป้องกันไม่ให้เกิดขึ้น
Aaron Bertrand

4
ยังไงก็ตามประเด็นของฉันคือการเพิ่มส่วนORDER BYคำสั่งเป็นการรับประกันที่ดีกว่า (ไม่ต้องคำนึงถึงความยุ่งยากที่น้อยลง) กว่าการเปลี่ยนโครงสร้างตารางและหวังว่าการสั่งซื้อจะเป็นไปตามที่คุณคาดหวังตลอดไป
Aaron Bertrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.