Postgresql
是否可以讓 postgresql 按條件估計行
我有一個超過 2000000 行的文章表,因為計數太慢,我正在使用這樣的估計行:
select count_estimate('select * from article');
這適用於文章分頁,現在我面臨一個問題是我想在分頁查詢中添加一些條件。例如,我需要像這樣使用頻道 ID 過濾文章:
select count_estimate('select * from article where sub_source_id = 308');
這似乎行不通。當我更改頻道 ID 時,行數沒有改變。nuber 並不精確。我應該怎麼做才能使用過濾器獲取行數?可能嗎?這是功能:
CREATE OR REPLACE FUNCTION public.count_estimate(query text) RETURNS bigint LANGUAGE plpgsql AS $function$ DECLARE rec record; ROWS INTEGER; BEGIN FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP ROWS := SUBSTRING(rec."QUERY PLAN" FROM ' rows=([[:digit:]]+)'); EXIT WHEN ROWS IS NOT NULL; END LOOP; RETURN ROWS; END $function$ ;
該估計值基於 pg_stats 中的數據。專業估計將僅針對 MCV 列表中給出的值進行估計。所有不在 MCV 列表中的值都將得到相同的估計值,因為沒有資訊可以區分它們。如果您需要更準確的結果,可以嘗試增加 default_statistics_target 或每列統計資訊。
根據我的評論稍微詳細說明…
聰明的方法,雖然
EXPLAIN
依賴於統計數據的流通和可用性,這可能是陳舊的或缺乏的(例如,一些WHERE
謂詞是不可估計的)。為了獲得最準確的結果,您必須解析 的輸出
EXPLAIN ANALYZE
,這可能會破壞您嘗試完成的目的,因為它會執行計劃(執行查詢),而不是簡單地計劃它。或者,您可以嘗試確保
ANALYZE
以足夠的頻率執行以在影響重要行數的活動(例如,批量插入)之後擷取統計資訊。然而,這種方法仍然受到可用統計數據的限制(例如,基於函式的WHERE
過濾器)。