這里的代價變量可以按照任意尺度衡量。我們只關心它們的相對值,將它們以相同的因子縮放不會影響規劃器的選擇。默認情況下,這些代價變量是基于順序頁面獲取的代價的,即seq_page_cost被設置為1.0并且其他代價變量都參考它來設置。不過你可以使用你喜歡的不同尺度,例如在一個特定機器上的真實執行時間。
seq_page_cost (floating point)
設置規劃器對一系列順序磁盤頁面獲取中的一次的代價估計。默認值是1.0。通過把表和索引放在一個特殊的表空間(要設置該表空間的同名參數)中可以覆蓋這個值(見ALTER TABLESPACE)。
random_page_cost (floating point)
設置規劃器對一次非順序獲取磁盤頁面的代價估計。默認值是4.0。通過把表和索引放在一個特殊的表空間(要設置該表空間的同名參數)中可以覆蓋這個值(見ALTER TABLESPACE)。減少這個值(相對于seq_page_cost)將導致系統更傾向于索引掃描;提高它將讓索引掃描看起來相對更昂貴。你可以一起提高或降低兩個值來改變磁盤 I/O 代價相對于 CPU 代價的重要性,后者由下列參數描述。對磁盤存儲的隨機訪問通常比順序訪問要貴不止四倍。但是,由于對磁盤的大部分隨機訪問(例如被索引的讀取)都被假定在高速緩沖中進行,所以使用了一個較低的默認值(4.0)。默認值可以被想成把隨機訪問建模為比順序訪問慢 40 倍,而期望 90% 的隨機讀取會被緩存。如果你相信 90% 的緩沖率對你的負載是一個不正確的假設,你可以增加 random_page_cost 來更好的反映隨機存儲讀取的真正代價。相應地,如果你的數據可以完全放在高速緩存中(例如當數據庫小于服務器總內存時),降低 random_page_cost 可能是合適的。為具有很低的隨機讀取代價的存儲(例如固態驅動器)采用較低的 random_page_cost 值可能更好。提示盡管系統可以是你把random_page_cost設置得小于seq_page_cost,但是實際上沒有意義。不過,如果數據庫被整個緩存在 RAM 中,將它們設置為相等是有意義的,因為在那種情況中不按順序訪問頁面是沒有懲罰值的。同樣,在一個高度緩存化的數據庫中,你應該相對于 CPU 參數降低這兩個值,因為獲取一個已經在 RAM 中的頁面的代價要遠小于通常情況下的代價。
cpu_tuple_cost (floating point)
設置規劃器對一次查詢中處理每一行的代價估計。默認值是0.01。
cpu_index_tuple_cost (floating point)
設置規劃器對一次索引掃描中處理每一個索引項的代價估計。默認值是0.005。
cpu_operator_cost (floating point)
設置規劃器對于一次查詢中處理每個操作符或函數的代價估計。默認值是0.0025。
parallel_setup_cost (floating point)
設置規劃器對啟動并行工作者進程的代價估計。默認是1000。
parallel_tuple_cost (floating point)
設置規劃器對于從一個并行工作者進程傳遞一個元組給另一個進程的代價估計。默認是0.1。
min_parallel_table_scan_size (integer)
設置必須掃描的最小表格數據量,以便考慮并行掃描。對于并行順序掃描,掃描的表格數據量始終等于表格的大小,但使用索引時,掃描的表格數據量通常會少一些。默認值是8兆字節(8MB)。
min_parallel_index_scan_size (integer)
設置必須掃描的索引數據的最小數量,以便考慮并行掃描。請注意,并行索引掃描通常不會觸及整個索引;這是計劃者認為實際上將被相關掃描觸及的頁數。默認值是512千字節(512kB)。
effective_cache_size (integer)
設置規劃器對一個單一查詢可用的有效磁盤緩沖區尺寸的假設。這個參數會被考慮在使用一個索引的代價估計中,更高的數值會使得索引掃描更可能被使用,更低的數值會使得順序掃描更可能被使用。在設置這個參數時,你還應該考慮數據庫的共享緩沖區以及將被用于數據庫數據文件的內核磁盤緩沖區。另外,還要考慮預計在不同表上的并發查詢數目,因為它們必須共享可用的空間。這個參數對數據庫分配的共享內存尺寸沒有影響,它也不會保留內核磁盤緩沖,它只用于估計的目的。系統也不會假設在查詢之間數據會保留在磁盤緩沖中。默認值是4吉字節(4GB)。