Sql-Server

具有計數 b 樹的數據庫引擎以提供有效的分頁支持

  • August 31, 2016

今天我意識到關於 sql 數據庫的另一個有趣的事情:它們根本不做分頁。

通過分頁,我的意思是選擇一個由起始記錄號和記錄計數定義的數據片段,根據一個具有索引的順序 - 此操作由具有分頁器的使用者界面網格或具有延遲載入的捲動條使用。

就我而言,我注意到我的網格中數據的開頭是如何響應非常快的,但是降低數據它變得遲緩。那是使用 Sql Server。

我檢查了執行計劃,它正在以正確的順序通過索引讀取數據,但是對於較低的數據,它仍然需要掃描所有先前的數據以獲得正確的起始行。

現在我想起來,這很明顯:高效搜尋通常由搜尋鍵支持,而不是由記錄號支持。

然而,它不一定是那樣的。這在很大程度上取決於各個數據庫引擎的底層資料結構是如何實現的。傳統的 b 樹不能有效地按編號查找記錄,但它的一種變體可以:樹必須為每個節點儲存整個相應子樹中所有記錄的數量。這樣,即使是按行號查找也可以在對數時間內進行。

通過這樣的實現,分頁總是很有效的。

我想知道哪些數據庫引擎具有該功能(如果有的話) - 這就是為什麼用各種不同的 sql 數據庫引擎標籤標記問題的原因。

你知道你最喜歡的數據庫在分頁上做了什麼嗎?它是進行掃描還是確實可以通過記錄號進行搜尋?

SQL 數據庫……根本不做分頁。

實際上,數據庫(或準確地說是 RDBMS)根本不進行分頁。這取決於客戶程序。但是有一些聰明的方法可以查詢涉及索引的數據庫,這些索引具有來自不同 RDBMS 的不同支持。

“分頁”幾乎沒有定義任務。這就是為什麼你的問題很難回答。您必須首先指定如何定義頁面。

只讀表是微不足道的。只需在物化視圖中添加一個行號並在其上添加一個普通的 btree 索引。每個 RDBMS 都可以做到這一點。真正的藝術在於處理並發寫入負載。您必須首先定義確切的要求。這就是你的問題遺漏的地方……

對於較低的數據,它仍然需要掃描所有以前的數據以獲得正確的起始行。

您的描述表明您使用的是低級SQL Server -OFFSET其他FETCHRDBMS 使用不同的語法。這樣大的偏移量肯定會很慢。

相反,記住目前頁面的第一行和最後一行的唯一 (!) 索引列值,您可以使用匹配的 btree 索引快速檢索下一個或前 n 行 - 以對數時間計算。

特別是,Postgres還支持這種技術用於多列鍵(行值)。這些相關答案中的詳細資訊:

通過分頁OFFSET既慢又容易出錯。 討論瞭如何“記住你離開的地方”作為一種更好的方法。

引用自:https://dba.stackexchange.com/questions/148312