2014-12-15 11 views
5

Tôi có 2 bảng tb_player1tb_player2.Khi nào sử dụng chỉ mục tổng hợp và chỉ số bao trùm trong SQL Server?

CREATE TABLE tb_player1 
(
    pk_id INT PRIMARY KEY IDENTITY (1,1) NOT NULL, 
    first_name CHAR(16), 
    last_name CHAR(16), 
    age INT 
) 

CREATE NONCLUSTERED INDEX ix_nonclustered_name ON tb_player1(first_name, last_name) 

CREATE TABLE tb_player2 
(
    pk_id INT PRIMARY KEY IDENTITY (1,1) NOT NULL, 
    first_name CHAR(16), 
    last_name CHAR(16), 
    age INT 
) 

CREATE NONCLUSTERED INDEX ix_nonclustered_name ON tb_player2(first_name) 
INCLUDE (last_name) 

Các tb_player1 có một chỉ số tổng hợp và tb_player2 đã bao gồm (chỉ số bao gồm) cột.

tôi chạy các câu lệnh SQL sau đây đối với tb_player1tb_player2, nhưng kế hoạch thực hiện thực tế của tb_player1tb_player2 đều giống nhau.

INSERT INTO tb_player1 VALUES('kenny', 'lee', 29) 
INSERT INTO tb_player1 VALUES('rose', 'chao', 27) 
INSERT INTO tb_player1 VALUES('mark', 'chao', 25) 

INSERT INTO tb_player2 VALUES('kenny', 'lee', 29) 
INSERT INTO tb_player2 VALUES('rose', 'chao', 27) 
INSERT INTO tb_player2 VALUES('mark', 'chao', 25) 



select first_name, last_name from tb_player1 where first_name = 'kenny' 
select first_name, last_name from tb_player2 where first_name = 'kenny' 

select first_name, last_name from tb_player1 where last_name = 'lee' 
select first_name, last_name from tb_player2 where last_name = 'lee' 

select first_name, last_name from tb_player1 where first_name = 'kenny' AND last_name = 'lee' 
select first_name, last_name from tb_player2 where first_name = 'kenny' AND last_name = 'lee' 

select first_name, last_name from tb_player2 where last_name = 'lee' AND first_name = 'kenny' 
select first_name, last_name from tb_player1 where last_name = 'lee' AND first_name = 'kenny' 

Khi nào sử dụng chỉ mục tổng hợp và chỉ mục bao gồm trong SQL Server? Sự khác biệt giữa chúng là gì? Tại sao kế hoạch thực hiện của họ trông không khác nhau.

+1

http://stackoverflow.com/questions/1589818/a-covered-index-formed-by-a-composite-index-or-index-with-included-columns –

+1

@Kenny_Lee kế hoạch không chính xác như nhau, nếu bạn nhìn vào chỉ mục tìm kiếm hoạt động trong hai ví dụ cuối cùng, bạn sẽ thấy rằng truy vấn đầu tiên tìm kiếm trên firstname và lastname trong khi tìm kiếm thứ hai chỉ trên firstname. Điều này không quan trọng trong trường hợp của bạn bởi vì bạn có rất ít hàng, nhưng có thể có tác động nếu bạn có một số lượng lớn các hàng phù hợp. –

Trả lời

5
  1. Chỉ mục tổng hợp (trong đó tất cả các cột là cột "khóa") sẽ mang dữ liệu ở tất cả các cấp của chỉ mục; chỉ số INCLUDE sẽ chỉ mang các cột “không quan trọng” trong nút lá. Lấy đi: Chỉ số INCLUDE sẽ nhỏ hơn chỉ số tổng hợp tương đương.

  2. Cột INCLUDE (không chính) sẽ không được tính vào kích thước chỉ mục tối đa (900 byte).

  3. Nội dung cập nhật cho các cột không chính trong chỉ mục INCLUDE sẽ không đóng góp vào phân mảnh chỉ mục; các cập nhật cho các cột "khóa" không được sử dụng trong chỉ mục tổng hợp sẽ dẫn đến phân mảnh ... IMO, đây là một vấn đề lớn.

  4. Giả sử phân đoạn chỉ mục thấp, cả chỉ mục tổng hợp lẫn INCLUDE sẽ hoạt động tương đối. Tất cả các cột trong chỉ mục tổng hợp không cần phải ở vị từ truy vấn.

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