Thay vì cross join lateral
sử dụng where exists
:
select *
from documents d
where exists (
select 1
from jsonb_array_elements(d.data_block -> 'PAYABLE_INVOICE_LINES') as pil
where (pil->'AMOUNT'->>'value')::decimal >= 1000)
limit 50;
Cập nhật
Và một phương pháp khác, phức tạp hơn nhưng cũng hiệu quả hơn nhiều.
Tạo hàm trả về giá trị tối đa từ JSONB
của bạn dữ liệu, như thế này:
create function fn_get_max_PAYABLE_INVOICE_LINES_value(JSONB) returns decimal language sql as $$
select max((pil->'AMOUNT'->>'value')::decimal)
from jsonb_array_elements($1 -> 'PAYABLE_INVOICE_LINES') as pil $$
Tạo chỉ mục trên chức năng này:
create index idx_max_PAYABLE_INVOICE_LINES_value
on documents(fn_get_max_PAYABLE_INVOICE_LINES_value(data_block));
Sử dụng hàm trong truy vấn của bạn:
select *
from documents d
where fn_get_max_PAYABLE_INVOICE_LINES_value(data_block) > 1000
limit 50;
Trong trường hợp này, chỉ mục sẽ được sử dụng và truy vấn sẽ nhanh hơn nhiều trên một lượng lớn dữ liệu.
Tái bút:Thường limit
có ý nghĩa đi đôi với order by
.