2009-07-10 39 views
6

Bàn có được sắp xếp nội tại bằng khóa chính không? Nếu tôi có một bảng với khóa chính trên cột nhận dạng BigInt, tôi có thể tin tưởng rằng các truy vấn sẽ luôn trả về dữ liệu được sắp xếp theo khóa hoặc tôi có cần thêm một cách rõ ràng "ORDER BY" hay không. Sự khác biệt hiệu suất là đáng kể.Phân loại khóa chính

Trả lời

11

Dữ liệu được lưu trữ trên thực tế theo chỉ mục nhóm, thường là khóa chính nhưng không nhất thiết phải như vậy.

Dữ liệu trong SQL không được đảm bảo để có thứ tự không có mệnh đề ORDER BY. Bạn nên luôn luôn chỉ định một mệnh đề ORDER BY khi bạn cần dữ liệu theo thứ tự cụ thể. Nếu bảng đã được sắp xếp theo cách đó, trình tối ưu hóa sẽ không thực hiện thêm bất kỳ công việc nào, do đó không có hại gì trong việc có bảng đó.

Không có mệnh đề ORDER BY, RDBMS có thể trả về các trang được lưu trong bộ nhớ cache khớp với truy vấn của bạn trong khi chờ các bản ghi được đọc từ đĩa. Trong trường hợp đó, ngay cả khi có chỉ mục trên bảng, dữ liệu có thể không đi vào thứ tự của chỉ mục. (Lưu ý đây chỉ là một ví dụ - Tôi không biết hoặc thậm chí nghĩ rằng một thực tế RDBMS sẽ làm điều này, nhưng đó là hành vi chấp nhận được đối với một thực hiện SQL.)

EDIT

Nếu bạn có tác động hiệu suất khi sắp xếp so với khi không sắp xếp, có thể bạn đang sắp xếp trên một cột (hoặc tập hợp các cột) không có chỉ mục (nhóm hoặc theo cách khác). Cho rằng đó là một chuỗi thời gian, bạn có thể sắp xếp dựa trên thời gian, nhưng chỉ số nhóm là trên bigint chính. SQL Server không biết rằng cả hai đều tăng cùng một cách, do đó, nó phải nghỉ mát tất cả mọi thứ.

Nếu cột thời gian và cột khóa chính có liên quan theo thứ tự (một tăng nếu và chỉ khi cột kia tăng hoặc giữ nguyên), hãy sắp xếp theo khóa chính thay thế. Nếu chúng không liên quan theo cách này, hãy di chuyển chỉ mục nhóm từ khóa chính sang bất kỳ cột nào mà bạn sắp xếp theo.

+1

Đoạn đầu tiên nên nói "Dữ liệu được lưu trữ trên thực tế theo chỉ mục nhóm ...". Mọi thứ khác Welbog nói áp dụng - chỉ vì nó được lưu trữ trên thực tế [trong mỗi trang] theo thứ tự không có nghĩa là bạn sẽ lấy lại nó theo thứ tự đó. Phân mảnh đĩa vật lý cũng có thể có tác động đến điều này. –

+0

@Philip Kelley: Thay đổi để phản ánh cách nói tốt hơn của bạn. Cảm ơn. – Welbog

+0

Tôi đang thực sự phân loại trên khóa chính (đó là BigInt). Dữ liệu đã được chèn vào theo kiểu đặt hàng (theo ngày). –

0

Trong SQL Server: không, bằng khóa phân cụm - được đặt mặc định cho khóa chính, nhưng không nhất thiết phải giống nhau.

Chức năng chính của khóa chính là xác định duy nhất mỗi hàng trong bảng - nhưng nó không ngụ ý bất kỳ phân loại vật lý nào.

Không chắc chắn về các hệ thống cơ sở dữ liệu khác.

Marc

0

Điều này có thể được triển khai cụ thể, nhưng MySQL dường như sắp xếp theo khóa chính theo mặc định. Tuy nhiên, bất kỳ lúc nào bạn cần đảm bảo rằng các hàng sẽ được đặt hàng theo một cách nhất định, bạn nên thêm ORDER BY.

+0

chỉ khi khóa chính cũng là KEY CLUSTERING - mà nó là theo mặc định, nhưng không phải là ....... –

+0

Ah cảm ơn đó là điều tốt để biết. –

1

Bảng theo mặc định không được 'nhóm', tức là được tổ chức bởi PK. Bạn có tùy chọn chỉ định nó như vậy. Vì vậy, mặc định là "HEAP" (không theo thứ tự cụ thể), và tùy chọn bạn đang tìm kiếm là "CLUSTERED" (SQL Server, trong Oracle được gọi là IOT).

  • Một bảng chỉ có thể có một nhóm (có ý nghĩa)
  • Sử dụng PRIMARY KEY cú pháp Clustered trên thứ tự DDL
  • bởi PK vẫn cần phải được cấp trên lựa chọn của bạn, thực tế của nó được nhóm sẽ làm cho truy vấn chạy nhanh hơn, vì gói trình tối ưu hóa sẽ biết rằng nó không cần phải thực hiện sắp xếp theo chỉ mục được nhóm lại

Biểu mẫu trước đó là chính xác, SQL (và cơ sở lý thuyết của nó) xác định cụ thể chọn như một bộ/bộ không có thứ tự.

SQL thường cố gắng để ở trong lĩnh vực hợp lý và không đưa ra giả định về tổ chức/địa điểm vật lý, v.v. của dữ liệu. Tùy chọn CLUSTERED cho phép chúng ta làm điều đó cho các tình huống thực tế trong cuộc sống thực.

0

Hầu hết mọi lúc, nó sẽ sắp xếp theo các bảng Identity. Nó sắp xếp theo chỉ mục nhóm và có thể không luôn được sắp xếp theo danh tính, nhưng tôi chưa bao giờ thấy nó không được sắp xếp theo id danh tính khi chọn *. Lý do đằng sau việc không chỉ định một đơn hàng là gì? Tôi không hiểu tại sao nó gây ra sự khác biệt về hiệu suất.

+0

Lý do hoàn toàn dựa trên hiệu suất (xem bình luận ở trên). –

2

Không có ORDER BY rõ ràng, không có thứ tự sắp xếp mặc định. Một câu hỏi rất phổ biến. Như vậy, có một câu trả lời đóng hộp: "Sự khác biệt hiệu suất là đáng kể"

Without ORDER BY, there is no default sort order.

bạn có thể xây dựng tại sao?

+0

Dữ liệu là chuỗi thời gian và các truy vấn đang thu thập dữ liệu giá trị tháng trở lại. Nếu không có thứ tự Bằng thủ tục lưu sẵn có thể bắt đầu trả về các hàng trong vài giây. Với Order By nó lên đến một phút trước khi hàng đầu tiên trả về. –

+0

Bạn có thể thử TÙY CHỌN (NHANH 1) http://msdn.microsoft.com/en-us/library/ms181714.aspx –

1

Bạn phải áp dụng ORDER BY để đảm bảo đơn đặt hàng. Nếu bạn nhận thấy sự khác biệt về hiệu suất hơn có khả năng dữ liệu của bạn không được sắp xếp mà không có ORDER BY tại chỗ — nếu không thì SQL-Server phải hoạt động kém vì không nhận ra dữ liệu đã được sắp xếp. Việc thêm ORDER BY vào dữ liệu đã được sắp xếp sẽ không phải chịu một hình phạt hiệu suất vì RDBMS phải đủ thông minh để nhận ra thứ tự của dữ liệu.

Các vấn đề liên quan