2017-08-16 34 views
0

我使用pg_trgm擴展來檢查文本列的相似性。我想通過使用附加條件加速它,但沒有成功。速度是一樣的。這是我的例子:postgresql pg_trgm加速的地方條件

create table test (
    id serial, 
    descr text, 
    yesno text, 
    truefalse boolean 
    ); 
    insert into test SELECT generate_series(1,1000000) AS id, 
md5(random()::text) AS descr ; 
    update test set yesno = 'yes' where id < 500000; 
    update test set yesno = 'no' where id > 499999; 
    update test set truefalse = true where id < 100000; 
    update test set truefalse = false where id > 99999; 
    CREATE INDEX test_trgm_idx ON test USING gist (descr gist_trgm_ops); 

所以,當我執行查詢時,是否使用where子句沒有區別。

select descr <-> '65c141ee1fdeb269d2e393cb1d3e1c09' 
as dist, descr, yesno, truefalse from test 
    where 
    yesno = 'yes' 
    and 
    truefalse = true 
order by dist 
limit 10; 

這是正確的嗎?

+1

那麼你沒有'yesno'或'truefalse'上的任何索引。因此,我認爲Postgres將不得不掃描應用這個WHERE條件,這可能需要一些資源。而且,留下的記錄數量可能仍然很大,在這兩種情況下,Postgres必須按'dist'排序以應用LIMIT條款。 –

+0

@TimBiegeleisen,我添加了索引爲布爾列,它不會影響... –

+0

那麼布爾列只有兩個可能的值,所以基數很高,因此索引可能沒有幫助。 –

回答

1

創建測試數據後,請執行ANALYZE以確保更新統計信息。然後你可以使用EXPLAIN找出。

在我的機器上,它對test_trgm_idx執行索引掃描,以按順序掃描行,以便在達到限制時停止。由於實際上稍微有點多的工作,因爲它必須在達到極限之前掃描更多的行,認爲時差並不明顯。

+0

我跑分析,然後解釋。行數減少了10倍,但成本保持不變。執行時間也是如此...... –