我试图优化一个连接查询,当偏移量增加时,它会花费更多的时间。你的建议会很有帮助。
SELECT *
FROM document_1 AS doc_1
JOIN document_1 AS doc_2
ON doc_1.id_col_11 = doc_2.id_col_21
AND doc_1.id_col_12 = doc_2.id_col_22
WHERE doc_1.id_col_13 = 'ABC'
AND doc_1.id_col_14= 'XYZ'
ORDER BY doc_1.created_date, document_1.id
OFFSET 0
LIMIT 20
我创建了如下索引:
CREATE idx_1 ON document_1 (id_col_11, id_col_13, id_col_14);
CREATE idx_2 ON document_1 (id_col_21, id_col_22);
OFFSET LIMIT TIME
0 100 5.9s
10 100 6.0s
1000 100 5.9s
10 1000 16.5s
100 500 11.4s
当偏移增加时,性能下降。我正在使用Spring Data 连接到Couchbase数据库。
1条答案
按热度按时间e5nqia271#
你提到的数字并不反映任何在下降,如果抵消增加。当LIMIT增加时,它显示的是下降。这是预期的,因为文档数量和大小增加,并且需要传输到客户端和客户端需要消费。
如果可能的话,你还需要在FIRST中使用where子句过滤器,这样可以将它们推送到索引器中,尽早消除。https://www.couchbase.com/blog/ansi-join-support-n1ql/
一旦你有了ORDER BY,它就需要产生所有可能的结果(JOIN中的最后一个项目可以是顺序中的第一个)。
当OFFSET+LIMIT < 8192时,它使用堆排序,并提前丢弃条目,而不是完全排序
此处讨论偏移/限制对性能的影响https://www.couchbase.com/blog/offset-keyset-pagination-n1ql-query-couchbase/。由于JOIN,这将不适用
看看你是否可以使用左侧作为子查询与Couchbase排序记录与键集分页-失踪的记录,并得到它的工作