2014-10-10 19 views
5

Nếu một PK của bảng là int tự động tăng tiêu chuẩn (Id) và các bản ghi được tải xuống và cập nhật hầu như luôn luôn gần hơn với ID tối đa. -thay chí liệu chỉ mục nhóm PK được sắp xếp là tăng dần hay giảm dần?Thứ tự sắp xếp chỉ số nhóm có tác động đến hiệu suất

Khi PK được tạo, SSMS theo mặc định đặt thứ tự sắp xếp của chỉ mục tăng dần và vì các hàng được truy cập nhiều nhất luôn là hàng gần với ID tối đa hiện tại, tôi tự hỏi liệu việc thay đổi sắp xếp thành giảm dần tăng tốc độ truy xuất vì các bản ghi sẽ được sắp xếp từ trên xuống thay vì từ dưới lên và các bản ghi gần đầu được truy cập thường xuyên nhất.

+0

Có vẻ như nó không quan trọng, chỉ mục trong Btree cho SQL biết trang nào cần lấy dữ liệu. Tại thời điểm đó, tôi không nghĩ rằng hướng của loại này sẽ có bất kỳ sự liên quan nào. – Andrew

+0

Để thêm vào các phản hồi b-tree, số trang được chạm sẽ giống nhau 'ASC' hoặc' DESC'. 'DESC' thường có lợi khi đặc tả khớp với một mệnh đề' ORDER BY' của truy vấn. –

+1

Liên quan đến [this] (http://stackoverflow.com/questions/743858/sql-server-indexes-ascending-or-descending-what-difference-does-it-make) có một vài câu trả lời khá hay. –

Trả lời

2

Tôi không nghĩ rằng sẽ có bất kỳ lần truy cập hiệu suất nào. Vì nó sẽ thực hiện tìm kiếm nhị phân cho khóa chỉ mục để truy cập và sau đó là khối dữ liệu cụ thể với khóa đó. Dù bằng cách nào, tìm kiếm nhị phân đó sẽ đạt độ phức tạp O(log N). Vì vậy, trong tổng số O(log N) + 1 và vì chỉ mục được nhóm, nên chỉ số này là O(log N) độ phức tạp về thời gian; vì các bản ghi bảng được sắp xếp theo thứ tự vật lý thay vì có một trang/khối chỉ mục riêng biệt.

+0

Nếu tôi cũng sử dụng OrderByDescending (Id) trong truy vấn của mình thì sao? –

+0

Đối với một chỉ mục cột đơn, nó sẽ giống nhau theo một trong hai cách nhưng nếu bạn có chỉ số nhóm được xác định là tổng hợp thì nó có thể có ý nghĩa. – Rahul

2

Chỉ mục sử dụng cấu trúc cây B, vì vậy không. Nhưng nếu bạn có chỉ mục dựa trên nhiều cột, bạn muốn các cột riêng biệt nhất ở cấp ngoài và ít nhất là ở cấp độ bên trong. Ví dụ, nếu bạn có 2 cột (giới tính và tuổi), bạn sẽ muốn tuổi ở bên ngoài và giới tính ở bên trong, bởi vì chỉ có 2 giới tính có thể, trong khi có nhiều tuổi hơn. Điều này sẽ ảnh hưởng đến hiệu suất.

+1

Điều này nói ngược lại: http://dba.stackexchange.com/questions/33196/multicolumn-index-and-performance. Nó khuyến nghị lập chỉ mục Giới tính đầu tiên (kiểm tra bình đẳng) sau đó Tuổi (kiểm tra phạm vi) – Anon

+0

@Anon thực sự là câu trả lời hàng đầu tuyên bố nó "không quan trọng". Nhưng tôi có thể nói với bạn từ kinh nghiệm của riêng tôi, nó chắc chắn có. Bạn muốn chọn lọc nhất ở bên ngoài. Tôi đã có một truy vấn cách đây không lâu, tôi đã có các chỉ số ngược trở lại trên một bảng tạm thời, và bằng cách làm điều này tôi cắt giảm tốc độ từ ~ 3 phút xuống <2 phút. – iliketocode

+0

@ user3738391 đọc kỹ hơn: nó nói nó không quan trọng * nếu cả hai biến vị ngữ là kiểm tra bình đẳng, không phải thử nghiệm phạm vi *. Trong trường hợp của bạn {tuổi, giới tính}, truy vấn phạm vi độ tuổi có nhiều khả năng hơn truy vấn giới tính. Ý tưởng 'chọn lọc đầu tiên' của bạn là một quy tắc tốt, nhưng bạn đã chọn một ví dụ xấu với giới tính, vì nó sẽ không bao giờ được sử dụng như 'CHỌN * Ở ĐÂU GIỚI THIỆU GIỮA 'M' VÀ 'T'' Nó luôn luôn là một sự bình đẳng thử nghiệm hoặc không phải là một vị từ ở tất cả, có nghĩa là nó phải là chỉ số bên ngoài. – Anon

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