亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在應用極限前得到結果計數的最佳方法

在應用極限前得到結果計數的最佳方法

慕哥6287543 2019-07-15 16:35:42
在應用極限前得到結果計數的最佳方法當分頁瀏覽來自DB的數據時,您需要知道有多少頁將呈現頁面跳轉控件。目前,我通過運行查詢兩次,一次是在count()要確定結果的總數,第二次要有一個限制,以獲得當前頁面所需的結果。這似乎沒有效率。有沒有更好的方法來確定之前會返回多少個結果?LIMIT申請了?我正在使用PHP和Postgres。
查看完整描述

3 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

純SQL

自2008年以來,情況發生了變化。您可以使用窗口函數若要在一個查詢中獲得完整計數和有限結果,請執行以下操作。(與2009年PostgreSQL 8.4).

SELECT foo     , count(*) OVER() AS full_count
FROM   bar
WHERE  <some condition>ORDER  BY <some col>LIMIT  <pagesize>OFFSET <offset>

請注意,這可能比沒有總數要昂貴得多。必須對所有行進行計數,從匹配索引中僅取頂部行的可能快捷方式可能不再有幫助。
跟小桌子沒什么關系full_count <= OFFSET + LIMIT..大得多的事情full_count.

角箱*何時OFFSET至少與基本查詢中的行數一樣大,無排會被歸還。所以你也不會full_count..可能的備選辦法:

考慮來龍去脈:

  1. WHERE條款(及JOIN條件,而不是這里)從基表中篩選符合條件的行。

    (GROUP BY聚合函數就在這里)。

  2. 窗口函數的應用考慮了所有符合條件的行(取決于OVER子句和函數的框架規范)。簡約count(*) OVER()基于所有行。

  3. ORDER BY

    (DISTINCTDISTINCT ON)

  4. LIMIT / OFFSET根據已建立的順序應用于選擇要返回的行。

LIMIT / OFFSET隨著表中行數的增加,效率越來越低。如果需要更好的性能,請考慮其他方法:

獲得最終計票的備選方案

獲取受影響行數的方法完全不同(以前的全部計數OFFSET & LIMIT適用)。Postgres有內部簿記,有多少行受上一條SQL命令的影響。一些客戶端可以訪問該信息或計數行本身(如psql)。

例如,可以檢索plpgsql在執行SQL命令之后立即使用:

GET DIAGNOSTICS integer_var = ROW_COUNT;

手冊中的細節。

或者你可以用pg_num_rows在……里面PHP..或者其他客戶的類似功能。

有關:


查看完整回答
反對 回復 2019-07-15
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

正如我所描述的在我的博客上,MySQL有一個名為SQL_CALC_FRED行..這消除了執行兩次查詢的需要,但它仍然需要完整地執行查詢,即使限制子句允許它提前停止。

據我所知,PostgreSQL沒有類似的特性。在執行分頁(使用IMHO時最常見的限制)時,需要注意的一件事情是:執行“偏移量1000限制10”意味著DB必須獲取至少1010行,即使它只給出10行。一個更有表現力的方法是記住您要為前一行排序的行的值(在本例中是第1000行),并重寫如下查詢:“.order_row>value_of_1000_thLim10”。優點是“ORDER_ROW”很可能是索引的(如果不是,您就有問題了)。缺點是,如果在頁面視圖之間添加了新元素,則可能會出現一些不同步的情況(但同樣,訪問者可能無法觀察到這一點,并且可以獲得很大的性能增益)。


查看完整回答
反對 回復 2019-07-15
  • 3 回答
  • 0 關注
  • 406 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號