簡體   English   中英

從RDMS提取大列表數據的最有效方法是什么?

[英]What's the most efficient way to pull data for a large list from an RDMS?

我正在使用一個包含成千上萬項必須提交給用戶進行選擇的系統。 每個訂單項顯示都包含大量數據和選項/鏈接,並且必須從數據庫中的許多表中讀取內容以呈現該行上的所有信息和鏈接。 並且有數千行。

因此很明顯,我們過濾或分頁或以某種方式限制了結果數據集,因為當用戶只選擇一個項目時,我們實際上不需要在頁面上顯示4000個項目。

假設我們分頁。 我在這里看到的問題是,例如要顯示第3頁,我們必須知道每頁有多少個項目,然后以某種方式使一個sql只能檢索一頁中價值3的頁面。記住要顯示的列表可以是根據許多數據列中的任何一個進行排序,因此在我看來,我們必須從數據庫中索取整個結果集,然后在程序中僅選擇我們想要的第3頁中的項目,因為沒有辦法說在SQL中,從x,y,z的選擇順序中給我30-40行。

然后就是獲取數據的問題。 我可以通過一次獲取所有我需要的數據,然后選擇要返回的30-40行,但這在數據庫上需要做很多工作,而我將大部分扔掉。

因此,相反,也許我要進行一次傳遞以獲取標識符列表,然后再進行另一個更為復雜的sql,以通過某個行標識符上的IN子句來獲取那10行所需的所有數據(最好是在PK​​中) 。 對一頁進行兩次通過聽起來是一個很慢的想法。 我還發現,我要求數據庫做的工作越多,我的DBA對我的生氣就越大。 因此,理想的做法是在應用服務器上盡可能多地轉儲工作,但這當然意味着通過網絡將大量數據從數據庫中拉到應用服務器,這也是一個緩慢的解決方案。

那是更好的方法嗎? 還是有另一個更好的范例?

現在假設我們正在過濾。 用戶可以選擇一些過濾條件。 我們遇到了同樣的問題,用戶可以刪除所有過濾器,然后最終從數據庫中加載4000個數據密集型行,這幾乎需要我進行分頁。

這里的目標是要有類似Google的快速頁面時間,同時被迫從許多表中讀取大量數據,以便能夠呈現一頁信息。

隨着時間的流逝,我逐漸意識到google的功能並不那么復雜。 我的意思是,搜索頁面的結果集包含相當有限的數據集。 我並不懷疑他們如何獲取數據非常復雜,但是任何給定的搜索結果都不由那么多信息組成。

我的問題是,我要顯示的頁面的每一行中都有很多信息,並且我的局限性在於我所有的數據都散布在許多表和數據庫中。

因此,盡管我意識到使用基礎架構我將永遠無法獲得類似Google的響應時間,但是從數據庫呈現頁面中的數據價值的最佳方法是什么?

實際上,有一種方法可以使數據庫說“給我查詢中的第30-40行”。 您要尋找的是LIMITOFFSET 這可能是最好的解決方案,它可以使數據庫盡其所能。

LIMIT和OFFSET的文檔

此外,聽起來您處於考慮緩存的理想位置。 您有一組非常昂貴的查詢,但是它們似乎並沒有很快改變-使用Memcached之類的東西來保存查詢結果的副本可能會很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM