GV Phi Loan - Khoa CNTT – HUI

1

Nội dung

• Cơ bản về chỉ mục • Chỉ mục: mục đích và các loại chỉ mục • Kế hoạch thực thi chỉ mục • Rebuild/ Reorganize chỉ mục

GV Phi Loan - Khoa CNTT – HUI

2

Heap file • Mỗi bản ghi (record) đều có 1 mã nhận dạng duy nhất (unique identifier), gọi tắt là rid. • Tất cả các bản ghi được lưu trữ theo thứ tự

ngẫu nhiên (random order) vào file.

• File không xếp thứ tự (unordered file) được gọi là heap file. Các bản ghi sẽ đuợc lưu trữ trong các trang (page) có cùng kích cỡ.

GV Phi Loan - Khoa CNTT – HUI

3

Cấu trúc heap file

GV Phi Loan - Khoa CNTT – HUI

4

Tìm kiếm và chỉ mục

• Cấu trúc của heap file không hỗ trợ

nhiều cho việc tìm kiếm

• Để tìm các bản ghi thỏa mãn 1 điều kiện nào đó, ta cần phải tìm trên tất cả các trang dữ liệu.

• File chỉ mục là 1 cấu trúc file phụ để hỗ

trợ việc tìm kiếm rid của các bản ghi thỏa mãn điều kiện dò tìm (search condition)

GV Phi Loan - Khoa CNTT – HUI

5

Chỉ mục - Indexes

• Mục đích: cải thiện việc truy tìm dữ liệu. • Ý tưởng: tương tự như index của sách.

– Mỗi mục trong chỉ mục (index entry) sẽ chứa 1

thuật ngữ (term) và 1 con trỏ (pointer) để chỉ đến trang chứa thuật ngữ đó trong quyển sách. – Các entry được sắp xếp theo thuật ngữ để tạo

thành 1 bảng gọi là bảng chỉ mục.

– Thay vì duyệt (scan) cả quyển sách, chỉ cần truy xuất đến bảng chỉ mục giúp định vị nhanh trang chứa thuật ngữ cần tìm.

GV Phi Loan - Khoa CNTT – HUI

6

Chỉ mục - Index

• Index chứa:

– 1 tập hợp các đầu vào chỉ mục (index entry) – Cơ chế dò tìm entry dựa vào giá trị search key

• Các cơ chế dò tìm:

– Các index entry được xếp theo search key như

ISAM hay B+ tree

– Hash index

GV Phi Loan - Khoa CNTT – HUI

7

B-tree indexes

• B-tree index nằm riêng trên những trang index, có 1 mức gốc (root level), một hay nhiều mức trung gian (intermediate levels), và 1 mức lá (leaf) hay mức node.

• Các cột được sắp xếp bởi b-tree index được

gọi là cột khóa (key) của index.

• Sự khác nhau giữa chỉ mục clustered và non- clustered là số lượng và loại dữ liệu được lưu trữ ở mức lá.

GV Phi Loan - Khoa CNTT – HUI

8

Index và truy vấn tối ưu

• Các index được thiết kế tốt sẽ giảm thao tác I/O đĩa

và tiêu tốn tài nguyên ít hơn.

• Các chỉ mục có thể hổ trợ cho nhiều loại truy vấn

chứa các lệnh SELECT, UPDATE, DELETE, và MERGE. • Khi thực thi truy vấn, query optimizer đánh giá và

chọn phương pháp nào hữu hiệu nhất để khôi phuc̣ dữ liệu – Duyệt qua toàn bộ bảng (table scan) – Duyệt qua 1 hay nhiều chỉ mục nếu có.

GV Phi Loan - Khoa CNTT – HUI

9

Index và truy vấn tối ưu

• Khi duyệt toàn bảng, query optimizer đọc tất cả các hàng trong bảng, và trích ra các hàng thỏa mãn điều kiện truy vấn.

• Việc duyệt bảng phát ra nhiều thao tác I/O

đĩa, tiêu tốn nhiều tài nguyên hơn.

• Phương pháp duyệt bảng (table scan) có thể là phương pháp hiệu quả nhất nếu bảng kết quả của truy vấn chứa hầu hết các hàng có trong bảng.

GV Phi Loan - Khoa CNTT – HUI

10

Index và truy vấn tối ưu

