Postgresql

從 varchar 到 text 的轉換是否有任何放緩?

  • March 21, 2018

寫這個答案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子句中有一個優化。

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