2012-01-02 8 views
6

Sự khác biệt giữa quét bảng và quét chỉ mục trong SQL và nơi nó được sử dụng cụ thể là gì?Quét bảng và quét chỉ mục trong SQL

+0

có thể trùng lặp của [Sự khác biệt giữa Quét bảng và quét chỉ mục nhóm là gì?] (Http://stackoverflow.com/questions/18764/whats-the-difference-between-a-table-scan-and- a-clustered-index-scan) – gbn

+1

Một lần quét các hàng trong bảng, các hàng chỉ mục khác. Bạn đang sử dụng RDBMS nào? –

Trả lời

11

Quét bảng nghĩa là lặp qua tất cả các hàng trong bảng.

Quét chỉ mục có nghĩa là lặp qua tất cả các mục chỉ mục, khi chỉ mục mục đáp ứng điều kiện tìm kiếm, hàng trong bảng được thử lại thông qua chỉ mục.

Quét chỉ mục thường dùng ít tốn kém hơn so với quét bảng vì chỉ mục phẳng hơn một bảng.

Chúng có rất nhiều thư mục về vấn đề này. Mẫu:

truy cập Index là một phương pháp truy cập trong đó SQL Server sử dụng một chỉ số hiện có để đọc và viết các trang dữ liệu. Vì việc truy cập chỉ mục đáng kể làm giảm số lượng hoạt động đọc I/O, nó thường hoạt động tốt hơn quét bảng .

Trong phương pháp này, một hàng được lấy bằng cách đi qua các chỉ số, bằng cách sử dụng giá trị cột được lập chỉ mục theo quy định của báo cáo kết quả. Quét chỉ mục truy xuất dữ liệu từ chỉ mục dựa trên giá trị của một hoặc nhiều cột trong chỉ mục. Để thực hiện quét chỉ mục, Oracle tìm kiếm chỉ mục cho các giá trị cột được lập chỉ mục được truy cập bởi câu lệnh. Nếu câu lệnh chỉ truy cập các cột của chỉ mục, thì Oracle sẽ đọc các giá trị cột được lập chỉ mục trực tiếp từ chỉ mục, thay vì từ bảng.

10

Hầu hết các động cơ truy vấn có một truy vấn tối ưu, mà cố gắng để tạo ra một chiến lược thực hiện truy vấn hiệu quả. Nếu các chỉ mục có sẵn, có thể làm cho truy vấn nhanh hơn, thì trình tối ưu hóa truy vấn sẽ thực hiện quét chỉ mục hoặc tìm kiếm chỉ mục, nếu không thì sẽ quét bảng.

Ví dụ:

SELECT * FROM tbl WHERE category_id = 5; 

Nếu không có chỉ mục trên category_id sau đó một bảng quét sẽ được thực hiện, ví dụ: mỗi hồ sơ duy nhất trong bảng sẽ được kiểm tra cho category_id đúng.

Nếu, tuy nhiên, category_id được lập chỉ mục những thứ trở nên phức tạp hơn. Nếu bảng là rất lớn, một tìm kiếm chỉ mục có thể sẽ được chọn. Tuy nhiên, nếu bảng nhỏ, thì trình tối ưu hóa có thể quyết định rằng quét bảng vẫn còn nhanh hơn, vì một số chi phí cần thiết để truy cập chỉ mục. Nếu category_id không đủ chọn lọc, ví dụ: nếu chỉ có hai danh mục, việc quét bảng có thể nhanh hơn ngay cả đối với các bảng lớn.

Chỉ mục thường được tổ chức dưới dạng cấu trúc cây. Tìm một mục trong cây là thao tác O (log n).Quét bảng là một hoạt động O (n). Tốc độ chủ yếu được xác định bởi số lượng truy cập đĩa cần thiết để thực hiện truy vấn. Tìm kiếm chỉ mục đầu tiên và sau đó truy cập vào bảng cho các mục tìm thấy có thể tạo ra nhiều truy cập đĩa hơn cho các bảng nhỏ.

Chúng ta hãy có một cái nhìn tại truy vấn khác:

SELECT category_id FROM tbl WHERE category_id BETWEEN 10 AND 100; 

Ở đây còn có một tùy chọn có sẵn. Tìm kiếm chỉ mục có thể không nhanh hơn so với quét bảng trong tình huống này, nhưng vì chúng tôi chỉ truy xuất tính năng quét chỉ mục của catergory_id (không tìm kiếm chỉ mục) có thể còn nhanh hơn nữa. Quét chỉ mục đọc mọi mục nhập của bảng chỉ mục thay vì tận dụng cấu trúc cây (những gì mà chỉ mục tìm kiếm). Tuy nhiên, vì thông tin được yêu cầu được chứa đầy đủ trong chỉ mục, không cần truy cập vào bảng dữ liệu. Quét chỉ mục, giống như bảng quét hoạt động O (n), nhưng vì chỉ mục thường nhỏ hơn bảng, nên cần ít truy cập đĩa hơn để quét chỉ mục hơn là quét bảng.

Toàn bộ vấn đề rất phức tạp và phụ thuộc rất nhiều vào cơ sở dữ liệu. Nếu bạn muốn biết thêm, hãy đọc tài liệu được cung cấp bởi nhà cung cấp db.

+1

Nó sẽ sử dụng một tìm kiếm chỉ mục (có thể phạm vi tìm kiếm) không phải là một quét chỉ mục trong ví dụ của bạn. Tôi sẽ mong đợi một chỉ số quét nếu chỉ mục được bao gồm nhưng không phải trên một cột hàng đầu hữu ích hoặc vị ngữ đã được chọn lọc và chỉ số hẹp hơn so với bảng. –

+1

OK, tôi đã sửa câu trả lời của mình, để tính đến sự khác biệt giữa quét chỉ mục và tìm kiếm chỉ mục. –

2

Khi @danihp đã trả lời phần đầu tiên của câu hỏi, tôi sẽ cố gắng trả lời câu hỏi thứ hai "ở đâu được sử dụng cụ thể". Điều này là dành cho Oracle nhưng nó đúng với hầu hết các RDBMS.

Giả sử chúng ta có một bảng my_table, được lập chỉ mục duy nhất trên một cột id và có một chỉ số thứ hai, đó là không duy nhất, trên cột yet_another_column:

create my_table (id varchar2(20) not null 
       , another_column not null 
       , yet_another_column 
       , constraint pk_my_table primary key (id) 
       ); 

create index i_my_table on my_table (yet_another_column); 

Bây giờ, nếu chúng ta select * from my_table where id = '1' điều này sẽ/nên thực hiện quét chỉ mục duy nhất của chỉ mục pk_my_table. Sau đó, chúng tôi nhập lại bảng, sử dụng chỉ mục, để trả lại mọi thứ trong my_table trong đó id = '1'.

Nếu truy vấn, thay vào đó, thay vào đó, select id from my_table where id = 'a' thì không cần giai đoạn thứ hai vì tất cả các giá trị chúng tôi cần đều được chứa trong chỉ mục. Trong trường hợp này, truy vấn sẽ chỉ thực hiện quét chỉ mục duy nhất .

Tiếp theo, nếu truy vấn của chúng tôi là select * from my_table where yet_another_column = 'y' thì chúng tôi có chỉ mục trên cột nhưng nó không phải là duy nhất vì vậy chúng tôi sẽ phải xem xét toàn bộ chỉ mục để tìm tất cả các giá trị khớp với điều kiện của chúng tôi , tức là quét chỉ mục . Một lần nữa, chúng tôi chọn các cột không có trong chỉ mục của chúng tôi để chúng tôi phải nhập lại bảng để nhận chúng.

Cuối cùng, nếu truy vấn của chúng tôi là select id from my_table where another_column = 'yes'. Chúng tôi không có chỉ mục trên another_column vì vậy chúng tôi phải thực hiện quét bảng để tìm giá trị, nghĩa là chúng tôi phải tìm mọi thứ trong bảng where another_column = 'yes'.

Hiện tại, có thể dường như không có nhiều khác biệt, giữa quét bảng và quét chỉ mục trong những trường hợp này. Chúng ta vẫn phải đi tìm một giá trị trong một đối tượng trong cơ sở dữ liệu. Tuy nhiên, khi chỉ mục nhỏ hơn nhiều và được thiết kế đặc biệt để quét (xem các câu trả lời khác), hãy xem thường là nhanh hơn để quét chỉ mục nếu bạn chỉ muốn một tỷ lệ nhỏ các hàng trong bảng. Nếu bạn muốn nói 10% của bảng thì điểm này trở thành "nó phụ thuộc".

+0

Oracle không phân biệt giữa tìm kiếm và quét? –

+1

@MartinSmith, tôi chưa bao giờ nghe/nhìn thấy chúng được mô tả là "tìm kiếm" nhưng tôi thấy quan điểm của bạn. Tôi đã chỉnh sửa câu trả lời của mình để bao gồm một ví dụ không phải là PK. Tôi đoán chỉ số duy nhất sẽ là 'tìm kiếm' và không phải là 'quét' duy nhất. – Ben

2

Đối với SQL Server ít nhất:

Một chỉ số quét có thể nhanh hơn bởi vì, có lẽ, chỉ số không bao gồm toàn bộ các cột trong bảng, trong khi một bảng (hoặc clustered index) quét phải đọc tất cả dữ liệu. Nếu một chỉ mục không bao gồm tất cả các cột trong bảng, thì nó sẽ tương đương với việc quét bảng, và sự lựa chọn giữa quét chỉ mục và quét bảng (hoặc CIX) sẽ là một đồng xu quăng. Sự khác biệt là khi bạn có ít cột hơn trong chỉ mục, bạn có thể phù hợp với nhiều hàng chỉ mục hơn trên trang 8kb, dẫn đến ít trang tổng thể hơn bạn phải đọc để quét tất cả dữ liệu trong chỉ mục.

Để minh họa ý của tôi, hãy tưởng tượng xem bạn có hai bản sao của danh bạ hay không, một tên có họ, tên, địa chỉ đường phố và số điện thoại, cùng với họ, tên và số điện thoại. Bây giờ hãy tưởng tượng rằng vì địa chỉ đường phố không phải được in, bạn có thể vừa với hai cột tên và số điện thoại bổ sung trên bất kỳ trang nào trong danh bạ điện thoại. Kết quả cuối cùng của việc này là danh bạ điện thoại mỏng hơn, vì bạn có thể vừa với số điện thoại giống nhau trên ít trang hơn. Tiếp theo, hãy tưởng tượng bạn bị tính phí bằng cách đếm số lượng số điện thoại trong sách. Bạn sẽ chọn địa chỉ nào có địa chỉ đường phố được liệt kê (có nhiều trang hơn, tương tự như quét bảng) hoặc địa chỉ không có địa chỉ đường phố (trang có ít trang hơn, tương tự như hầu hết các lần quét chỉ mục)? Tôi sẽ chọn một trang có ít trang hơn. Một nếp nhăn khác ở đây là một số chỉ mục có thể được lọc, có nghĩa là chúng không chỉ có ít cột hơn trong hầu hết các trường hợp (và do đó có thể phù hợp với nhiều hàng hơn trên một trang), nhưng chúng cũng có thể có mệnh đề WHERE loại bỏ rất nhiều hàng. Trong trường hợp này, cũng như, quét chỉ mục sẽ tốt hơn quét bảng (nhưng điều này sẽ chỉ hoạt động cho các truy vấn có mệnh đề WHERE phù hợp và cùng ngữ nghĩa).