2010-11-19 28 views
5
  • Tôi có một bảng rất lớn.
  • Tôi có chỉ mục trên cột col1.
  • Tôi muốn lấy dữ liệu do col1 yêu cầu.
  • Từ gói truy vấn tôi có thể nói nó không sử dụng chỉ mục.
  • Khi tôi thêm "LIMIT", nó bắt đầu sử dụng chỉ mục
  • Đối với giá trị lớn cho "LIMIT", nó ngừng sử dụng chỉ mục.

Bất kỳ đầu mối nào?Postgres không sử dụng chỉ mục có "ORDER BY"

P.S. Tôi muốn lấy dữ liệu được nhóm lại theo giá trị của col1 (không nhất thiết phải sắp xếp), bất kỳ đề xuất nào khác ngoài "ORDER BY".

THANKS !!

+2

Kết quả từ EXPLAIN ANALYZE ở đâu? Nếu không có nó, không ai có một đầu mối tại sao mọi thứ không hoạt động như bạn nghĩ. –

Trả lời

5

Nếu bạn trả lại tất cả các hàng từ bảng, việc quét chỉ mục sẽ chậm hơn so với quét bảng. Tại sao bạn nghĩ rằng bạn cần sử dụng chỉ mục?

Bạn có thể thử sử dụng

set enable_seqscan = false

để vô hiệu hóa quá trình quét tuần tự, nhưng tôi chắc chắn rằng sẽ chậm hơn so với quá trình quét tuần tự.

ORDER BY là phương thức chỉ để sắp xếp dữ liệu của bạn. Bất kỳ sắp xếp bạn có thể thấy khác là trùng hợp ngẫu nhiên thuần túy

Sửa
Để xóa mọi thứ lên: Tôi làm không khuyên để biến seq quét tắt. Tôi vừa đăng bài này như một cách để cho thấy rằng quét seq thực sự nhanh hơn so với quét chỉ mục. Sau khi tắt kế hoạch thực hiện bằng cách sử dụng quét chỉ mục có lẽ sẽ chậm hơn so với quét seq cho thấy OP rằng không cần quét chỉ mục.

+0

Giả sử đây là một bảng giá trị quan trọng. Tôi muốn trả về tất cả các hàng nhưng các bản ghi có cùng khóa phải được liên tiếp trong tập kết quả, nhưng việc sắp xếp không thực sự quan trọng. –

+3

Sau đó, thêm mệnh đề "ORDER BY the_key_column". Đó là cách * duy nhất * đáng tin cậy để sắp xếp dữ liệu của bạn –

+0

Ý tưởng rất tồi để tắt enable_seqscan, nó không giải quyết được vấn đề thực sự. –

4

Ngoài các câu trả lời của a_horse_with_no_name:

Sử dụng một chỉ số thực sự là hai hoạt động riêng biệt: Đầu tiên là giá trị mà bạn mong muốn được nhìn cho trong chỉ mục. Trong chỉ mục là địa chỉ của hồ sơ hoàn chỉnh mà sau đó bị hủy đăng ký. Cả hai thao tác đều rất nhanh đối với các truy vấn cụ thể.

Nếu bạn định sử dụng tất cả hoặc hầu hết các bản ghi, lợi ích sẽ biến mất. Nếu bạn muốn tất cả các bản ghi và bạn đi qua chỉ mục, nó mất nhiều thời gian hơn vì mỗi bản ghi có hai tìm kiếm. Nó dễ dàng hơn để chỉ chạy trên toàn bộ bảng mà không có chỉ mục vì điều này có một tìm kiếm cho mỗi cột (có, tôi biết, thực sự nó ít hơn vì toàn bộ khối được đọc vv ... Tôi chỉ muốn giữ nó đơn giản).

+0

Nhưng sử dụng chỉ mục tiết kiệm thời gian sắp xếp, tôi giả sử. –

+0

Không và giải thích toàn bộ điều này là về lý do tại sao không. –

+3

Cũng đọc phần ["Chỉ mục và ORDER BY"] (http://www.postgresql.org/docs/current/static/indexes-ordering.html) của hướng dẫn để có giải thích tương tự. –

Các vấn đề liên quan