Khi nào bạn KHÔNG nên sử dụng một chỉ số không gian?


29

Tôi hỏi điều này bởi vì tôi chủ yếu làm việc với Oracle nhưng trong năm qua tôi đã tăng gấp đôi với PostGIS và SQLServer 2008. Hầu hết các chức năng không gian trong Oracle sẽ không hoạt động mà không có chỉ số không gian trả về lỗi ORA-13226:

13226, 00000, "giao diện không được hỗ trợ nếu không có chỉ mục không gian" // * Nguyên nhân: Bảng hình học không có chỉ mục không gian. // * Hành động: Xác minh rằng bảng hình học được tham chiếu trong toán tử không gian có chỉ số không gian trên đó.

Đối với tôi điều này có ý nghĩa. Bạn chạy một truy vấn không gian = bạn phải có một chỉ mục không gian. Nhưng theo tôi hiểu, cả PostGIS và SQL Serve đều không yêu cầu điều này. PostGIS thậm chí dường như có các chức năng (_ * ví dụ _STContains) mà EXPLICITLY sẽ không sử dụng chỉ mục không gian.

Vì vậy, câu hỏi là - có trường hợp nào bạn KHÔNG nên sử dụng chỉ số không gian?. Không nhất thiết là liệu phương pháp 'lấy nó hay bỏ nó' tức là nó sẽ không tạo ra bất kỳ sự khác biệt nào, nhưng khi KHÔNG sử dụng chỉ số không gian sẽ làm giảm hiệu suất? Đối với tôi, câu cuối cùng là một mâu thuẫn trong các điều khoản nhưng nếu không thì tại sao PostGIS sẽ cung cấp các chức năng này?


3
Nếu bạn muốn xem một chỉ mục làm cho mọi thứ chậm hơn trong PostGIS SET enable_seqscan = off. Điều này sẽ buộc PostgreSQL sử dụng các chỉ mục mỗi lần. So sánh tốc độ với nó trên.
Sean

Cảm ơn để bắt đầu chủ đề này. Tôi đã rót thông tin trên mạng, cố gắng tìm hiểu tại sao tổ chức (chính phủ) của tôi không sử dụng các chỉ số không gian (hoặc thậm chí thuộc tính) trên các lớp và bảng tính năng oracle / sde của họ. Bây giờ tôi có một vài đối số để trình bày với họ vì vậy tôi không cần phải nhổ tóc ra, chờ đợi một truy vấn để tự giải quyết.
Mike

Câu trả lời:


12

bản đồ

Nói chung, không có lý do để thực hiện truy vấn không gian mà không có chỉ số không gian trừ khi bạn đang xử lý các bảng thực sự nhỏ. Mặc dù bạn sẽ sử dụng ST_ không sử dụng chỉ mục nhưng có các toán tử hộp ngắn mạch có thể lập chỉ mục &&. các chức năng bắt đầu bằng _ST không được sử dụng bởi người dùng cuối. Lý do họ tồn tại là vì họ phải. Các chỉ mục không gian của PostGIS sử dụng SQL nội tuyến để buộc sử dụng chỉ mục - _ST thường được GEOS thực hiện và && là chỉ mục có thể được sắp xếp lại. Vì vậy, _ST thực sự là một tạo tác triển khai.

do đó, trong ngắn hạn, nó không phải là một chức năng để hoạt động chỉ mục có thể được sắp xếp lại để xảy ra cùng một lúc trước khi kiểm tra không gian dữ dội hơn.


chúc mừng LR1234567. Tôi nghĩ rằng đây là những gì tôi đang tìm kiếm.
mapoholic

25

Nếu tập dữ liệu của bạn được thêm vào và cập nhật thường xuyên, thì các câu lệnh INSERT, DELETE và UPDATE khiến chỉ mục được xây dựng lại có thể làm chậm cơ sở dữ liệu.

Đối với các phần chèn hàng loạt, chẳng hạn như tải toàn bộ tập dữ liệu OSM vào cơ sở dữ liệu, có thể nhanh hơn để thả các chỉ mục và tạo lại chúng sau đó.

Nếu hiệu quả hơn là bỏ qua một chỉ mục (ví dụ: bảng đủ nhỏ để được tải vào bộ nhớ), bộ xử lý truy vấn cơ sở dữ liệu sẽ tự động làm điều này.

Tôi hy vọng lý do chính để cho phép các truy vấn được chạy mà không có chỉ mục không gian là để đo lường lợi ích hiệu suất bạn có được bằng cách sử dụng một chỉ mục mà không phải bỏ nó.

Cuối cùng, nếu bạn muốn hiển thị một hiệu suất tăng lớn cho các truy vấn và hiển thị bản đồ, bạn có thể muốn trì hoãn việc tạo các chỉ mục đến một thời điểm thích hợp trong phát triển hệ thống ...


3
(+1) Tôi có phát hiện một chút hoài nghi trong nhận xét cuối cùng đó không? :-)
whuber

Hoàn toàn không ;-) Nhưng việc bỏ / tạo lại các chỉ số được điều chỉnh cẩn thận là một câu trả lời hữu ích cho "Tại sao X lại dành nhiều thời gian cho các thay đổi cơ sở dữ liệu"?
geographika

