天天看點

[Phoenix] 九、分頁查詢

概述

所謂分頁查詢就是從符合條件的起始記錄,往後周遊“頁大小”的行。資料庫的分頁是在server端完成的,避免用戶端一次性查詢到大量的資料,讓查詢資料資料分段展示在用戶端。對于Phoenix的分頁查詢,怎麼使用?性能怎麼樣?需要注意什麼?将會在文章中通過示例和資料說明。

二、分頁查詢

1. 文法說明

[ LIMIT { count } ]     [ OFFSET start [ ROW | ROWS ] ]     [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]           

Limit或者Fetch在order by子句後轉化為為top-N的查詢,其中offset子句表示從開始的位置跳過多少行開始掃描。

對于以下的offsset使用示例, 我們可發現當offset的值為0時,查詢結果從第一行記錄開始掃描limit指定的行數,當offset值為1時查詢結果從第二行記錄開始開始掃描limit指定的行數...

0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK  from STORE_SALES where SS_ITEM_SK < 3600order by SS_ITEM_SK      limit 6;     +-----------------+     | SS_CUSTOMER_SK  |     +-----------------+     | 109734          |     | null            |     | 168740          |     | 344372          |     | 249078          |     | 241017          |     +-----------------+     6 rows selected (0.025 seconds)     0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK  from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK      limit 3 offset 0;     +-----------------+     | SS_CUSTOMER_SK  |     +-----------------+     | 109734          |     | null            |     | 168740          |     +-----------------+     3 rows selected (0.034 seconds)     0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK  from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK      limit 3 offset 1;     +-----------------+     | SS_CUSTOMER_SK  |     +-----------------+     | null            |     | 168740          |     | 344372          |     +-----------------+     3 rows selected (0.026 seconds)     0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK  from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK      limit 3 offset 2;     +-----------------+     | SS_CUSTOMER_SK  |     +-----------------+     | 168740          |     | 344372          |     | 249078          |     +-----------------+     3 rows selected (0.017 seconds)     0: jdbc:phoenix:localhost> select SS_CUSTOMER_SK  from STORE_SALES where SS_ITEM_SK < 3600 order by SS_ITEM_SK      limit 3 offset 3;     +-----------------+     | SS_CUSTOMER_SK  |     +-----------------+     | 344372          |     | 249078          |     | 241017          |     +-----------------+     3 rows selected (0.024 seconds)           

2. 文法示例

SELECT * FROM TEST LIMIT 1000;     SELECT * FROM TEST LIMIT 1000 OFFSET 100;     SELECT * FROM TEST FETCH FIRST 100 ROWS ONLY;           

三、性能測評

我們對如下SQL的limit子句進行性能得到以下結論。

select SS_CUSTOMER_SK  from STORE_SALES     where SS_ITEM_SK < 3600      order by SS_ITEM_SK      limit <m> offset <n>           

結論1:當limit的值一定時,随着offset N的值越大,查詢性基本會線性下降。

[Phoenix] 九、分頁查詢

結論2:當offset的值一定時,随着Limit的值越大,查詢性能逐漸下降。當limit的值相差一個數量級時,查詢性能也會有幾十倍的差距。

[Phoenix] 九、分頁查詢

四、最後

大多數場景中分頁查詢都是和order by子句一起使用的, 在這裡需要注意的是,order by的排序字段最好是主鍵,否則查詢性能會比較差。(這部分最好是在做業務層設計時就能考慮到)分頁查詢需要根據使用者的實際需求來設計,在現實産品中,一般很少有上萬行每頁的需求,頁數太大是不合理的,同時頁數太多也是不合理的。度量是否合理,仍需要根據實際需求出發。

參考