sql server index

28
Huy Tâm SQL Seminar Hè 2011 - SQLViet blog nội 30/07/2011

Upload: tam-truong-hoai

Post on 24-Oct-2014

49 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: SQL Server Index

Vũ Huy Tâm

SQL Seminar Hè 2011 - SQLViet blog

Hà nội 30/07/2011

Page 2: SQL Server Index

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

Page 3: SQL Server Index

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

Page 4: SQL Server Index

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

Page 5: SQL Server Index

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

Page 6: SQL Server Index

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

Page 7: SQL Server Index

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ụ

Page 8: SQL Server Index

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…

Page 9: SQL Server Index

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

Page 10: SQL Server Index

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

Page 11: SQL Server Index

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

Page 12: SQL Server 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

Page 13: SQL Server Index

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

Page 14: SQL Server Index

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’

Page 15: SQL Server Index

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

Page 16: SQL Server Index

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

Page 17: SQL Server Index

Unique và non-unique index

UNIQUE NON-UNIQUE

CLUSTERED

NON-CLUSTERED

SQL Seminar Hè 2011 - © SQLViet blog 17

Page 18: SQL Server Index

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

Page 19: SQL Server Index

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

Page 20: SQL Server Index

Độ 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

Page 21: SQL Server Index

Để 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

Page 22: SQL Server Index

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

Page 23: SQL Server Index

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

Page 24: SQL Server Index

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

Page 25: SQL Server Index

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

Page 26: SQL Server Index

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

Page 27: SQL Server Index

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

Page 28: SQL Server Index

www.sqlviet.com/blog