Làm thế nào để SQL Server đặt hàng kết quả khi tham gia được sử dụng?


10

Làm thế nào để SQL Server tìm ra thứ tự của các bản ghi trong tập kết quả thực hiện truy vấn?

Tôi đang cố gắng để làm cho đầu hoặc đuôi của nó nhưng thấy mình gãi đầu. Khi tôi thay đổi các trường tôi đang chọn thứ tự cũng thay đổi. Khi tôi thực thi SQL dưới đây với một SELECT *bản ghi tôi có cùng các bản ghi nhưng theo một thứ tự khác nhau.

 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
Một vài ý kiến ​​/ câu hỏi: (1) tại sao lại sử dụng nút ma thuật pixie-Dust turbo NOLOCK trên một bàn duy nhất? Bạn đã cân nhắc sử dụng RCSI thay vì voodoo chưa? (2) tại sao bạn không sử dụng tiền tố lược đồ phù hợp? Trước đây, hãy tìm kiếm trên web NOLOCK- bạn sẽ thấy tất cả các loại lý do tại sao bạn không nên sử dụng nó. Để biết thêm thông tin, hãy xem sqlblog.com/bloss/aaron_bertrand/archive/2009/10/11/NH
Aaron Bertrand

RCSI? vui lòng giải thích ...
kacalacco

2
RCSI = Đọc cách ly ảnh chụp cam kết. Xem stackoverflow.com/questions/816650/ Mạnh
Aaron Bertrand

Không có một ORDER BYmệnh đề, SQL Server (và bất kỳ RDBMS nào khác) làm bất cứ điều gì nó cảm thấy thích .
Nick Chammas

Câu trả lời:


17

Vì bạn chưa nói với SQL Server cách đặt hàng kết quả, nên bạn có thể tự do làm điều đó là hiệu quả nhất. Theo cách này, nó sẽ phụ thuộc vào giá rẻ nhất để sắp xếp và các cột bạn chọn sẽ điều khiển bởi vì nó phụ thuộc vào chỉ số rẻ nhất để sử dụng để lấy thông tin theo yêu cầu của truy vấn. Điều này có thể thay đổi từ thực thi sang thực thi không chỉ bằng cách thay đổi văn bản truy vấn mà còn bởi những thứ như thay đổi dữ liệu, cập nhật thống kê, freeproccache, gói dịch vụ, hotfix, v.v. Điều này đặc biệt dễ bay hơi với rất nhiều bảng liên quan nếu dữ liệu cơ bản thay đổi nhanh chóng , vì nó có xu hướng làm trong các ứng dụng OLTP.

Nếu bạn muốn một thứ tự dự đoán, tại sao bạn không sử dụng ORDER BYtruy vấn? Như được viết, SQL chỉ định rằng bất kỳ 900 hàng nào đều được chấp nhận, theo bất kỳ thứ tự nào.

Mặc dù, trong rất nhiều trường hợp, bạn thấy cùng một thứ tự lặp đi lặp lại cho cùng một truy vấn, không có gì đảm bảo trừ khi bạn nói ORDER BY <something>.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.