Vũ Huy Tâm SQL Seminar Hè 2011 - SQLViet blog Hà nội 30/07 ... Server Index.pdf · Clustered...
Transcript of Vũ Huy Tâm SQL Seminar Hè 2011 - SQLViet blog Hà nội 30/07 ... Server Index.pdf · Clustered...
Vũ Huy Tâm
SQL Seminar Hè 2011 - SQLViet blog
Hà nội 30/07/2011
Nội dung Cơ bản về index
Các loại index
So sánh tính năng từng loại index
Nghỉ giải lao
Tối ưu hóa sử dụng index
Các kỹ thuật sử dụng index nâng cao
Bảo trì index
Kết luận
SQL Seminar Hè 2011 - © SQLViet blog 2
Cơ bản về index Tương tự như mục index ở cuối mỗi quyển sách
Mục đích: tạo shortcut đến dữ liệu cần tìm
Có cấu trúc dữ liệu dạng B-Tree
Khoảng cách từ gốc đến mọi node lá tương đương
nhau
SQL Seminar Hè 2011 - © SQLViet blog 3
Ví dụ: thống kê doanh thu phim tại Mỹ tuần 17/6
SQL Seminar Hè 2011 - © SQLViet blog 4
root
A < Ten <= H H < Ten <= N N < Ten <= Z
Brides
maids
Hangover
Part II
FilmID Ten Doanh thu
1 Green Latern $53.2M
2 Super 8 $73M
3 Mr. Popers Penguins $18.4M
4 X-Men: First Class $120M
5 Hangover Part II $233M
6 Kung Fu Panda 2 $144M
7 Bridesmaids $136M
Kung Fu
Panda 2
Green
Latern
Mr. Popers
Penguins
Super 8 X-Men:
First Class
Index theo trường Ten
Cơ bản về index (Cont’d) Tại sao cần index
Nâng cao hiệu năng thực hiện câu lệnh
Giảm khóa trên bảng
Thực thi ràng buộc unique constraint
Hai loại index trình bày hôm nay:
Clustered index và nonclustered index
Các loại index không được đề cập: XML index,
spatial index, fulltext index
SQL Seminar Hè 2011 - © SQLViet blog 5
Clustered index Sắp xếp bảng theo thứ tự của khóa index
Toàn bộ bảng trở thành cây index. Các node lá chứa
khóa index và đồng thời chứa tất cả các trường còn
lại
SQL Seminar Hè 2011 - © SQLViet blog 6
Clustered index (Cont’d)
SQL Seminar Hè 2011 - © SQLViet blog 7
FilmID Ten Doanh thu
1 Green Latern $53.2M
2 Super 8 $73M
3 Mr. Popers Penguins $18.4M
4 X-Men: First Class $120M
5 Hangover Part II $233M
6 Kung Fu Panda 2 $144M
7 Bridesmaids $136M
Ví dụ
Clustered index (Cont’d)
SQL Seminar Hè 2011 - © SQLViet blog 8
root
1 < FilmID <= 4 4 < FilmID <= 7
Clustered Index theo trường FilmID
FilmID 1
Ten Green Latern
DoanhThu 53.2
FilmID 2
Ten Super 8
DoanhThu 73
FilmID 7
Ten Bridesmaids
DoanhThu 136…
Clustered index (Cont’d) Chỉ có thể tối đa một clustered index cho mỗi bảng
Clustered index có thể chứa một hoặc nhiều trường
Khi tạo Primary Key, một cách mặc định clustered
index được tạo kèm với nó
Đây là cách thông thường để tạo clustered index
SQL Seminar Hè 2011 - © SQLViet blog 9
Nonclustered index Mỗi node lá chứa khóa index và con trỏ trỏ đến trang
dữ liệu chứa bản ghi tương ứng
Nếu bảng có clustered index, con trỏ này chính là
khóa clustered index
Nếu bảng không có clustered index, con trỏ này là
RowID, một dạng định danh bản ghi kết hợp của
fileID + pageID + offset
Bảng có thể có nhiều nonclustered index
Index có thể chứa một hoặc nhiều trường
Được lưu trữ tách rời khỏi bảng
SQL Seminar Hè 2011 - © SQLViet blog 10
Nonclustered index (Cont’d)
SQL Seminar Hè 2011 - © SQLViet blog 11
root
Ten Bridesmaids
FilmID 7
Ten Green Latern
FilmID 2
Ten X-Men: First Class
FilmID 4…
Đã có clustered index (FilmID)
A < Ten <= H H < Ten <= N N < Ten <= Z
root
Ten Bridesmaids
RowID 10107823
Ten Green Latern
RowID 10107956
Ten X-Men: First Class
RowID 102001930…
A < Ten <= H H < Ten <= N N < Ten <= Z
Không có clustered index
Clustered vs. Nonclustered Clustered index:
Tránh bookmark lookup
Nâng cao độ ổn định cho nonclustered index
Chỉ được phép tạo một clustered index
Non-clustered index:
bookmark lookup giảm hiệu năng
Cho phép tạo nhiều index trên bảng
Lưu trữ độc lập với bảng tăng khả năng xử lý song
song
SQL Seminar Hè 2011 - © SQLViet blog 12
Index bị xáo trộn khi cập nhật
SQL Seminar Hè 2011 - © SQLViet blog 13
Page 1
…
RowID 101085
Ten Iphone4
Mota
Page 2
RowID 101086
Ten Iphone4
Mota All the
breakt..
Ten Iphone4
RowID 101085
Data Index
…
RowID 101084
Ten Galaxy
Mota …
• Trường Mota của bản ghi Iphone4 trống, bản ghi vẫn lưu trữ đủ trong page 1
• Node index của Iphone4 chứa con trỏ là RowID hiện tại của bản ghi Iphone4
Index bị xáo trộn khi cập nhật
SQL Seminar Hè 2011 - © SQLViet blog 14
UPDATE SanPham
SET Mota = ‘All the breakthrough technology in iPhone 4 is…’
WHERE Ten = ‘Iphone4’
Index bị xáo trộn khi cập nhật
SQL Seminar Hè 2011 - © SQLViet blog 15
Page 1
…
Page 2
RowID 101086
Ten Iphone4
Mota All the
breakt..
Ten Iphone4
RowID 101085
Ten Iphone4
RowID 101086
Data Index
…
RowID 101084
Ten Galaxy
Mota …
• Kích thước bản ghi Iphone4 tăng, vượt quá không gian còn trống của trang.
Bản ghi được chuyển sang trang mới
• Node index cũng phải cập nhật con trỏ theo
Unique và non-unique index unique (duy nhất) và non-unique (không duy nhất) là
các thuộc tính của index
Mỗi index đều có thể unique hoặc non-unique
Tuy nhiên, clustered index thường là unique
Khi clustered index không unique, mỗi node được gắn
thêm một chuỗi 4 byte (thực chất là một số INT
dương) để trở thành unique.
Khi đó số bản ghi tối đa cho bảng ~ 2 tỷ
Khi khai báo ràng buộc unique constraint, một unique index được tạo để thực thi ràng buộc này
SQL Seminar Hè 2011 - © SQLViet blog 16
Unique và non-unique index
UNIQUE NON-UNIQUE
CLUSTERED
NON-CLUSTERED
SQL Seminar Hè 2011 - © SQLViet blog 17
Index seek và Index scan Index seek: khi hệ thống có thể nhảy thẳng đến
node cần tìm
Đây là thao tác tối ưu
Index scan: khi hệ thống cần quét cả cây index để
lấy ra các node cần tìm
Không tối ưu bằng index seek, nhưng tốt hơn table
scan
SQL Seminar Hè 2011 - © SQLViet blog 18
Chọn cột đánh index Cột là ứng cử viên tốt cho index khi:
Được sử dụng thường xuyên trong điều kiện tìm kiếm (mệnh đề WHERE)
Được sử dụng trong điều kiện JOIN hai bảng
Độ lựa chọn (selectivity) đủ cao
Ưu tiên clustered index cho cột:
Tăng tuần tự
Kích thước không quá lớn
Được tìm kiếm với tần suất cao
Thường được tìm kiếm theo dải giá trị
SQL Seminar Hè 2011 - © SQLViet blog 19
Độ lựa chọn
SQL Seminar Hè 2011 - © SQLViet blog 20
Độ lựa chọn cao Độ lựa chọn thấpCây index trên trường giới tínhCây index trên trường số CMT
Độ lựa chọn = Số giá trị khác biệt / Số bản ghi
Để index được sử dụng Độ lựa chọn (selectivity) đủ cao
Với nonclustered index, khi selectivity quá thấp bộ
Optimizer bỏ qua index do chi phí lớn
Tránh chuyển đổi kiểu dữ liệu (type conversion)
Tránh áp dụng hàm lên cột index
Cột đầu tiên trong khóa index phải được sử dụng cho tìm kiếm (với composite index)
SQL Seminar Hè 2011 - © SQLViet blog 21
Index với lệnh JOIN Index giúp giảm không gian tìm kiếm chọn thuật
toán hiệu quả hơn
SQL Seminar Hè 2011 - © SQLViet blog 22
Các kỹ thuật index nâng cao Covering index
Lưu thêm các cột dữ liệu vào node index
Giúp tránh truy nhập vào bảng để lấy dữ liệu
Filtered index
Index cho một số bản ghi nhất định
Index intersection
Nhiều index cùng tham gia lọc dữ liệu
Di chuyển index sang filegroup khác với bảng
Đọc index và đọc bảng diễn ra song song
SQL Seminar Hè 2011 - © SQLViet blog 23
Bảo trì index Các thao tác cập nhật (INSERT/UPDATE/DELETE)
làm index bị phân mảnh
Hai dạng phân mảnh:
Hai node kế tiếp không được lưu trữ liền kề nhau
Trang (page) chứa nhiều không gian trống
Phân mảnh làm tăng số trang cần đọc cho cùng
lượng dữ liệu giảm hiệu năng truy vấn
Thông tin về phân mảnh: sys.dm_db_index_physical_stats
SQL Seminar Hè 2011 - © SQLViet blog 24
Bảo trì index (Cont’d) Rebuild và Reorganize index:
Dùng để cấu trúc lại index, do đó giảm thiểu được
phân mảnh
Re-org thao tác nhanh hơn nhưng không hiệu quả khi
index bị phân mảnh nặng
Khi độ phân mảnh <=30% REORGANIZE
Khi độ phân mảnh > 30% REBUILD
SQL Seminar Hè 2011 - © SQLViet blog 25
Bảo trì index Cập nhật Statistics:
Statistics chứa thông tin về phân bố dữ liệu của cột
giúp Optimizer chọn phương án thực thi thích hợp
Sau quá trình cập nhật dữ liệu, statistics bị outdated
dẫn đến Optimizer chọn phương án sai
Thống kê về sử dụng index:
sys.dm_db_index_usage_stats
SQL Seminar Hè 2011 - © SQLViet blog 26
Kết luận Index là công cụ quan trọng trợ giúp các truy vấn
vào database
Phần lớn sự cố về performance liên quan đến index
Mặt trái của index :
Chiếm không gian đĩa
Tăng chi phí của các thao tác cập nhật dữ liệu
Hệ thống OLTP:
Cần điều hòa các lợi ích
Index có chọn lọc
Hệ thống Data warehouse: index tự do hơn
SQL Seminar Hè 2011 - © SQLViet blog 27
www.sqlviet.com/blog