Postgresql
從 varchar 到 text 的轉換是否有任何放緩?
在寫這個答案
varchar
時,我只是想知道從to轉換是否有任何減慢,text
或者該轉換是否只是一個編譯時技巧。我被告知它們以相同的方式表示並且它們是二進制強制的。這樣做會更快嗎SELECT varchar1 FROM table WHERE varchar1::text = 'foo';
或者,
SELECT varchar1 FROM table WHERE varchar1 = 'foo'::varchar;
所有測試都在 PostgreSQL 9.5 上完成。關於演員的問題,
樣本數據
我們首先創建一個包含 100,000 行和 3 個 varchar 列的表。
CREATE TABLE foo AS SELECT x::varchar AS x1, x::varchar AS x2, x::varchar AS x3 FROM generate_series(1,1e6) AS gs(x);
在
SELECT
然後我們嘗試演員陣容,
SELECT x1::text, x2::text, x3::text FROM foo; Time: 476.825 ms SELECT x1::text, x2::text, x3::text FROM foo; Time: 501.092 ms SELECT x1, x2, x3 FROM foo; Time: 360.493 ms SELECT x1, x2, x3 FROM foo; Time: 373.647 ms
結論:大幅減速不是編譯類型強制。
在
WHERE
子句然而,在 where 有條件的情況下,他們似乎有效地採取了相同的行動,
SELECT * FROM foo WHERE x1::varchar = '5'::varchar;
執行以及,
SELECT * FROM foo WHERE x1::text = '5';
如果我現在跑,
SELECT * FROM foo WHERE array_position(ARRAY['5', '6', '9'], x1::text) IS NOT NULL; SELECT * FROM foo WHERE array_position(ARRAY['5', '6', '9']::varchar[], x1) IS NOT NULL;
它們都執行相同的操作,因此
WHERE
子句中有一個優化。