• Khi query optimizer sử dụng index, nó dò tìm cột khóa của chỉ mục, tìm vị trí lưu trữ của hàng trong bảng và trích ra hàng dữ liệu thỏa mãn điều kiện truy vấn.

• Việc dò tìm chỉ mục nhanh hơn nhiều so với

duyệt bảng, vì chỉ mục chỉ chứa 1 số cột và các hàng trong chỉ mục đã được sắp xếp.

GV Phi Loan - Khoa CNTT – HUI

11

Phân loại cột trong mệnh đề WHERE

• Cột bằng (Equality column): các cột xuất hiện trong mệnh đề WHERE với dấu =. • Cột không bằng (Inequality column): các cột xuất hiện trong mệnh đề WHERE với dấu (>) hay BETWEEN.

GV Phi Loan - Khoa CNTT – HUI

12

Thiết kế chỉ mục hiệu quả

• Khi xây dựng chỉ mục trên nhiều cột, cần phải liệt kê các cột bằng trước khi liệt kê các cột không bằng. – Khi chọn thứ tự các cột bằng, nên liệt kê

cột hay chọn nhiều nhất.

– Sau khi liệt kê tất cả các cột bằng, tiếp tục liệt kê các cột không bằng, nên liệt kê cột không bằng hay chọn nhiều nhất.

GV Phi Loan - Khoa CNTT – HUI

13

Thiết kế chỉ mục hiệu quả

• Khi kết nối với 1 bảng khác, nên tạo chỉ

mục cho cột được dùng kết nối với bảng khác.

GV Phi Loan - Khoa CNTT – HUI

14

Thiết kế chỉ mục

• Thiết kế chỉ mục không tốt, hoặc không dùng chỉ mục đều là nguyên nhân cơ bản cho việc “bottlenecks” cho các ứng dụng của database.

• Chọn lựa đúng chỉ mục cần phải xét sự cân đối giữa tốc độ truy vấn và chi phí cập nhật. • Các chỉ mục ít cột đòi hỏi không gian đĩa ít và

chi phí bảo trì thấp.

• Các chỉ mục nhiều cột có thể hổ trợ cho nhiều

truy vấn hơn .

GV Phi Loan - Khoa CNTT – HUI

15

Phân loại chỉ mục

• Các loại chỉ mục trong SQL Server 2012:

– Clustered – Non-clustered – Covering – Filtered – Primary XML – Secondary XML {Path, Property, Value} – Spatial – Full-text – Columnstore

GV Phi Loan - Khoa CNTT – HUI

16

Clustered indexes

– Clustered indexes sắp xếp và lưu trữ các hàng dữ liệu trong bảng hay view theo giá trị khóa của index. – Mỗi bảng chỉ có duy nhất 1 clustered index – Hình ảnh tượng trưng của clustered index là telephone book

GV Phi Loan - Khoa CNTT – HUI

17

Clustered indexes

– Khi bảng có chứa clustered index thì các hàng của bảng được xếp thứ tự. Bảng còn được gọi là clustered table. – Nếu bảng không chứa clustered index thì các hàng của bảng lưu trữ tự do và được gọi là heap

GV Phi Loan - Khoa CNTT – HUI

18

unordered heap

• Cũng có thể tạo 1 bảng không cần có clustered index  dữ liệu được lưu trữ vào 1 heap không xếp thứ tự. Mỗi hàng sẽ được xác định bởi mã RowID của heap.

