Liệu DB2 sắp xếp dữ liệu theo khóa chính


8

Gần đây tôi đã có một cuộc thảo luận với một đồng nghiệp, người đang cố gắng xóa thứ tự bằng các mệnh đề khỏi truy vấn sản xuất vì thứ tự theo cột giống như khóa chính .

Sau một cuộc thảo luận dài, trong đó tôi đã cố gắng giải thích rằng anh ta không thể đảm bảo việc đặt hàng dựa trên khóa chính, kết luận cuối cùng là anh ta sẽ không thay đổi các truy vấn MSSQL.
Nhưng anh vẫn sẽ thay đổi các truy vấn DB2.

Tôi không thể ngay lập tức tìm thấy một bài viết từ chối rằng các lệnh truy vấn của DB2 bằng khóa chính và hiện đang tự hỏi liệu nó có hay không.

Vì vậy, câu hỏi của tôi là, làm thế nào để DB2 đặt hàng một truy vấn nếu không có thứ tự theo mệnh đề? Nó có sử dụng khóa chính không?
Làm thế nào bạn có thể đảm bảo dữ liệu được sắp xếp theo thứ tự một cách chính xác, không có thứ tự theo mệnh đề, trong một hệ thống song song?

Câu trả lời:


18

Không, đồng nghiệp của bạn là sai.

Tất cả các proroducts SQL - DBMS hoạt động theo các tiêu chuẩn SQL - không đảm bảo rằng kết quả của một đầu ra truy vấn sẽ được sắp xếp theo bất kỳ cách nào, trừ khi có một ORDER BYmệnh đề trong truy vấn .

Như các tài liệu IBM IBM đã đề cập :

Đặt hàng được thực hiện theo các quy tắc so sánh được mô tả trong các yếu tố Ngôn ngữ. Giá trị null cao hơn tất cả các giá trị khác. Nếu đặc tả thứ tự của bạn không xác định một thứ tự hoàn chỉnh, các hàng có giá trị trùng lặp của khóa sắp xếp được xác định cuối cùng có một thứ tự tùy ý. Nếu bạn không chỉ định ORDER BY, các hàng của bảng kết quả có thứ tự tùy ý.


"Nếu họ hành xử theo tiêu chuẩn SQL" là một vấn đề lớn nếu ... IBM tài liệu FTW.
WernerCD

@WernerCD Không DBMS tuân thủ 100% với tiêu chuẩn (và có nhiều phiên bản của nó.) Nhưng họ tuyên bố tuân thủ nhiều phần. Tôi hy vọng ít nhất có nơi họ khác nhau, được ghi lại.
ypercubeᵀᴹ

Vâng, đó là lý do tại sao tôi được +1 cho các tài liệu của IBM về "Tiêu chuẩn". "Dự kiến" so với "Thực tế" có thể, và chắc chắn nhất sẽ, cắn bạn trong keister.
WernerCD

11

Như đã được chỉ ra trong câu trả lời của ypercube, khi không có ORDER BYmệnh đề thì không có thứ tự xác định .

Điều tôi muốn nói thêm là điều quan trọng là phải nhận ra rằng SQL rất trừu tượng, nó không chỉ rõ từng bước DBMS sẽ làm gì mà chỉ xác định các yêu cầu của bạn về kết quả cuối cùng.

Điều này ngụ ý rằng nếu dữ liệu đã được tra cứu theo cách đảm bảo đúng thứ tự, thì điều này là do DBMS đã quyết định chiến lược như vậy và sau đó sẽ biết rằng không có công việc sắp xếp bổ sung nào là cần thiết để đáp ứng các yêu cầu của ORDER BYmệnh đề .

Mặt khác, nếu bạn không chỉ định rằng thứ tự đó có ý nghĩa đối với bạn (mặc dù thực tế là vậy?), DBMS sẽ tính đến điều này và nếu nó tìm thấy một chiến lược khác hiệu quả hơn để tìm đúng dữ liệu trong một số thứ tự khác nó sẽ lợi dụng thực tế là bạn dường như không quan tâm đến đơn đặt hàng. (Chiến lược được chọn cũng có thể thay đổi theo thời gian, dựa trên việc tăng lượng dữ liệu trong các bảng có liên quan, các bản vá phần mềm, v.v.)

Tức là, loại bỏ ORDER BYmệnh đề có rất ít nhược điểm (kích thước truy vấn nhỏ hơn một chút) nhưng có thể có nhược điểm rất lớn nếu thứ tự thực sự quan trọng. Đặc biệt là như vậy, vì điều này rất có thể làm việc với bộ dữ liệu thử nghiệm và chỉ thông qua thử nghiệm chấp nhận để gây ra sự cố nghiêm trọng.


1
Lý do anh đưa ra trên bảng triển khai của mình là "Đặt hàng bằng cách chiếm tài nguyên CPU, trong khi đơn hàng đã được ngụ ý bởi khóa chính". Điều này nghe có vẻ rất sai đối với tôi (như đã được chứng minh bằng các câu trả lời cho đến nay)
Reaces 23/12/14

@Reaces mặc định DB2 sử dụng các bảng 'heap' hay nó giống với SQL Server hơn với các chỉ mục được nhóm? Nó không thay đổi câu trả lời, nhưng nó có thể giúp chứng minh dễ dàng hơn :)
Jack nói hãy thử topanswers.xyz

@Jack Douglas, phân cụm trong SQL Server và DB2 là các khái niệm khác nhau. Tôi đã học được rất nhiều về việc phân cụm trong máy chủ SQL trong luồng này: Groups.google.com/d/msg/comp.database.ms-sqlserver/P7Wcs4NcF4s/ . Tôi quen thuộc với máy chủ SQL nhưng không phải với DB2, bạn có thể muốn xem qua.
Lennart

Các bảng @Reaces trong DB2 thường được "phân cụm" trên khóa chính theo mặc định, trừ khi chỉ định phân cụm được chỉ định.
Chris Aldrich

1
@ChrisAldrich - tuyên bố này chỉ đúng với DB2 trên z / OS.
mustaccio
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.