全部產品
Search
文件中心

PolarDB:LIMIT和OFFSET

更新時間:Jul 06, 2024

本文介紹了LIMITOFFSET的相關內容。

簡介

LIMITOFFSET允許你只檢索查詢剩餘部分產生的行的一部分:

    SELECT select_list
        FROM table_expression
        [ ORDER BY ... ]
        [ LIMIT { number | ALL } ] [ OFFSET number ]

如果給出了一個限制計數,那麼會返回數量不超過該限制的行(但可能更少些,因為查詢本身可能產生的行數就比較少)。LIMIT ALL的效果和省略LIMIT子句一樣,就像是LIMIT帶有 NULL 參數一樣。

OFFSET說明在開始返回行之前忽略多少行。OFFSET 0的效果和省略OFFSET子句是一樣的,並且LIMIT NULL的效果和省略LIMIT子句一樣,就像是OFFSET帶有 NULL 參數一樣。

如果OFFSETLIMIT都出現了, 那麼在返回LIMIT個行之前要先忽略OFFSET行。

如果使用LIMIT,那麼用一個ORDER BY子句把結果行約束成一個唯一的順序是很重要的。否則你就會拿到一個不可預料的該查詢的行的子集。你要的可能是第十到第二十行,但以什麼順序的第十到第二十?除非你指定了ORDER BY,否則順序是不知道的。

查詢最佳化工具在產生查詢計劃時會考慮LIMIT,因此如果你給定LIMITOFFSET,那麼你很可能收到不同的規劃(產生不同的行順序)。因此,使用不同的LIMIT/OFFSET值選取查詢結果的不同子集將產生不一致的結果,除非你用ORDER BY強制一個可預測的順序。這並非 bug, 這是一個很自然的結果,因為 SQL 沒有確保把查詢的結果按照任何特定的順序發出,除非用了ORDER BY來約束順序。

OFFSET子句忽略的行仍然需要在伺服器內部計算;因此,一個很大的OFFSET的效率可能還是不夠高。