• RowID là vị trí vật l{ thực sự của hàng, gồm 3 giá trị: FieldID:PageNum:SlotNum, và không thể truy vấn trực tiếp đến nó được.

• Chỉ mục non-clustered indexes lưu trữ RowID của

heap thay vì lưu trữ khóa chỉ mục clustered.

GV Phi Loan - Khoa CNTT – HUI

19

Ví dụ minh họa clustered index

with an identity column as the clustered index key. The first name is the data column.

GV Phi Loan - Khoa CNTT – HUI

20

GV Phi Loan - Khoa CNTT – HUI

21

Nonclustered indexes – Chỉ mục nonclustered tách riêng khỏi bảng dữ liệu. – Chỉ mục nonclustered chứa các giá trị khóa và mỗi giá trị khóa có 1 con trỏ (pointer) trỏ đến hàng dữ liệu chứa giá trị khóa đó. Con trỏ này được gọi là row locator. – Trong SQL Server 2008, một bảng có thể có tới 999 nonclustered index

GV Phi Loan - Khoa CNTT – HUI

22

Nonclustered indexes –Cấu trúc của row locator phụ thuộc vào các trang dữ liệu được lưu trữ trong heap hay trong bảng clustered.

• Nếu trong heap, row locator là 1 con trỏ trỏ đến RowID của heap • Nếu trong bảng clustered, row locator là khóa chỉ mục clustered

–Hình ảnh tượng trưng của nonclustered index là bảng chỉ mục nằm cuối sách

GV Phi Loan - Khoa CNTT – HUI

23

Ví dụ minh họa nonclustered index

first name as the key column. The non-clustered index includes pointers to the clustered index key column. GV Phi Loan - Khoa CNTT – HUI

24

GV Phi Loan - Khoa CNTT – HUI

25

Covering Indexes

• Nếu chỉ mục non-clustered chứa thêm các thông tin cần thiết cho 1 truy vấn được gọi là covering index.

• Dùng covering indexes được xem như

chiến lược chính để cải thiện việc thực thi truy vấn.

GV Phi Loan - Khoa CNTT – HUI

26

Covering Indexes

• Nhờ đưa thêm thông tin vào chỉ mục

non-clustered mà tránh được thao tác look up. – Look up: thao tác mà hệ thống sau khi tìm kiếm trên cây index xong, phải nhảy tới bản ghi tương ứng trong bảng dữ liệu để lấy các trường dữ liệu cần trả về

GV Phi Loan - Khoa CNTT – HUI

27

Ví dụ USE AdventureWorks GO SELECT ContactID, FirstName, LastName FROM Person.Contact WHERE EmailAddress = 'kristina1@adventure.com'

GV Phi Loan - Khoa CNTT – HUI

28

Ví dụ

CREATE NONCLUSTERED INDEX Contact_EmailAddress ON Person.Contact(EmailAddress) INCLUDE (FirstName,LastName) • Nếu tạo chỉ mục icovering như trên sẽ tránh

được chi phí look up

• Lệnh trên vẫn tạo index trên trường

EmailAddress, nhưng đồng thời “ký gửi” hai trường FirstName và LastName vào đó.

GV Phi Loan - Khoa CNTT – HUI

29

Ví dụ

• Key Lookup đã biến mất, bước truy nhập vào bảng dữ liệu đã bị loại bỏ, vì tất cả các trường dữ liệu mà câu lệnh yêu cầu đã được tìm thấy ngay tại index. Điều này cũng có nghĩa là chi phí câu lệnh được giảm đi một nửa

GV Phi Loan - Khoa CNTT – HUI

30

Thao tác truy vấn

• SQL Server sử dụng 3 thao tác chính để

tìm dữ liệu: – Table scan: đọc cả heap – Index scan: đọc toàn bộ mức lá của chỉ mục

clustered hay non-clustered

– Index seek: định vị hàng dữ liệu thông qua

b-tree

GV Phi Loan - Khoa CNTT – HUI

31

Bookmark lookup

• Đối với các truy vấn không thường

xuyên, tìm kiếm theo bookmark rất phù hợp nhưng với các truy vấn tiêu tốn nhiều CPU thì kiểu tìm kiếm này không phù hợp.

GV Phi Loan - Khoa CNTT – HUI

32

Bookmark lookup

SELECT * FROM Production.WorkOrder WHERE ProductID = 757;

Tìm các hàng có mã ProductID là 757 và

trả về tất cả cột cho các hàng này.

Bảng WorkOrder có chỉ mục clustered

trên cột WorkOrderID

GV Phi Loan - Khoa CNTT – HUI

33

Bookmark lookup

• Query Optimizer có 2 tùy chọn sau để

thực thi: – Option 1: Duyệt toàn bộ chỉ mục clustered để truy xuất đến tất cả các cột, sau đó lọc kết quả đề tìm ra các hàng thỏa mãn điều kiện dò tìm.

GV Phi Loan - Khoa CNTT – HUI

34

Bookmark lookup

– Option 2: Thực hiện dò tìm chỉ mục trên

bảng chỉ mục IX_Workload_ProductID để tìm ra 11 hàng thỏa mãn điều kiện. Trong quá trình tìm kiếm, optimizer biết được giá trị của WorkOrderID của 11 hàng này (vì cột khóa chỉ mục clustered đều nằm ở mức lá của chỉ mục non-clustered). Sau đó nó có thể dò tìm theo giá trị của 11 hàng này từ chỉ mục clustered để tìm các cột khác.

GV Phi Loan - Khoa CNTT – HUI

35

Bookmark lookup

• Option 2 nhảy từ chỉ mục non-clustered tìm hàng sang chỉ mục clustered để lấy toàn bộ các cột cần thiết cho truy vấn được gọi là bookmark lookup

GV Phi Loan - Khoa CNTT – HUI

36

Chỉ mục

• Đa số các DBMS đều tạo chỉ mục tự động cho các trường primary key  bảng chỉ mục được tích hợp vào bảng dữ liệu.

• Các chỉ mục trên các trường khác được

lưu vào bảng chỉ mục.

GV Phi Loan - Khoa CNTT – HUI

37

Chỉ mục trong SQL Server

• Chỉ mục clustered còn được gọi là chỉ mục sơ cấp ( primary index) hay main index

• Unclustered index thường được gọi là

secondary index

• Thường thì với mỗi bảng chỉ có 1 clustered index và có thể có nhiều unclustered index

GV Phi Loan - Khoa CNTT – HUI

38

Index và truy vấn tối ưu

• Nếu không có chỉ mục, query optimizer phải

sử dụng phương pháp duyệt bảng

• SQL Server cung cấp công cụ Database Engine Tuning Advisor giúp phân tích môi trường database và chọn index phù hợp.

GV Phi Loan - Khoa CNTT – HUI

39

Chỉ mục phức (composite index)

• Chỉ mục phức có thể là clustered hay non-

clustered mà cột khóa của nó gồm nhiều cột.

• Thực tế chỉ mục phức rất thông dụng. • Thứ tự các cột trong chỉ mục phức là quan

trọng. Để sử dụng chỉ mục phức, điều kiện dò tìm phải bao gồm các cột chỉ mục từ trái sang phải.

GV Phi Loan - Khoa CNTT – HUI

40

Chỉ mục phức (composite index)

• Ví dụ: nếu có 1 chỉ mục phức mà khóa bao gồm lastname, firstname, việc dò tìm theo firstname sẽ không thể nhanh được nếu dùng chỉ mục, nhưng nếu dò tìm theo lastname, hay lastname và firstname thì chỉ mục sẽ được sử dụng rất hiệu quả.

GV Phi Loan - Khoa CNTT – HUI

41

Chỉ mục và các ràng buộc

• Chỉ mục unique clustered được tạo tự động khi các ràng buộc PRIMARY KEY và UNIQUE được tạo. Tuy nhiên vẫn có thể tạo chỉ mục unique là non- clustered.

• Thực tế ràng buộc unique và chỉ mục unique chỉ là

một, chỉ cần tạo 1 trong loại.

• Sụ khác nhau cơ bản giữa unique constraint/index và primary key là primary key không cho phép giá trị null, còn unique constraint/index cho phép 1 giá trị null.

GV Phi Loan - Khoa CNTT – HUI

42

Lệnh tạo chỉ mục

• Ví dụ : Create index idxname ON Customer (FirstName, LastName)

GV Phi Loan - Khoa CNTT – HUI

43

Lệnh tạo chỉ mục

GV Phi Loan - Khoa CNTT – HUI

44

Fill factor

• Khi chỉ mục được tạo hay rebuild , giá trị fill-factor xác định phần trăm không gian trên mỗi trang mức lá sẽ chứa dữ liệu, để dành phần còn lại trên mỗi trang để mở rộng trong tương lai.

• Ví dụ: nếu fill-factor là 80 có nghĩa là 20% của mỗi trang mức lá sẽ được để trống

GV Phi Loan - Khoa CNTT – HUI

45

Fill factor

• Nếu khóa chỉ mục clustered là IDENTITY, nếu xác định fill factor <100 sẽ làm cho các trang mức lá của index luôn trống vì các hàng mới luôn được viết vào trang cuối.

• Nếu khóa chỉ mục clustered với giá trị bất kz, chọn thừa số fill factor <100 sẽ hạn chế việc phân trang

GV Phi Loan - Khoa CNTT – HUI

46

Page Splits

• Chọn giá trị fill-factor phù hợp sẽ hạn chế được tình trạng phân trang (page split).

• Khi 1 hàng mới được thêm vào 1 trang index

đã đầy, Database Engine sẽ chuyển ½ số hàng sang trang mới  việc phân trang sẽ tạo chỗ trống để thêm hàng mới nhưng sẽ mất thời gian thực hiện và hao tốn tài nguyên. Bảng index sẽ phải rebuilt để phân bố lại dữ liệu.

GV Phi Loan - Khoa CNTT – HUI

47

Ví dụ

USE AdventureWorks2012; GO CREATE INDEX IX_Emp_OrgaLevel_OrgNode ON HumanResources.Employee

(OrganizationLevel, OrganizationNode)

WITH (DROP_EXISTING = ON, FILLFACTOR = 80); GO

GV Phi Loan - Khoa CNTT – HUI

48

Phân mảnh (Fragmentation)

• Khi các trang index mà thứ tự logic cuả các giá trị khóa không còn trùng với thứ tự vật lý trong file dữ liệu được gọi là phân mảnh.

• Khi mới đuợc tạo, index chưa bị phân

mảnh, sau 1 thời gian, do dữ liệu bị sửa đổi, index trở nên phân mảnh.

GV Phi Loan - Khoa CNTT – HUI

49

Kiểm tra tình trạng phân mảnh

• Cách 1: Mở property của index cần kiểm tra, chọn

trang Fragmentation

• Cách 2:

– Dùng hàm hệ thống sys.dm_db_index_physical_stats

sys.dm_db_index_physical_stats (

{ database_id | NULL | 0 | DEFAULT } , { object_id | NULL | 0 | DEFAULT } , { index_id | NULL | 0 | -1 | DEFAULT } , { partition_number | NULL | 0 | DEFAULT } , { mode | NULL | DEFAULT } )

GV Phi Loan - Khoa CNTT – HUI

50

Ví dụ Kiểm tra tình trạng phân mảnh

USE AdventureWorks2008; GO SELECT a.index_id, name, avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats (DB_ID(N'AdventureWorks2012'), OBJECT_ID(N'HumanResources.Employee'), NULL, NULL, NULL) AS a JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;

GO

GV Phi Loan - Khoa CNTT – HUI

51

Chỉ tiêu kỹ thuật về phân mảnh

• Nếu mức độ phân mảnh >30% nên

rebuild lại index

• Nều mức phân mảnh <10% :index chưa

bị phân mảnh đáng kể

GV Phi Loan - Khoa CNTT – HUI

52

Reorganize or rebuild an index

• Dùng Management Studio • Dùng T-SQL

GV Phi Loan - Khoa CNTT – HUI

53

Reorganize an index

• Dùng Management Studio

– Để reorganize 1 index: nhấp phải tại inddex,

chọn lệnh Reorganize

– Để reorganize tất cả index của 1 bảng: nhấp

phải tại folder indexes, chọn lệnh Reorganize All

GV Phi Loan - Khoa CNTT – HUI

54

Reorganize indexes

• Dùng T-SQL USE AdventureWorks2008; GO -- Reorganize an index ALTER INDEX IX_Emp_OrgLevel_OrgNode ON HumanResources.Employee REORGANIZE ; GO -- Reorganize all indexes on a table. ALTER INDEX ALL ON HumanResources.Employee

REORGANIZE ;

GO

GV Phi Loan - Khoa CNTT – HUI

55

Rebuild an index

• Dùng Management Studio

– Để rebuild 1 index: nhấp phải tại inddex,

chọn lệnh Rebuild

– Để rebuild tất cả index của 1 bảng: nhấp phải tại folder indexes, chọn lệnh Rebuild All

GV Phi Loan - Khoa CNTT – HUI

56

Rebuild indexes

• Dùng T-SQL USE AdventureWorks2008; GO -- Rebuild an index ALTER INDEX PK_Employee_BusinessEntityID ON

HumanResources.Employee REBUILD;

GO -- Reorganize all indexes on a table. ALTER INDEX ALL ON Production.Product

REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);

