postgres内置vs用户定义的函数性能

时间:2018-01-12 08:59:26

标签: postgresql postgresql-9.1

我必须在非常大的整数列上计算postgresql中的位数,为此我编写了一个postgresql函数来计算整数中的位数。

CREATE OR REPLACE FUNCTION bitcount(i integer) RETURNS integer AS $$
DECLARE n integer;
  DECLARE bitCount integer;
BEGIN
  bitCount := 0;

  LOOP
    IF i = 0 THEN
      EXIT;
    END IF;
    i := i & (i-1);
    bitCount:= bitCount+1;
  END LOOP;
  RETURN bitCount;
END
$$ LANGUAGE plpgsql;

但我发现还有一种方法可以使用pg的内置功能 喜欢

SELECT char_length( replace(100::bit(31)::TEXT, '0', ''));

所以我决定比较这两种方式的表现 所以我用下面的查询进行比较

第一

SELECT a.n, bitcount(a.n)
from generate_series(1, 100000) as a(n);

第二

SELECT a.n, char_length( replace(a.n::bit(31)::TEXT, '0', ''))
FROM generate_series(1, 100000) as a(n);

我期待第一种方法胜过第二种方法 但令我惊讶的是,他们两人的表现几乎相同。实际上在我的机器上,即使有大量的整数,第二个也总是快几秒完成。

任何人都可以解释为什么第二个几乎和第一个一样快,尽管使用了强制转换和字符串操作?

1 个答案:

答案 0 :(得分:0)

我说这是因为已知PL / pgSQL很慢。

在PL / Perl或PL / Python中编写函数以获得更好的性能。