Index trong SQL Server

Một phần của tài liệu Các cấu trúc dữ liệu và giải thuật hiệu quả cho bài toán tìm kiếm (Trang 71)

3.2.1 Giới thiệu

Index trong SQL Server([5]) là một trong những yếu tố quan trọng nhất góp phần vào việc nâng cao hiệu suất của cơ sở dữ liệu, nó tăng tốc độ của quá trình truy vấn dữ liệu bằng cách cung cấp phƣơng pháp truy xuất nhanh chóng tới các dòng trong bảng, tƣơng tự nhƣ cách mà mục lục của một cuốn sách sẽ giúp bạn nhanh chóng tìm đến một trang bất kỳ mà bạn muốn trong cuốn sách đó. Index trong SQL Server và giải thích cách chúng đƣợc định nghĩa một cơ sở dữ liệu cũng nhƣ làm thế nào mà Index có thể làm cho quá trình truy vấn dữ liệu của chúng ta nhanh hơn đƣợc áp dụng cho SQL Server 2005 và SQL Server 2008 và mới nhất là SQL Server 2012. Index trong SQL Server đƣợc tạo ra trên các cột trong bảng hoặc View. Nó cung cấp một phƣơng pháp giúp cho chúng ta nhanh chóng tìm kiếm dữ liệu dựa trên các giá trị trong các cột.

Khi chúng ta tạo ra một Index trên một khóa chính và sau đó tìm kiếm một dòng dữ liệu trên một trong các giá trị của cột này SQL Server sẽ thực hiện quá trình tìm kiếm nhƣ sau: đầu tiên SQL Server sẽ tìm giá trị này trong Index, sau đó

64

nó sử dụng Index để nhanh chóng xác định vị trí của dòng dữ liệu mà chúng ta cần tìm. Nếu không có Index, SQL Server sẽ thực hiện động tác quét qua toàn bộ bảng (table scan) để xác định dòng vị trí cần tìm, mà table scan là một trong những động tác có hại nhất cho hiệu suất của SQL Server. Index trong SQL Server có thể tạo trên hầu hết các cột trong bảng hoặc View. Ngoại trừ các cột dùng để lƣu trữ các đối tƣợng dữ liệu lớn nhƣ kiểu image, text, varchar (max)… Chúng ta cũng có thể tạo Index trên các cột kiểu XML nhƣng Index trên XML hơi khác so với Index cơ bản nói chung và cũng ít đƣợc dùng. Ngoài các chức năng trên Index trong SQL Server cũng đƣợc tạo thành từ một tập hợp các page (các Index Node) và chúng đƣợc tổ chức một trong cấu trúc có tên gọi là B-treẹ Cấu trúc này là cấu trúc kiểu thứ bậc trong tự nhiên, với các nút gốc ở trên cùng của hệ thống phân cấp và các nút lá ở phía dƣới, nhƣ thể hiện trong Hình 3.1

Index Nodes

Index trong SQL Server

Hình 3.1 Cấu trúc kiểu thứ bậc. Gốc Cấp trung gian Cấp lá 1-200 1-100 101-200 1-50 51-100 101-150 151-200 1-25 26-50 51-75 76-100 101-125 126-150 151-175 176-200

65

Khi một truy vấn đƣợc xây dựng dựa trên các cột đƣợc tạo Index, cỗ máy thực thi truy vấn sẽ bắt đầu tại nút gốc và đều hƣớng qua nút gốc trung gian cho đến khi cỗ máy truy vấn tìm đƣợc đến nút lá.