GO

GV Phi Loan - Khoa CNTT – HUI

57

Theo dõi các chỉ mục đang thiếu

• Mỗi lần query optimizer biên dịch 1 lệnh T-SQL, SQL Server 2012 theo dõi khoảng 500 chỉ mục mới nhất hiện có mà optimizer có thể đã dùng để thực thi truy vấn hiệu quả hơn. – Nhờ vào 3 DMV (dynamic management

view) và 1 hàm DMF (dynamic management function)

GV Phi Loan - Khoa CNTT – HUI

58

Theo dõi các chỉ mục đang thiếu

GV Phi Loan - Khoa CNTT – HUI

59

Ví dụ

• Lệnh sau liệt kê các index bị thiếu có thể có lợi cho các T-SQL batches đã được dùng ( đã gửi về cho query optimizer) kể từ lần cuối dịch vụ SQL Server được khởi động lại:

GV Phi Loan - Khoa CNTT – HUI

60

Ví dụ

GV Phi Loan - Khoa CNTT – HUI

61

Duyệt lại các index không dùng

• Có những chỉ mục được định nghĩa cho các bảng nhưng lại không bao giờ được dùng đến.

• Mỗi khi 1 bảng được chèn, cập nhật hay xóa, thì các chỉ mục liên quan đến bảng cũng sẽ được bảo trì để phản ánh các thay đổi này. – Nếu quá nhiều index mà query optimizer sẽ không

