SQL Server สั่งซื้อผลลัพธ์อย่างไรเมื่อใช้การรวม


10

SQL Server จะหาลำดับของระเบียนในชุดผลลัพธ์ของการดำเนินการแบบสอบถามได้อย่างไร

ฉันพยายามทำให้หัวหรือก้อยของมัน แต่พบว่าตัวเองเกาหัวของฉัน เมื่อฉันเปลี่ยนเขตข้อมูลฉันกำลังเลือกคำสั่งซื้อก็จะเปลี่ยนไปเช่นกัน เมื่อฉันรัน SQL ด้านล่างด้วยSELECT *ฉันได้รับบันทึกเดียวกัน แต่ในลำดับที่แตกต่างกันมาก

 SELECT TOP (900)
    AD.ATTACHMENTID,
    AD.NAME,
    AD.ISINLINE,
    AD.INSERTEDDATETIME,
    ATMT.ATTACHMENTBLOB,
    U.UFID
  FROM ATTACHMENTDETAIL AD WITH (NOLOCK)
  INNER JOIN MESSAGEATTACHMENT MA ON MA.ATTACHMENTID = AD.ATTACHMENTID
  INNER JOIN ATTACHMENT ATMT ON ATMT.ATTACHMENTID = AD.ATTACHMENTID
  INNER JOIN MESSAGE MSG ON MSG.ID = MA.MESSAGEID
  INNER JOIN MESSAGEDETAIL MD ON MD.MESSAGEID = MA.MESSAGEID
  INNER JOIN [USER] U ON U.ID = MD.USERID
  LEFT OUTER JOIN XmlExtractionMapping XM ON MA.MESSAGEID = XM.MessageId
    WHERE AD.FILEBOXTOKEN IS NULL 
    AND (XM.XMLEXTRACTIONDATE IS NOT NULL OR 
         (MSG.MESSAGESOURCEID = 1 AND MD.FolderId <> -4))
    AND AD.ISINLINE = 'FALSE'

6
ความเห็น / คำถามสองสามข้อ: (1) ทำไมต้องใช้ปุ่มวิเศษ pixie-dust turbo NOLOCK ในตารางเดียวเท่านั้น? คุณได้พิจารณาใช้ RCSI แทน voodoo หรือไม่? (2) ทำไมคุณไม่ใช้คำนำหน้าสคีมาที่เหมาะสม สำหรับอดีตค้นหาจากเว็บNOLOCKคุณจะเห็นเหตุผลทุกประการว่าทำไมคุณไม่ควรใช้มัน สำหรับหลังดูsqlblog.com/blogs/aaron_bertrand/archive/2009/10/11//
Aaron Bertrand

RCSI? กรุณาอธิบาย ...
kacalapy

2
RCSI = การอ่าน Snapshot Isolated ดูstackoverflow.com/questions/816650/…
Aaron Bertrand

โดยไม่ต้องมีORDER BYข้อ SQL Server (และ RDBMS อื่น ๆ ) ไม่สิ่งที่มันให้ความรู้สึกเหมือน
Nick Chammas

คำตอบ:


17

เนื่องจากคุณไม่ได้แจ้งให้ SQL Server ทราบถึงวิธีการสั่งซื้อผลลัพธ์คุณสามารถดำเนินการได้อย่างมีประสิทธิภาพมากที่สุด ด้วยวิธีนี้มันจะขึ้นอยู่กับสิ่งที่ถูกที่สุดในการเรียงลำดับและคอลัมน์ที่คุณเลือกจะขับนั้นเพราะขึ้นอยู่กับดัชนีที่ถูกที่สุดที่จะใช้เพื่อรับข้อมูลที่ร้องขอ สิ่งนี้สามารถเปลี่ยนจากการดำเนินการเป็นการดำเนินการไม่เพียงแค่เปลี่ยนข้อความแบบสอบถาม แต่ยังรวมถึงสิ่งต่าง ๆ เช่นการเปลี่ยนแปลงข้อมูลการปรับปรุงสถิติ freeproccache เซอร์วิสแพ็คโปรแกรมแก้ไขด่วนและอื่น ๆ นี่คือความผันผวนโดยเฉพาะอย่างยิ่งกับตารางจำนวนมากที่เกี่ยวข้อง เนื่องจากมีแนวโน้มที่จะทำในแอปพลิเคชัน OLTP

หากคุณต้องการคำสั่งซื้อที่คาดเดาได้ทำไมคุณไม่ใช้ORDER BYกับแบบสอบถาม ตามที่เขียนไว้ SQL จะระบุว่าแถวใดแถวหนึ่ง 900 แถวเป็นที่ยอมรับได้ในลำดับใด ๆ

ORDER BY <something>แม้ว่าในหลายกรณีที่คุณจะเห็นลำดับเดียวกันซ้ำแล้วซ้ำอีกสำหรับการค้นหาเดียวกันไม่มีการรับประกันจนกว่าคุณจะบอกว่า

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