Cảm ơn geographica- và tôi đồng ý với nhận xét của người làm trắng! ;-) Tôi hiểu rằng bạn sẽ bỏ / vô hiệu hóa các chỉ mục không gian khi tải số lượng lớn - hoặc tất cả các chỉ số cho vấn đề này, nhưng bạn không thể nghĩ ra lý do tại sao bạn lại thực hiện truy vấn không gian mà KHÔNG sử dụng chỉ mục không gian? Nếu một bảng đủ nhỏ, sử dụng chỉ mục có thể không tạo ra sự khác biệt - đủ công bằng - nhưng chọn không sử dụng chỉ mục?. Không biết, tôi đoán tôi chỉ bối rối hơn với sự tồn tại của các chức năng không chỉ mục không gian của PostGIS ...
mapoholic

2
Nếu một bảng đủ nhỏ và vừa với bộ nhớ, sử dụng một chỉ mục đòi hỏi truy cập đĩa ngẫu nhiên sẽ tốn kém hơn so với thực hiện quét tuần tự. wiki.postgresql.org/wiki/
Sean

2
@mapoholic - _ST_Contains có thể còn sót lại từ khi bạn phải thực hiện thủ công dữ liệu của mình, đánh giá từ old.nabble.com/ Lỗi
geographika

10

Tôi nghĩ điều này được ngụ ý, nhưng tôi sẽ KHÔNG sử dụng chỉ mục không gian cho truy vấn khi tôi có một chỉ mục không gian mà tôi có thể sử dụng thay thế. Ví dụ: tôi có 2.113.450 điểm trải dài Hoa Kỳ được nạp vào một bảng. Nếu tôi muốn lấy tất cả các điểm nằm trong tiểu bang Alaska, tôi có thể thực hiện truy vấn không gian sử dụng chỉ số GIST trên hình học điểm để so sánh với hình học của tiểu bang Alaska, HOẶC, tôi chỉ có thể sử dụng trường "state_alpha" trong dữ liệu điểm (cũng được lập chỉ mục) để trả về tất cả các điểm có "state_alpha" = 'AK'.

"Phần không gian của cái này ở đâu", bạn hỏi? Chà, nếu tôi cần thực hiện một số phân tích không gian hơn nữa về Alaska_point sau khi tôi thu thập chúng, thì việc thu thập những hình học điểm đó bằng cách sử dụng truy vấn không gian trước sẽ nhanh hơn. Điều đó cũng có nghĩa là đối với các tập dữ liệu thực sự lớn, bạn được hưởng lợi từ việc thêm trường tra cứu (hoặc bảng). Một lần nữa, tôi biết điều này có lẽ rõ ràng với mọi người, tôi chỉ đề cập đến nó bởi vì tôi đã gặp nó trong quá khứ với các bộ dữ liệu toàn cầu chỉ được lập chỉ mục không gian và trong đó một truy vấn chung là "tất cả các tính năng trong một quốc gia". Chúng tôi đã đạt được rất nhiều hiệu suất bằng cách thêm trường country_fips được lập chỉ mục.

Dưới đây là một số kết quả từ GIẢI THÍCH ANALYZE chứng minh quan điểm. (LƯU Ý: Tôi đã cố gắng làm cho truy vấn không gian hiệu quả nhất có thể bằng cách sử dụng truy vấn BBOX. Sử dụng các phác thảo trạng thái sẽ chỉ làm cho nó chậm hơn.)

# explain analyze select count(*) from gnis_names where state_alpha = 'AK';
Aggregate  (cost=57359.45..57359.46 rows=1 width=0) (actual time=76.606.. 76.607 rows=1 loops=1)
<snip>
Total runtime: 76.676 ms

# explain analyze select count(*) from gnis_names where the_geom && GeomFromText('POLYGON((-179.14734 51.219862,-179.14734 71.3525606439998,179.77847 71.3525606439998,179.77847 51.219862,-179.14734 51.219862))',4326);
Aggregate  (cost=27699.86..27699.87 rows=1 width=0) (actual time=86.523..86.524 rows=1 loops=1)
<snip>
Total runtime: 86.584 ms 

Cảm ơn rất nhiều vì điều đó. Nó có vẻ rõ ràng khi bạn nói nó, nhưng suy nghĩ đầu tiên của tôi sẽ là chạy một truy vấn không gian không chỉ là một thuộc tính. +1 cho điều này!
mapoholic

0

Chỉ cần chú ý tuyên bố này

Đối với tôi điều này có ý nghĩa. Bạn chạy truy vấn không gian = bạn phải có chỉ mục không gian

Đối với tôi điều này hoàn toàn không có ý nghĩa và tôi nghĩ cả SQL Server và Postgis đều làm tốt hơn hoặc ít nhất là không làm phiền bạn với các chi tiết hiệu suất. Trên thực tế, cả SQL Server và Postgis đôi khi thậm chí không sử dụng chỉ mục không gian (hoàn nguyên để quét toàn bộ bảng).

Đối với Oracle, bạn phải tạo chỉ mục và do đó bạn phải điền user_sdo_geom_metadata.

Chỉ cần so sánh điều này với các chỉ mục chữ và số, chúng ở đó vì lý do hiệu năng, câu lệnh SQL của bạn sẽ hoạt động cùng và không có nó.

Trong cơ sở dữ liệu của Oracle, bỏ chỉ mục và bạn sẽ nhận được vô số lỗi và ứng dụng không thể sử dụng truy vấn không gian, do đó không hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.