Ví dụ, ta cần tìm kiếm giá trị 123 trong một cột đƣợc tạo index, giả sử nhƣ cột ID chẳng hạn. Đầu tiên cỗ máy truy vấn sẽ tìm ở nút gốc (Root Level) để xác định page nào sẽ đƣợc tham gia tới level trung gian (Intemediate Level). Ở bài toán này trang đầu tiên chỉ các giá trị từ 1 – 100 và trang thứ hai là các giá trị 101 – 200. Vì vậy cỗ máy truy vấn sẽ đi đến trang thứ hai ở level trung gian. Cỗ máy truy vấn sau đó sẽ xác định trang tiếp theo mà nó phải tham chiếu tới ở level trung gian kế tiếp. Cuối cùng cỗ máy truy vấn sẽ tìm đến nút lá cho giá trị 123. Nút lá sẽ chứa toàn bộ dòng dữ liệu hoặc nó chỉ chứa một con trỏ làm tham chiếu đến dòng dữ liệu, tùy thuộc vào việc index trên cột ID này là kiểu Clustered Index hay là Non Clustered Index.

3.2.2 Các kiểu index Clustered Index Clustered Index

- Clustered Index là lƣu trữ sắp xếp dữ liệu vật lý trong table hoặc View dựa trên các giá trị khóa của chúng. Các cột khóa này đƣợc chỉ định trong định nghĩa index. Mỗi table hoặc View chỉ có duy nhất một Clustered Index vì bản thân các dòng dữ liệu đƣợc lƣu trữ và sắp xếp theo thứ tự vật lý dựa trên các cột trong loại index nàỵ

- Khi dữ liệu trong table hoặc view cần đƣợc lƣu trữ và sắp xếp theo một thứ tự nhất định chính là lúc cần dùng đến Clustered Index. Khi một table có một Clustered Index thì khi đó table đƣợc gọi là Clustered Tablẹ Nếu không, các dòng dữ liệu của table đƣợc lƣu trong một cấu trúc không đƣợc sắp xếp gọi là HEAP.

Non-Clustered Index

- Non-Clustered có một cấu trúc tách biệt với data row trong Table hoặc View. Mỗi một index loại này chứa các giá trị của các cột khóa trong khai báo của

66

index và mỗi bản ghi giá trị của key trong index này chứa một con trỏ tới dòng dữ liệu tƣơng ứng của nó trong Tablẹ

- Mỗi con trỏ từ một dòng của Non – Clustered index tới một dòng dữ liệu trong table đƣợc gọi là “row locator”. Cấu trúc của row locator phụ thuộc vào việc các trang dữ liệu đƣợc lƣu trong HEAP hay trong một Clustered Table nhƣ đã diễn giải ở mục Clustered Index ở trên. Đối với HEAP, row locator là một con trỏ tới dòng dữ liệu, với clustered table, row locator chính là khóa index của clustered index.

- Ta có thể thêm vào các cột không phải là khóa vào một index có sẵn với giới hạn là 900 bytes và 16 cột.

Composite Index

Composite Index là kiểu Index có nhiều hơn một cột. Trong SQL Server 2005 và 2008, ta có thể có đồng thời tối đa 16 cột trong một Index, miễn là kích thƣớc của Index không vƣợt quá giới hạn 900 bytẹ

*Unique Index

Unique Index là kiểu Index dùng để đảm bảo tính duy nhất trong các cột đƣợc tạo Index. Nếu Index loại này đƣợc tạo dựa trên nhiều cột, thì tính duy nhất của giá trị đƣợc tính trên tất cả các cột đó, không chỉ riêng rẽ từng cột. Ví dụ, nếu ta đã tạo ra một Index trên các cột FirstName và LastName trong một bảng, thì giá trị của 2 cột này kết hợp với nhau phải là duy nhất, nhƣng riêng rẽ từng cột thì giá trị vẫn có thể trùng nhaụ

Một Unique Index đƣợc tự động tạo ra khi ta định nghĩa một khóa chính (Primary Key) hoặc một ràng buộc duy nhất (Unique Constraint):

- Primary Key: Khi ta định nghĩa một ràng buộc khoá chính trên một hoặc nhiều cột của bảng, SQL Server tự động tạo ra một Unique - Clustered Index nếu chƣa có một Clustered Index nào tồn tại trên bảng hoặc view. Tuy nhiên, chúng ta hoàn toàn có thể khai báo lại hành vi mặc định này của SQL

67