dùng đến làm ảnh hưởng đến việc thực thi. • Duyệt có định kz để tìm các index không được

dùng đến.

GV Phi Loan - Khoa CNTT – HUI

62

Duyệt lại các index không dùng

• Không nên xóa các chỉ mục không dùng đến

mà chỉ nên disable.

• Nếu sau này cần dùng đến chỉ cần rebuild lại

index đó.

• Ví dụ: lệnh sau chỉ ra số thao tác được thực thi cùng với index, đồng thời chỉ ra việc sử dụng index so với chi phí của index đó.

GV Phi Loan - Khoa CNTT – HUI

63

Ví dụ

GV Phi Loan - Khoa CNTT – HUI

64

Index with included column

• Chỉ mục có cột không khoá included có thể cải thiện đáng kể tốc độ thực thi truy vấn khi tất cả cột trong truy vấn đều có mặt trong chỉ mục. Query optimizer có thể định vị tất cả giá trị cột ngay bên trong truy vấn, không cần truy vấn đến bảng dữ liệu nữa  số thao tác I/O giảm.

GV Phi Loan - Khoa CNTT – HUI

65

Index with included column

• Chỉ mục nonclustered bị hạn chế về kích cỡ:

– Số cột khóa tối đa là 16 – Kích cỡ khóa chỉ mục tối đa là 900 bytes

