Postgresql

是否可以讓 postgresql 按條件估計行

  • July 29, 2022

我有一個超過 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過濾器)。

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