我必须在非常大的整数列上计算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);
我期待第一种方法胜过第二种方法 但令我惊讶的是,他们两人的表现几乎相同。实际上在我的机器上,即使有大量的整数,第二个也总是快几秒完成。
任何人都可以解释为什么第二个几乎和第一个一样快,尽管使用了强制转换和字符串操作?
答案 0 :(得分:0)
我说这是因为已知PL / pgSQL很慢。
在PL / Perl或PL / Python中编写函数以获得更好的性能。