GV Phi Loan - Khoa CNTT – HUI

66

Ví dụ về giới hạn kích cỡ của chỉ mục

• Giả sử muốn tạo chỉ mục cho 3 cột sau

trong bảng Document của DB AdventureWorks – Title nvarchar(50) – Revision nchar(5) – FileName nvarchar(400)

GV Phi Loan - Khoa CNTT – HUI

67

Ví dụ về giới hạn kích cỡ của chỉ mục

• Chỉ mục chứa 3 cột này vượt quá 900

byte. Để khắc phục hạn chế này nên tạo chỉ mục có trường không khoá được INCLUDE vào.

CREATE INDEX IX_Document_Title ON Production.Document (Title, Revision) INCLUDE (FileName);

GV Phi Loan - Khoa CNTT – HUI

68

Ví dụ về thiết kế chỉ mục

• Giả sử có truy vấn sau: USE AdventureWorks; GO SELECT AddressLine1, AddressLine2, City,

StateProvinceID, PostalCode

FROM Person.Address WHERE PostalCode BETWEEN N'98000' and N'99999'; Hãy thiết kế chỉ mục hỗ trợ truy vấn này??

GV Phi Loan - Khoa CNTT – HUI

69

Ví dụ về thiết kế chỉ mục

CREATE INDEX IX_Address_PostalCode ON Person.Address (PostalCode) INCLUDE (AddressLine1, AddressLine2, City,

StateProvinceID);

GV Phi Loan - Khoa CNTT – HUI

70

Bất lợi của index

• Chiếm không gian đĩa • Nếu index lớn thì các trang index cần

được đọc vào bộ nhớ  tốn chi phí cho thao tác vào ra (I/O)

