Contents
(1)Windows 版 PostgreSQL 9.2(一昨日) (2)Windows 版 PostgreSQL 9.3(昨日) - 実行環境、コンパイル済みファイルのダウンロード、配置
- PostgreSQL
起動、データベースへインストール - 簡単なテスト(Typed array)
(4)CentOS 6.6 + PostgreSQL 9.3( 9 月24 日)(5)CentOS 7 + PostgreSQL 9.5 Alpha 1( 9 月25 日)(6)Scientific Linux 7 + PostgreSQL 9.5 Alpha 2( 9 月26 日)(7・終)Mac OS X 10.8.5 + PostgreSQL 9.5 Alpha 1( 9 月27 日)
実行環境、コンパイル済みファイルのダウンロード、配置
- Windows
7 32bit + PostgreSQL Portable 9.4.1 - ConEmu Build 150513
で psqlを使用 - psql
のメッセージ文字化け対策で intl.dll を差し替え。(詳細:3 月 12 日の記事)
今日は
↓
PostgreSQL 起動、データベースへインストール
ファイルコピー後、PostgreSQL PortableCREATE DATABASE plv8_test TEMPLATE = template0 LC_COLLATE = 'C' LC_CTYPE = 'C';
# \c plv8_test データベース "plv8_test" にユーザ"postgres"として接続しました。
CREATE EXTENSION plv8; SELECT extname, extversion FROM pg_extension; extname | extversion ---------+------------ plpgsql | 1.0 plv8 | 1.4.2
簡単なテスト(Typed array)
一昨日・昨日と違うテストとして、PL/v8日本語の解説記事と同様にして、INT4
CREATE OR REPLACE FUNCTION int4sum_plv8_1 (ary plv8_int4array) RETURNS int8 LANGUAGE plv8 IMMUTABLE STRICT AS $$ var sum = 0, start = (new Date).getTime(); for (var i = 0; i < ary.length; i++) { sum += ary[i]; } plv8.elog(INFO, ((new Date).getTime() - start) + ' ms'); return sum; $$; CREATE OR REPLACE FUNCTION int4sum_plv8_2 (ary plv8_int4array) RETURNS int8 LANGUAGE plv8 IMMUTABLE STRICT AS $$ var sum = 0, start = (new Date).getTime(); for (var i = ary.length - 1; 0 <= i; i--) { sum += ary[i]; } plv8.elog(INFO, ((new Date).getTime() - start) + ' ms'); return sum; $$; CREATE OR REPLACE FUNCTION int4sum_plpgsql (ary int4[]) RETURNS int8 LANGUAGE plpgsql IMMUTABLE STRICT AS $$ DECLARE sum int8 = 0; ts time = clock_timestamp(); val int4; BEGIN FOR val IN SELECT unnest(ary) LOOP sum = sum + val; END LOOP; RAISE INFO '% ms', extract(milliseconds FROM clock_timestamp() - ts); RETURN sum; END; $$;
処理時間を測る時、PL/pgSQL
DO LANGUAGE plv8 $$ plv8.elog(INFO, new Date); plv8.execute('SELECT pg_sleep(1)'); plv8.elog(INFO, new Date); $$; INFO: Thu Sep 24 2015 19:03:05 GMT+0900 (東京 (標準時)) INFO: Thu Sep 24 2015 19:03:06 GMT+0900 (東京 (標準時)) DO 時間: 1002.159 ms
テスト用関数に渡す配列(1
CREATE TABLE test_int4array AS SELECT array_agg(gs) AS ary FROM cast(pow(10, 6) AS int) AS n, generate_series(1, n) AS gs; SELECT array_length(ary, 1) FROM test_int4array; array_length -------------- 1000000 (1 行) \timing SELECT sum(val) FROM ( SELECT unnest(ary) AS val FROM test_int4array ) foo; sum -------------- 500000500000 (1 行) 時間: 107.397 ms
↓ 本題のテスト結果。PL/pgSQL
-- PL/pgSQL SELECT int4sum_plpgsql(ary) FROM test_int4array; INFO: 437 ms int4sum_plpgsql ----------------- 500000500000 (1 行) 時間: 448.173 ms -- PL/v8 (1) SELECT int4sum_plv8_1(ary) FROM test_int4array; INFO: 0 ms int4sum_plv8_1 ---------------- 500000500000 (1 行) 時間: 4.703 ms -- PL/v8 (2) SELECT int4sum_plv8_2(ary) FROM test_int4array; INFO: 0 ms int4sum_plv8_2 ---------------- 500000500000 (1 行) 時間: 4.784 ms
と言うわけで
ところで、R 3.1.2
> n = 10^6 > v = seq(n) > length(v) [1] 1000000 > sum(v) [1] NA Warning message: In sum(v) : integer overflow - use sum(as.numeric(.)) > sum(as.numeric(v)) [1] 500000500000