我有一個關于準確理解 PostgreSQL 如何執行查詢的問題。由于它是基于行的,因此您是否有類似的查詢Select * from lineitem或Select l_orderkey from lineitem性能方面的查詢都沒有關系?此外,為什么在兩種情況下都必須掃描完整表,Select count(*) from lineitem并且在測量時間上存在差異Select * from lineitem?我正在測量這樣的性能:
long starttime=System.CurrenMillis();
Statement a = conn.createStatement();
a.setFetchsize(10000);
Resultset rs = a.executeQuery(Query);
while(rs.next()){}
long endTime=System.currentMillis();
System.out.println((endTime-starttime));
我必須設定一個 fetchsize 否則會出現 Java 堆空間錯誤,因為表非常大。此外,我試圖測量與水平磁區表的差異。為此,我通過 orderstatus='O' 拆分了表順序,從而產生了兩個具有相同大小的表(ordersO、ordersF)。當比較查詢Select * from ordersO和時Select * from orders where o_orderstatus='O',我期望磁區上的第一個查詢只需要一半的時間,因為它只包含一半的圖佩爾?但事實并非如此,測量的時間或多或少是相等的。
先感謝您 !
uj5u.com熱心網友回復:
這里有幾個問題。
性能會SELECT col FROM tab比SELECT * FROM tab?
是的,它會,有兩個原因:
PostgreSQL 不必從行中提取所有列。如果該列在列串列的前面,那顯然是一個勝利。但我們也贏了,因為我們不必“去除”存盤在TOAST 表中的過大屬性。
您必須向客戶端傳輸更少的資料,而客戶端必須處理更少的資料。
為什么SELCT count(*) FROM tab比 快SELECT * FROM tab?
主要是因為它不必向客戶端傳輸大量資料。此外,它必須對服務器上的每個表行進行較少的處理。
為什么SELECT * FROM tab_42和SELECT * FROM tab WHERE partkey = 42同樣快?
那是因為磁區修剪。如果磁區鍵在WHERE子句中,PostgreSQL 將限制掃描到適當的表磁區。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328563.html
標籤:PostgreSQL 数据库
上一篇:帶有UNIONALL錯誤的PostgresINSERT時間戳
下一篇:postgres函式看不到變數