Server bằng cách định nghĩa lại index cho cột hoặc nhóm cột này là Unique - Non Clustered Index.

- Unique: Khi ta định nghĩa một ràng buộc duy nhất, SQL Server tự động tạo ra một index có các đặc tính là Unique và là Non Clustered Index. Chúng ta cũng hoàn toàn có thể tạo ra một Unique và là Clustered Index nếu nhƣ chƣa có một Clustered Index nào đƣợc tạo ra trƣớc đó trên bảng.

Covering index

Covering index là một loại chỉ số bao gồm tất cả các cột cần thiết để xử lý một truy vấn cụ thể. Ví dụ, truy vấn của ta có thể lấy các cột FirstName và LastName từ một bảng, dựa trên một giá trị trong cột ContactID. Từ đó, để tăng tốc độ xử lý câu truy vấn, ta có thể tạo ra một chỉ số bao gồm tất cả ba cột nàỵ

3.2.3.Phƣơng pháp thiết kế index

Chính vì những lợi ích mà Index đem lại, nên chúng phải đƣợc thiết kế cẩn thận. Vì Index có thể chiếm nhiều không gian của ổ cứng, do đó không nên triển khai quá nhiều Index nếu nhƣ chúng không thực sự cần thiết. Ngoài ra, Index sẽ đƣợc tự động cập nhật khi bản thân các dòng dữ liệu đƣợc cập nhật, do đó có thể dẫn đến phát sinh thêm chi phí và ảnh hƣởng đến hiệu suất của quá trình xử lý dữ liệụ Vì vậy, việc thiết kế Index trong SQL Server cần phải có một số cân nhắc trƣớc khi thực hiện chúng.

- Đối với các bảng đƣợc cập dữ liệu nhiều và thƣờng xuyên, sử dụng càng ít cột càng tốt trong một Index và không sử dụng Index tràn lan trên các bảng của dữ liệụ

- Nếu một bảng có khối lƣợng dữ liệu lớn nhƣng tần suất cập nhật dữ liệu thấp thì chúng ta nên sử dụng nhiều Index cần thiết để cải thiện hiệu suất truy vấn. Tuy nhiên, nên sử dụng Index một cách khôn ngoan trên các bảng nhỏ vì cỗ máy truy vấn có thể mất nhiều thời gian và chi phí để tìm kiếm dữ liệu dựa trên các Index hơn là tìm kiếm dữ liệu dựa trên việc thực hiện một thao tác scan tablẹ

68

- Đối với Clustered Index, hãy cố gắng giữ cho độ dài của các cột đƣợc lập Index càng ngắn càng tốt. Lý tƣởng nhất là tạo Clustered Index trên cột có thuộc tính Unique và không cho phép giá trị Null... Đây là lý do tại sao các khóa chính thƣờng đƣợc sử dụng cho Clustered Index của bảng, bên cạnh đó, việc xem xét các truy vấn thƣờng thực hiện trên bảng cũng cần đƣợc tính đến khi xác định các cột nên tham gia vào một Clustered Index.

- Tính duy nhất của các giá trị trong một cột có tác động đến hiệu suất của Index. Nhìn chung, càng nhiều giá trị trùng lặp thì hiệu suất thực thi của Index càng kém. Nói cách khác, tính duy nhất của giá trị trong một cột càng cao thì hiệu suất của Index càng caọ Do đó, nếu xác định các giá trị của một cột nào đó trong một table là duy nhất thì khi đó ta nên tạo một Unique Index trên cột đó.