• Index cần được bảo trì (maintenance):

các chỉ mục phải được sửa đổi cùng với sự thay đổi của dữ liệu

GV Phi Loan - Khoa CNTT – HUI

71

Tính toán không gian đĩa

• Khi index được tạo, cần dùng không gian

đĩa: – Lưu trữ cấu trúc cũ và mới. Cấu trúc cũ vẫn chưa bị hủy bỏ chừng nào transaction tạo index chưa được commit.

– Không gian tạm dùng cho thao tác sắp xếp

GV Phi Loan - Khoa CNTT – HUI

72

Ví dụ tính toán không gian đĩa dùng cho index • Giả sử trước khi tạo index, một CSDL thỏa mãn

các điều kiện sau: – Bảng chứa 1 triệu row, mỗi row chiếm 200 byte. – Chỉ mục nonclustered A chứa 1 triệu row. Mỗi row

dài 50 byte.

– Chỉ mục nonclustered B chứa 1 triệu row. Mỗi row

dài 80 byte.

– Bộ nhớ dành cho việc tạo index là 2 MB. – Giá trị fill factor là 80 dùng cho tất cả index cũ và

mới  Các trang đầy 80 %.

GV Phi Loan - Khoa CNTT – HUI

73

Ví dụ tính toán không gian đĩa dùng cho index (Offline Index Operation)

• Xác định kích cỡ của cấu trúc nguồn • Xác định kích cỡ của cấu trúc index • Xác định không gian tạm dùng để sắp xếp

GV Phi Loan - Khoa CNTT – HUI

74

Ví dụ tính toán không gian đĩa dùng cho index (Offline Index Operation) • Xác định kích cỡ của cấu trúc nguồn – Heap: 1 million * 200 bytes ~ 200 MB – Nonclustered index A: 1 million * 50 bytes /

80% ~ 63 MB

– Nonclustered index B: 1 million * 80 bytes /

80% ~ 100 MB

 Tổng kích cỡ cho cấu trúc hiện có là 363

MB

GV Phi Loan - Khoa CNTT – HUI

75

Ví dụ tính toán không gian đĩa dùng cho index (Offline Index Operation) • Xác định kích cỡ của cấu trúc index

– Clustered index: 1 million * 200 bytes / 80% ~

250 MB

– Nonclustered index A: 1 million * (50 – 8 + 24)

bytes / 80% ~ 83 MB

– Nonclustered index B: 1 million * (80 – 8 + 24)

bytes / 80% ~ 120 MB

Tổng kích cỡ của cấu trúc mới là 453 MB Tổng không gian đĩa cho cả cấu trúc nguồn

và chỉ mục là 816 MB (363 + 453).

GV Phi Loan - Khoa CNTT – HUI

76

Ví dụ tính toán không gian đĩa dùng cho index (Offline Index Operation) • Xác định không gian tạm dùng để sắp

xếp – Khi SORT_IN_TEMPDB được đặt là ON,

tempdb phải có đủ không gian đĩa dành cho chỉ mục lớn nhất (1 million * 200 bytes ~ 200 MB). Fill factor không được xét đến trong lúc sắp xếp. Không gian phụ dành riêng cho tempdb là 2 MB.

Tổng không gian phụ là 202 MB.

GV Phi Loan - Khoa CNTT – HUI

77

Ví dụ tính toán không gian đĩa dùng cho index (Offline Index Operation)

• Xác định không gian tạm dùng để sắp

xếp – Khi SORT_IN_TEMPDB được đặt là OFF

(default), 250 MB không gian đĩa đã được dùng trong bước 2 sẽ được dùng sắp xếp. Không gian phụ dành riêng cho tempdb là 2 MB.

 Tổng không gian phụ là 2 MB.

GV Phi Loan - Khoa CNTT – HUI

78

Ví dụ tính toán không gian đĩa dùng cho index (Offline Index Operation) • Xác định kích cỡ của cấu trúc nguồn – Heap: 1 million * 200 bytes ~ 200 MB – Nonclustered index A: 1 million * 50 bytes /

80% ~ 63 MB

– Nonclustered index B: 1 million * 80 bytes /

80% ~ 100 MB

 Tổng kích cỡ cho cấu trúc hiện có là 363

MB

GV Phi Loan - Khoa CNTT – HUI

79