Dưới đây truy vấn mất khoảng 15 giây để trả về dữ liệu mặc dù có chỉ mục và id
làm khóa chính.Thứ tự theo truy vấn trên cột dấu thời gian là rất chậm
select id from my_table order by insert_date offset 0 limit 1
Các giải thích phân tích như sau
"Limit (cost=1766417.72..1766417.72 rows=1 width=12) (actual time=32479.440..32479.441 rows=1 loops=1)"
" -> Sort (cost=1766417.72..1797117.34 rows=12279848 width=12) (actual time=32479.437..32479.437 rows=1 loops=1)"
" Sort Key: insert_date"
" Sort Method: top-N heapsort Memory: 25kB"
" -> Seq Scan on my_table (cost=0.00..1705018.48 rows=12279848 width=12) (actual time=0.006..21338.401 rows=12108916 loops=1)"
"Total runtime: 32479.476 ms"
bảng của tôi có vài cột khác. Nhưng kiểu cho insert_date
là
insert_date timestamp without time zone NOT NULL DEFAULT now(),
Tôi có một chỉ mục trên cột ngày cụ thể đó là
CREATE INDEX my_table_insert_date_indx
ON my_table
USING btree
(insert_date)
TABLESPACE somexyz_idx_ts;
ít giá trị từ postgresql.conf
file:
shared_buffers = more than 1GB ## just for an example
temp_buffers = more than 1GB
work_mem = more than 1GB
maintenance_work_mem = more than 1GB
dynamic_shared_memory_type = posix
default_statistics_target = 10000
autovacuum = on
random_page_cost = 2.0
cpu_index_tuple_cost = 0.0005
Tôi đang sử dụng postgres 9,3 ngay bây giờ.
CẬP NHẬT ::
Tôi chỉ cần chạy các truy vấn dưới đây một thời gian trước:
select insert_date, count(*) from my_table group by insert_date
và đầu vài từ kết quả là:
"2015-04-02 00:00:00";3718104
"2015-04-03 00:00:00";6410253
"2015-04-04 00:00:00";538247
"2015-04-05 00:00:00";1228877
"2015-04-06 00:00:00";131248
Tôi có khoảng 12 triệu bản ghi trên bảng đó. Và số lượng trên gần như gần với tổng số đó.
Không chắc chắn, nhưng nó có thể là một vấn đề mà chỉ mục đã được tạo ra trên một cột mà có tấn giá trị trùng lặp? Nếu nó là sự thật, thì chúng ta có cách nào không?
Có lẽ một nơi tốt hơn để đặt câu hỏi: [dba.stackexchange.com] (http://dba.stackexchange.com) –
Có một câu hỏi tương tự gần đây trên SO, và tôi nghĩ rằng kết luận có thể là do 9.4 tốt hơn khi đặt hàng bằng cột được lập chỉ mục để tránh sắp xếp. Có thể muốn tìm kiếm câu hỏi đó. –
Vui lòng kiểm tra cùng một truy vấn với 'set enable_seqscan = off;' và hiển thị kết quả phân tích giải nghĩa. Chỉ số và bảng của bạn lớn đến mức nào? '\ di + my_table_insert_date_indx',' \ dt + my_table' lệnh trong psql sẽ hiển thị kích cỡ – alexius