- Đối với Composite Index, cần phải xem xét thứ tự của các cột trong định nghĩa của Index. Cột nào thƣờng đƣợc sử dụng trong các biểu thức so sánh ở mệnh đề WHERE (nhƣ WHERE FirstName = 'Charlié) sẽ đƣợc liệt kê đầu tiên. Thứ tự của các cột tiếp theo sẽ đƣợc liệt kê dựa trên tính duy nhất của các giá trị trong cột, trong đó tính duy nhất của giá trị trong cột càng cao thì càng đƣợc liệt kê trƣớc.

- Chúng ta cũng có thể tạo Index trên các Computed Column nếu chúng đáp ứng đƣợc các yêu cầu nhất định. Ví dụ, biểu thức đƣợc sử dụng để tạo ra các giá trị trong cột phải đƣợc xác định (có nghĩa là nó luôn luôn trả về kết quả tƣơng tự cho một tập của các giá trị đầu vào).

3.2.4 Truy vấn với cấu trúc index

Một lƣu ý khác khi tạo Index đó là xem xét dữ liệu trong database sẽ đƣợc truy vấn nhƣ thế nàọ Nhƣ đã đề cập ở trên, chúng ta phải tính đến tần suất thay đổi dữ liệụ Ngoài ra, nên xem xét các nguyên tắc sau đây:

- Cố gắng Insert hoặc Update càng nhiều dòng càng tốt trong một câu lệnh duy nhất, thay vì sử dụng nhiều câu truy vấn tách rờị

69

- Tạo Non Clustered Index trên các cột đƣợc sử dụng thƣờng xuyên trong các biểu thức so sánh và các cột tham gia vào điều kiện Join.

- Xem xét tạo Index trên các cột đƣợc sử dụng trong các truy vấn tìm kiếm chính xác.

3.3 Index Lucene

3.3.1 Giới thiệu về Lucene

Lucene([7], [8]) là phần mềm mã nguồn mở, dùng để phân tích, đánh chỉ mục và tìm kiếm thông tin với hiệu suất cao bằng Javạ Lucene đƣợc phát triển đầu tiên bởi DougCutting đƣợc giới thiệu đầu tiên vào tháng 8 năm 2000. Tháng 9 năm 2001 Lucene gia nhập vào tổ chức Apache và hiện tại đƣợc Apache phát triển và quản lý. Cần lƣu ý rằng Lucene không phải là một ứng dụng mà chỉ là một công cụ đặc tả API cần thiết cho việc một search enginẹ Đƣợc xây dựng và thiết kế theo hƣớng hƣớng đối tƣợng nên các API cũng đƣợc cung cấp theo dạng hƣớng đối tƣợng. Mặc dù thiết kế và xây dựng ban đầu từ Java nhƣng hiện nay cũng đã có một số phiên bản cho các ngôn ngữ khác: .NET (Lucenẹnet), C++ (CLucene), Perl (PLucene), PHP (ZendLucene) …. 3.3.2 Kiến trúc Lucene Hình 3.2. Kiến trúc Lucene File Syste FS PDF HTML DOC TXT TXT PDF Parser DOC Docu- -Ments Object Indexer Indexer Searcher

70

Các file đƣợc duyệt qua FS Crawler, những file nào có phần mở rộng (extension) là file văn bản thì nó sẽ đƣợc phân tích và bóc tách nội dung ra thông qua các bộ parser (TXT Parser, Doc Parser, PDF Parser…). Nội dung của các file văn bản này sẽ đƣợc đánh chỉ mục thông qua các Indexer. Khi có yêu cầu từ ngƣời dùng yêu cầu tìm kiếm, Lucene sử dụng các searcher để truy cập vào vùng dữ liệu đã đƣợc đánh chỉ mục để tìm kiếm.

3.3.3 Kiến trúc File Index

Hình 3.3. Kiến trúc file Index

Index Document Document Document Docment Field Field Field Field Field Name Value

71

Trong file index, các văn bản đƣợc lƣu lại thành các khối dữ liệu (Document). Mỗi khối dữ liệu chứa các thông tin của từng văn bản. Các thông tin đƣợc lƣu vào các trƣờng (Field). Mỗi trƣờng đều có hai giá trị là Name và Valuẹ Name lƣu tên của trƣờng, Value chứa nội dung của Field. Ví dụ trong một văn bản (Document) có thể có các Field sau: Path (chứa đƣờng dẫn), Content (chứa nội), CreateDate(chứa ngày tạo file)…

Với mỗi Field, ta có thể chọn giữa đánh chỉ mục hay không đánh chỉ mục. Nếu chọn đánh chỉ mục, ta có thể tìm kiếm trên Field đó. Các Field không đánh chỉ mục thƣờng là các Field không quan trọng trong quá trình tìm kiếm và phục vụ chủ yếu cho nhu cầu trình bày kết quả trả về.

Thao tác đánh chỉ mục khá phức tạp. Trƣớc hết dữ liệu văn bản sẽ đƣợc phân tích thành các từ khóa, đồng thời loại bỏ các từ không dùng đến (stop words, trong tiếng Anh các từ nhƣ a, an, the là các stop words), sau đó các từ khóa sẽ đƣợc dùng để tạo Inverted index (chỉ mục đảo ngƣợc) và lƣu thành mục đảo ngƣợc dùng để chỉ cách lƣu trữ danh sách các tài liệu mà có chứa từ ngƣời ta lƣu trữ danh sách các từ có trong dữ liệu đó. Ví dụ, với từ khóa Index, ta sẽ lƣu trữ danh sách các trang web A, B, C có chứa từ khóa nàỵ Sau này khi ngƣời dùng gõ vào từ khóa Index, danh sách này có thể giúp định vị nhanh chóng các trang web có chứa nó. Nếu dùng chỉ mục thông thƣờng, phải quét qua hết các trang web có trong cơ sở dữ liệu mới tìm rạ Cách này rất tốn thời gian khi số lƣợng dữ liệu lớn.

72

3.3.4 Chỉ mục đảo ngƣợc

Posting Word Doc Offset

1 Football Doc 1 3 Doc 1 67 Doc 2 1 2 Penn Doc 1 1 3 Players Doc 2 2 4 State Doc 1 2 Doc 2 13 Hình 3.4. Chỉ mục đảo ngược

Các từ đƣợc bóc tách ra từ các văn bản sẽ đƣợc lƣu trong Posting Table với quy tắc: Các từ trong bảng là khác nhau, mỗi từ có một ID riêng, các từ đều đƣợc ánh xạ đến văn bản chứa nó thông qua tên ID của văn bản và vị trí (offset) của nó trong văn bản, lƣu lại vị trí của các từ trùng nhau trong một văn bản.

Doc 1: Penn State Football… football Doc 2: Football players … State Posting Table

73

CHƢƠNG 4. TÌM KIẾM XÂU MẪU

4.1 Bài toán đối sánh mẫu trong vấn đề tìm kiếm

4.1.1. Giới thiệu tổng quan về bài toán đối sánh mẫu trong vấn đề tìm kiếm

So mẫu, hay đối sánh mẫu (pattern matching) ([1], [3]) là một bài toán quan trọng trong vấn đề tìm kiếm thông tin đƣợc ứng dụng trong nhiều lĩnh vực khoa học và xử lý thông tin, nhƣ: công cụ tìm kiếm của các hệ điều hành; tìm kiếm mẫu lặp trong nén dữ liệu; tìm kiếm thông tin trong thứ việc điện tử, bách khoa toàn thƣ điện tử; khai phá web trên Internet; tìm kiếm tƣơng tự trong CSDL gen; tìm kiếm tự động các luật trong CSDL; nhận dạng tiếng nói trong các hệ thống điều khiển bằng tiếng nói; nhận dạng ảnh trong viễn thám, khoa học hình sự; … Nói chung, mẫu có thể ở bất kỳ kiểu dữ liệu nào, từ văn bản đến các loại dữ liệu đa phƣơng tiện (ảnh, video, âm thanh, …). Mặc dù dữ liệu đƣợc ghi dƣới nhiều dạng, song văn bản (text) vẫn là dạng phổ biến nhất, vì vậy vấn đề so xâu mẫu (string pattern matching) thực

Một phần của tài liệu Các cấu trúc dữ liệu và giải thuật hiệu quả cho bài toán tìm kiếm (Trang 71)

Tải bản đầy đủ (PDF)

(110 trang)