須藤さま
川上です。
ご連絡ありがとうございます!
メモリ対応のご対応ありがとうございます!
リリースされましたらぜひ利用させていただきます。
ちなみに、こちらはメモリが足りない場合にPostgresをシャットダウンさせないような
根本的な対策は難しそうなものなのでしょうか?
また、いただいた方法にて、記載した環境で再現しなくなることは確認できました。
ただ、実際の環境ではまだ再現し、実行されているSQLを深く追ってみました。
どうも、UNIONし、IS NULLでSELECTしたときにまだ発生するようです。
再現する環境を作成してみました。
まだ詳細が追えておらず恐縮ですが、何かおかしなところ等ありますでしょうか。。
○手順
※前回の users テーブルは DROP ください
-- テーブル作成
bulk=# CREATE TABLE users (
id SERIAL,
name TEXT NOT NULL,
kind INTEGER ,
created TIMESTAMP,
updated TIMESTAMP
);
bulk=# CREATE TABLE taikai_users (
id SERIAL,
name TEXT NOT NULL,
kind INTEGER ,
created TIMESTAMP,
updated TIMESTAMP
);
-- view
bulk=# CREATE VIEW v_users AS (
SELECT id, name, kind, created, updated FROM users
UNION
SELECT id, name, kind, created, updated FROM taikai_users
);
-- データ登録(1000万件) ※ taikai_users は0件
bulk=# WITH RECURSIVE serical_table(n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM serical_table
WHERE n < 10000000
)
INSERT INTO users (name, kind, created, updated)
(SELECT 'kawakami' || random(), null,
NOW(), NOW()
FROM serical_table)
;
-- PGroongaのINDEX作成
bulk=# CREATE INDEX pgroonga_name_index ON users USING pgroonga (name);
bulk=# CREATE INDEX pgroonga_taikai_name_index ON taikai_users USING pgroonga (name);
-- 大量にヒットする検索実施(このSQL実行中に後述のエラーが発生する)
-- ※ただし、v_users ではなく、 users へのSELECTは成功する
bulk=# SET enable_indexonlyscan = no;
bulk=# SELECT COUNT(*) FROM v_users WHERE kind is null AND name &@~ 'ka';
サーバとの接続が想定外にクローズされました
おそらく要求の処理前または処理中にサーバが異常終了
したことを意味しています。
サーバーへの接続が失われました。リセットしています: 失敗。
以上、よろしくお願いいたします。