2010-03-17 15 views
6

Tôi có một bảng lớn (> hàng 50m) trong đó có một số dữ liệu với một ID và dấu thời gian:Đẩy nhanh PostgreSQL truy vấn, nơi dữ liệu là giữa hai ngày

id, timestamp, data1, ..., dataN 

... với nhiều cột chỉ mục trên (id, timestamp).

tôi cần phải truy vấn bảng để chọn tất cả các hàng với một ID nhất định mà thời gian có được giữa hai ngày, mà tôi hiện đang làm sử dụng:

SELECT * FROM mytable WHERE id = x AND timestamp BETWEEN y AND z 

này hiện mất hơn 2 phút về một kết thúc cao máy (2x 3Ghz Xeon lõi kép với HT/RAM, RAM 16GB, ổ đĩa 2x 1TB trong RAID 0) và tôi thực sự muốn tăng tốc.

Tôi đã tìm thấy this tip đề xuất sử dụng chỉ mục không gian, nhưng ví dụ mà nó đưa ra là dành cho địa chỉ IP. Tuy nhiên, tốc độ tăng (436s đến 3s) là ấn tượng.

Tôi làm cách nào để sử dụng tính năng này với dấu thời gian?

+0

* Xác định máy cao cấp? Thực sự ... 50 triệu hàng giờ là một bảng lớn theo tiêu chuẩn ngày nay. * Vì vậy, bảng có ID - dấu thời gian ở đâu? * Chỉ số nào? Thiếu chỉ mục cộng với phần cứng crappy (đĩa cao cấp + bình thường) có thể dẫn đến kết quả đó. – TomTom

+0

Dual 3GHz Xeon Dual-core với HT, RAM 16 GB vv Bảng có (id, dấu thời gian, dữ liệu) với chỉ mục nhiều cột trên (id, dấu thời gian). – Roger

+1

KHÔNG cao cấp bởi bất kỳ phương tiện .... espeically như bạn không nói bất cứ điều gì về các đĩa ....., đó là một phần quan trọng cho bất kỳ máy chủ cơ sở dữ liệu. MUCH mor ethan CPU, hoặc RAM. Bố cục đĩa của bạn là gì? – TomTom

Trả lời

0

Hãy chắc chắn rằng chỉ số này TableID + TableTimestamp, và bạn làm một truy vấn như:

SELECT 
    .... 
    FROM YourTable 
    WHERE TableID=..YourID.. 
     AND TableTimestamp>=..startrange.. 
     AND TableTimestamp<=..endrange.. 

nếu bạn áp dụng các chức năng để cột TableTimestamp của bảng trong WHERE, bạn sẽ không thể sử dụng hoàn toàn các chỉ số .

nếu bạn đã thực hiện tất cả điều này, thì phần cứng của bạn có thể không hoạt động.

nếu bạn đang sử dụng phiên bản 8.2 hoặc mới hơn, bạn nên thử:

WHERE (TableID, TableTimestamp) >= (..YourID.., ..startrange..) 
    and (TableID, TableTimestamp) <= (..YourID.., ..endrange..) 
6

tip Đó là chỉ thích hợp khi bạn có hai cột A và B và sử dụng các truy vấn như:

where 'a' between A and B 

Đó là không:

where A between 'a' and 'b' 

Sử dụng chỉ mục trên date(column) thay vì column có thể tăng tốc nó lên một chút.

+0

Mẹo có đề cập rằng nó phù hợp với thời gian, "Khoảng thời gian nhanh (thời gian hoặc địa chỉ ip) tìm kiếm với các chỉ mục không gian"? Cảm ơn gợi ý khác. – Roger

+0

Nó phù hợp với thời gian. Nhưng nó chỉ phù hợp nếu bảng của bạn có khoảng thời gian (tức là hai cột) và bạn tìm một giá trị ở đó. Không phải khi bạn so sánh một cột với một khoảng thời gian. –

+0

Ahhh, tôi hiểu rồi. Xin lỗi, tôi đã hiểu nhầm đơn đăng ký. – Roger

1

Bạn có thể EXPLAIN truy vấn cho chúng tôi không? Sau đó, chúng tôi biết cơ sở dữ liệu thực thi truy vấn của bạn như thế nào. Và cấu hình thì sao? Cài đặt cho shared_buffers và work_mem là gì? Và khi nào bạn (hoặc hệ thống của bạn) chân không cuối cùng và phân tích? Và điều cuối cùng, bạn đang sử dụng hệ điều hành và phiên bản pgSQL nào?

Bạn có thể tạo các chỉ mục tuyệt vời nhưng không có cài đặt thích hợp, cơ sở dữ liệu không thể sử dụng chúng rất hiệu quả.