Truy vấn sau đây đối với người nước ngoài mất khoảng 5 giây để thực hiện trên 3,2 triệu hàng:
SELECT x."IncidentTypeCode", COUNT(x."IncidentTypeCode")
FROM "IntterraNearRealTimeUnitReflexes300sForeign" x
WHERE x."IncidentDateTime" >= '05/01/2016'
GROUP BY x."IncidentTypeCode"
ORDER BY 1;
Khi tôi thực hiện cùng một truy vấn trên bảng bình thường, nó sẽ trả về .6 giây. Các kế hoạch thực hiện khá khác nhau:
Bảng bình thường
Sort (cost=226861.20..226861.21 rows=4 width=4) (actual time=646.447..646.448 rows=7 loops=1)
Sort Key: "IncidentTypeCode"
Sort Method: quicksort Memory: 25kB
-> HashAggregate (cost=226861.12..226861.16 rows=4 width=4) (actual time=646.433..646.434 rows=7 loops=1)
Group Key: "IncidentTypeCode"
-> Bitmap Heap Scan on "IntterraNearRealTimeUnitReflexes300s" x (cost=10597.63..223318.41 rows=708542 width=4) (actual time=74.593..342.110 rows=709376 loops=1)
Recheck Cond: ("IncidentDateTime" >= '2016-05-01 00:00:00'::timestamp without time zone)
Rows Removed by Index Recheck: 12259
Heap Blocks: exact=27052 lossy=26888
-> Bitmap Index Scan on idx_incident_date_time_300 (cost=0.00..10420.49 rows=708542 width=0) (actual time=69.722..69.722 rows=709376 loops=1)
Index Cond: ("IncidentDateTime" >= '2016-05-01 00:00:00'::timestamp without time zone)
Planning time: 0.165 ms
Execution time: 646.512 ms
Bảng ngoại
Sort (cost=241132.04..241132.05 rows=4 width=4) (actual time=4782.110..4782.112 rows=7 loops=1)
Sort Key: "IncidentTypeCode"
Sort Method: quicksort Memory: 25kB
-> HashAggregate (cost=241131.96..241132.00 rows=4 width=4) (actual time=4782.097..4782.100 rows=7 loops=1)
Group Key: "IncidentTypeCode"
-> Foreign Scan on "IntterraNearRealTimeUnitReflexes300sForeign" x (cost=10697.63..237589.25 rows=708542 width=4) (actual time=1.916..4476.946 rows=709376 loops=1)
Planning time: 1.413 ms
Execution time: 4782.660 ms
Tôi nghĩ rằng tôi đang trả giá cao cho GROUP BY
điều khoản, điều này không được chuyển đến máy chủ nước ngoài khi tôi EXPLAIN VERBOSE
:
SELECT
"IncidentTypeCode"
FROM
PUBLIC ."IntterraNearRealTimeUnitReflexes300s"
WHERE
(
(
"IncidentDateTime" >= '2016-05-01 00:00:00' :: TIMESTAMP WITHOUT TIME ZONE
)
)
Điều này trả về 700k hàng. Có cách nào để giái quyết vấn đề này không?
Tôi đã dành rất nhiều thời gian để đọc trang tài liệu này ngày hôm qua, và nghĩ rằng tôi đã tìm thấy câu trả lời của mình với cài đặt use_remote_estimate
thành đúng, nhưng nó không có tác dụng.
Tôi có quyền truy cập vào máy chủ nước ngoài để tạo đối tượng nếu cần thiết. Giá trị dấu thời gian trong WHERE
mệnh đề có thể là bất cứ điều gì; nó không đến từ một danh sách các giá trị được xác định trước.
IntterraNearRealTimeUnitReflexes300sForeign
so với IntterraNearRealTimeUnitReflexes300s
và idx_incident_date_time_300
tôi cho rằng những số 300 là như nhau, nhưng có thể đáng để kiểm tra nếu idx_incident_date_time_300
chỉ mục tồn tại trên máy chủ nước ngoài