話題(スレッド): インデクスが作成できない

インデクスが作成できない (2015-02-05 18:42, もりたいくひろ, #75380)

お世話になっております。
もりたともうします。

PostgreSQL 9.3.5 にて pg_bigm 1.1 を利用しようとしています。
ドキュメント通りインストール

foo_db=# CREATE EXTENSION pg_bigm;
CREATE EXTENSION
foo_db=# \dx pg_bigm
List of installed extensions
Name | Version | Schema | Description
---------+---------+--------+------------------------------------------------------------------
pg_bigm | 1.1 | public | text similarity measurement and index searching based on bigrams
(1 row)

foo_db=#

し、インデクスを作成しようとしたところ、

foo_db=# CREATE INDEX bar_table_idx_bigm ON bar_table USING gin (baz_column gin_bigm_ops);
ERROR: invalid memory alloc request size 1784818036
foo_db=#

とエラーになり作成に失敗しました。
少々ググり DB のダンプ&レストアも試してみましたが結果は同じでした。
どのような原因が考えられるでしょうか?

メッセージ #75380 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-02-05 19:10, sawada-masahiko, #75381)

[メッセージ #75380 への返信]
> お世話になっております。
> もりたともうします。
>
> PostgreSQL 9.3.5 にて pg_bigm 1.1 を利用しようとしています。
> ドキュメント通りインストール
>
> foo_db=# CREATE EXTENSION pg_bigm;
> CREATE EXTENSION
> foo_db=# \dx pg_bigm
> List of installed extensions
> Name | Version | Schema | Description
> ---------+---------+--------+------------------------------------------------------------------
> pg_bigm | 1.1 | public | text similarity measurement and index searching based on bigrams
> (1 row)
>
> foo_db=#
>
> し、インデクスを作成しようとしたところ、
>
> foo_db=# CREATE INDEX bar_table_idx_bigm ON bar_table USING gin (baz_column gin_bigm_ops);
> ERROR: invalid memory alloc request size 1784818036
> foo_db=#
>
> とエラーになり作成に失敗しました。
> 少々ググり DB のダンプ&レストアも試してみましたが結果は同じでした。
> どのような原因が考えられるでしょうか?

澤田と申します。

エラーメッセージに書いてあるようにメモリを確保する際にエラーとなっており、また、確保するメモリサイズが正常でないように見えます。
# ダンプもできない等ことですので、pg_bigmが原因で発生している、というわけではないようです。
参考URLに書いてあるように、DBのロケールとエンコーディングの不一致により上記のようなエラーが発生するようなのですが、それらを確認いただくことは可能でしょうか?

■参考URL
<http://lets.postgresql.jp/documents/technical/text-processing/2>
#75380 への返信

メッセージ #75381 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-02-09 11:19, もりたいくひろ, #75416)

[Reply To Message #75381]
> [メッセージ #75380 への返信]
> > お世話になっております。
> > もりたともうします。
> >
> > PostgreSQL 9.3.5 にて pg_bigm 1.1 を利用しようとしています。
> > ドキュメント通りインストール
> >
> > foo_db=# CREATE EXTENSION pg_bigm;
> > CREATE EXTENSION
> > foo_db=# \dx pg_bigm
> > List of installed extensions
> > Name | Version | Schema | Description
> > ---------+---------+--------+------------------------------------------------------------------
> > pg_bigm | 1.1 | public | text similarity measurement and index searching based on bigrams
> > (1 row)
> >
> > foo_db=#
> >
> > し、インデクスを作成しようとしたところ、
> >
> > foo_db=# CREATE INDEX bar_table_idx_bigm ON bar_table USING gin (baz_column gin_bigm_ops);
> > ERROR: invalid memory alloc request size 1784818036
> > foo_db=#
> >
> > とエラーになり作成に失敗しました。
> > 少々ググり DB のダンプ&レストアも試してみましたが結果は同じでした。
> > どのような原因が考えられるでしょうか?
>
> 澤田と申します。
>
> エラーメッセージに書いてあるようにメモリを確保する際にエラーとなっており、また、確保するメモリサイズが正常でないように見えます。
> # ダンプもできない等ことですので、pg_bigmが原因で発生している、というわけではないようです。
> 参考URLに書いてあるように、DBのロケールとエンコーディングの不一致により上記のようなエラーが発生するようなのですが、それらを確認いただくことは可能でしょうか?
>
> ■参考URL
> <http://lets.postgresql.jp/documents/technical/text-processing/2>

もりたです。ご回答ありがとうございます。

私の説明が悪くて申し訳ありません。
ダンプは正常に(エラー表示はなにもなく)できました。レストアも同様です。
手順は下記の通りです。
 /path/to/pg_dump -v -b -Fc -U postgres -f foo_db.dump foo_db
 (foo_db の削除)
 /path/to/pg_restore -v -U postgres -C -d postgres foo_db.dump
ダンプ&レストアを試した理由は、ググった結果「コントロール系のテーブルがイカれている可能性があるので速やかにダンプ&レストアせよ」というような記述を見つけたためです。(そのサイトはいまブラウザの履歴を探していますがまだ見つけられていません...英語の技術系相談サイトでした...)

いただいた URL もググり中に見ました。ロケールの設定は C、エンコーディングは UTF-8 です。ロケール設定の確認もしました。下記の結果になります。
foo_db =# SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
name | setting | context
-------------+---------+-----------
lc_collate | C | internal
lc_ctype | C | internal
lc_messages | C | superuser
lc_monetary | C | user
lc_numeric | C | user
lc_time | C | user
(6 rows)

foo_db =#

それから、これは最初のメッセージに書くべきだったと反省しておりますが、つい数日前にはこの DB に対するこのインデクスの作成は成功していました。最初に作成したのは pg_bigm の 1.0 を使いました。数日後 1.1 にアップグレードしインデクスを作り直しました。その時点では問題なく作成されたと思い込んでいましたが、翌日インデクスがないことに気づき、削除した記憶がないなぁと首を傾げながら再度インデクスを作成したところでこのエラーに気づきました。pg_bigm を 1.0 に戻すことも試しましたが、インデクス作成のエラーは変わりません。

いま書きながら考えていることですが、1.0 では問題ないのに 1.1 でエラーになるなんらかの状況が存在し、私の環境で 1.1 から 1.0 へのダウングレードがうまくいっていないのかもしれないと思っています。PostgreSQL そのものの再インストールからやり直してみようと思います。
#75381 への返信

メッセージ #75416 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-02-09 15:49, sawada-masahiko, #75418)

[メッセージ #75416 への返信]
> [Reply To Message #75381]
> > [メッセージ #75380 への返信]
> > > お世話になっております。
> > > もりたともうします。
> > >
> > > PostgreSQL 9.3.5 にて pg_bigm 1.1 を利用しようとしています。
> > > ドキュメント通りインストール
> > >
> > > foo_db=# CREATE EXTENSION pg_bigm;
> > > CREATE EXTENSION
> > > foo_db=# \dx pg_bigm
> > > List of installed extensions
> > > Name | Version | Schema | Description
> > > ---------+---------+--------+------------------------------------------------------------------
> > > pg_bigm | 1.1 | public | text similarity measurement and index searching based on bigrams
> > > (1 row)
> > >
> > > foo_db=#
> > >
> > > し、インデクスを作成しようとしたところ、
> > >
> > > foo_db=# CREATE INDEX bar_table_idx_bigm ON bar_table USING gin (baz_column gin_bigm_ops);
> > > ERROR: invalid memory alloc request size 1784818036
> > > foo_db=#
> > >
> > > とエラーになり作成に失敗しました。
> > > 少々ググり DB のダンプ&レストアも試してみましたが結果は同じでした。
> > > どのような原因が考えられるでしょうか?
> >
> > 澤田と申します。
> >
> > エラーメッセージに書いてあるようにメモリを確保する際にエラーとなっており、また、確保するメモリサイズが正常でないように見えます。
> > # ダンプもできない等ことですので、pg_bigmが原因で発生している、というわけではないようです。
> > 参考URLに書いてあるように、DBのロケールとエンコーディングの不一致により上記のようなエラーが発生するようなのですが、それらを確認いただくことは可能でしょうか?
> >
> > ■参考URL
> > <http://lets.postgresql.jp/documents/technical/text-processing/2>
>
> もりたです。ご回答ありがとうございます。
>
> 私の説明が悪くて申し訳ありません。
> ダンプは正常に(エラー表示はなにもなく)できました。レストアも同様です。
> 手順は下記の通りです。
>  /path/to/pg_dump -v -b -Fc -U postgres -f foo_db.dump foo_db
>  (foo_db の削除)
>  /path/to/pg_restore -v -U postgres -C -d postgres foo_db.dump
> ダンプ&レストアを試した理由は、ググった結果「コントロール系のテーブルがイカれている可能性があるので速やかにダンプ&レストアせよ」というような記述を見つけたためです。(そのサイトはいまブラウザの履歴を探していますがまだ見つけられていません...英語の技術系相談サイトでした...)
>
> いただいた URL もググり中に見ました。ロケールの設定は C、エンコーディングは UTF-8 です。ロケール設定の確認もしました。下記の結果になります。
> foo_db =# SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
> name | setting | context
> -------------+---------+-----------
> lc_collate | C | internal
> lc_ctype | C | internal
> lc_messages | C | superuser
> lc_monetary | C | user
> lc_numeric | C | user
> lc_time | C | user
> (6 rows)
>
> foo_db =#
>
> それから、これは最初のメッセージに書くべきだったと反省しておりますが、つい数日前にはこの DB に対するこのインデクスの作成は成功していました。最初に作成したのは pg_bigm の 1.0 を使いました。数日後 1.1 にアップグレードしインデクスを作り直しました。その時点では問題なく作成されたと思い込んでいましたが、翌日インデクスがないことに気づき、削除した記憶がないなぁと首を傾げながら再度インデクスを作成したところでこのエラーに気づきました。pg_bigm を 1.0 に戻すことも試しましたが、インデクス作成のエラーは変わりません。
>
> いま書きながら考えていることですが、1.0 では問題ないのに 1.1 でエラーになるなんらかの状況が存在し、私の環境で 1.1 から 1.0 へのダウングレードがうまくいっていないのかもしれないと思っています。PostgreSQL そのものの再インストールからやり直してみようと思います。

澤田です。

pg_bigmを使ってインデックスを作成する場合、1レコードのサイズの上限は約44MB(44739242byte)となるため、
上限値以上の長さを持ったレコードのインデックスを作成しようとしている可能性も考えられます。
# 例えば、1.0でインデックスが作成されていた時は上限値を超えるようなレコードは存在せず、
# 1.1にアップグレードするまでの間にそのようなレコードが挿入されたとすると、1.1でのインデックス作成もできず、
# 再度1.0に戻してもインデックス作成ができません。

インデックスを先に作成し、その後データロードをするなどをして、どのレコードのインデックスを作成しているときに
本エラーが出ているかを確認してみてはいかがでしょうか?

#75416 への返信

メッセージ #75418 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-02-10 10:30, もりたいくひろ, #75422)

もりたです。

[Reply To Message #75418]
> pg_bigmを使ってインデックスを作成する場合、1レコードのサイズの上限は約44MB(44739242byte)となるため、
> 上限値以上の長さを持ったレコードのインデックスを作成しようとしている可能性も考えられます。
> # 例えば、1.0でインデックスが作成されていた時は上限値を超えるようなレコードは存在せず、
> # 1.1にアップグレードするまでの間にそのようなレコードが挿入されたとすると、1.1でのインデックス作成もできず、
> # 再度1.0に戻してもインデックス作成ができません。

なるほど、pg_bigm を 1.1 にアップデートした後にインデクスを作り直したので、その間(インデクス削除からその直後の作成の間)にそのような挿入が起きた確率は低いかなと考えていましたが、1.0 で運用していた数日間に挿入された可能性も考慮する必要がある、言い換えると INSERT 文は成功しつつ裏でインデクスの更新がこっそり失敗することがあり得るのですね。

> インデックスを先に作成し、その後データロードをするなどをして、どのレコードのインデックスを作成しているときに
> 本エラーが出ているかを確認してみてはいかがでしょうか?

やってみます。ありがとうございます。
#75418 への返信

メッセージ #75422 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-02-10 11:14, sawada-masahiko, #75423)

[メッセージ #75422 への返信]
澤田です。

> なるほど、pg_bigm を 1.1 にアップデートした後にインデクスを作り直したので、その間(インデクス削除からその直後の作成の間)にそのような挿
> 入が起きた確率は低いかなと考えていましたが、
> 1.0 で運用していた数日間に挿入された可能性も考慮する必要がある、
すいません、説明不足だったかもしれません。
1.0でも1.1と上限値は同じですので、上限値を超えるようなデータは(1.0, 1.1問わず)インデックスがある状態ですと、
データ挿入も、インデックス更新も失敗します。
上限値を超えたデータが原因でインデックス作成が失敗しているとすると、
「インデックス削除からその直後の作成の間(= インデックスがない状態の時)」に、そのようなデータ挿入があった可能性があるかと思っています。

> 言い換えると INSERT 文は成功しつつ裏でインデクスの更新がこっそり失敗することがあり得るのですね。
上記の繰り返しになってしまいますが、インデックスがある状態ですと、INSERT文は成功してインデックス更新だけが失敗する、
ということはないかと思います。
インデックスがない状態で、「INSERT→CREATE INDEX」の順番で処理をした場合であれば、INSERTは成功し、
そのあとのCREATE INDEXだけ失敗します。

以上です。
#75422 への返信

メッセージ #75423 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-02-10 12:07, もりたいくひろ, #75424)

[Reply To Message #75423]

もりたです。

> > なるほど、pg_bigm を 1.1 にアップデートした後にインデクスを作り直したので、その間(インデクス削除からその直後の作成の間)にそのような挿
> > 入が起きた確率は低いかなと考えていましたが、
> > 1.0 で運用していた数日間に挿入された可能性も考慮する必要がある、
> すいません、説明不足だったかもしれません。
> 1.0でも1.1と上限値は同じですので、上限値を超えるようなデータは(1.0, 1.1問わず)インデックスがある状態ですと、
> データ挿入も、インデックス更新も失敗します。
> 上限値を超えたデータが原因でインデックス作成が失敗しているとすると、
> 「インデックス削除からその直後の作成の間(= インデックスがない状態の時)」に、そのようなデータ挿入があった可能性があるかと思っています。
>
> > 言い換えると INSERT 文は成功しつつ裏でインデクスの更新がこっそり失敗することがあり得るのですね。
> 上記の繰り返しになってしまいますが、インデックスがある状態ですと、INSERT文は成功してインデックス更新だけが失敗する、
> ということはないかと思います。
> インデックスがない状態で、「INSERT→CREATE INDEX」の順番で処理をした場合であれば、INSERTは成功し、
> そのあとのCREATE INDEXだけ失敗します。

なるほど、やはりそうですか。となると「DROP INDEX から CREATE INDEX までのほんの数秒の間に NG 行が挿入された」ということになりますが、すごい確率です...

格闘してみます。度々のご回答ありがとうございました。
#75423 への返信

メッセージ #75424 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-02-10 13:43, もりたいくひろ, #75425)

もりたです。
対象テーブルを調査しました。
カラム数は 4、character varying (256) がふたつに timestamp without time zone と text という具合です。
キモは text カラムと思いますが、最長データは 627284128 ビット ( bit_length 関数の結果 )、少なくとも上位 10 件はすべて昨年中に挿入されています。
インデクスの作り直しどころか pg_bigm の導入自体が今年に入ってからですので、サイズの問題ではなさそうに思えます。
#75424 への返信

メッセージ #75425 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-02-10 13:50, もりたいくひろ, #75427)

もりたです。連投申し訳ありません。

> キモは text カラムと思いますが、最長データは 627284128 ビット ( bit_length 関数の結果 )、少なくとも上位 10 件はすべて昨年中に挿入されています。
> インデクスの作り直しどころか pg_bigm の導入自体が今年に入ってからですので、サイズの問題ではなさそうに思えます。

「1レコードのサイズの上限は約44MB(44739242byte)」だとするとはるかに超えていますね。でも確かに 1.0 ではインデクス作れていたはずなのです...
#75425 への返信

メッセージ #75427 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-09-09 23:20, fujii_masao, #76849)

藤井と申します。

[メッセージ #75427 への返信]
> もりたです。連投申し訳ありません。
>
> > キモは text カラムと思いますが、最長データは 627284128 ビット ( bit_length 関数の結果 )、少なくとも上位 10 件はすべて昨年中に挿入されています。
> > インデクスの作り直しどころか pg_bigm の導入自体が今年に入ってからですので、サイズの問題ではなさそうに思えます。
>
> 「1レコードのサイズの上限は約44MB(44739242byte)」だとするとはるかに超えていますね。でも確かに 1.0 ではインデクス作れていたはずなのです...

今更で申し訳ございませんが、本日リリースした最新バージョンpg_bigm-1.1-20150910だと、
全文検索インデックスを作成可能なカラムの最大サイズが43MBから102MBに増えましたので、
こちらをお試しいただければと思います。
#75427 への返信

メッセージ #76849 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-09-24 09:51, もりたいくひろ, #76933)

森田と申します。
気付くのが遅れてしまい申し訳ありません。

[Reply To Message #76849]
> 今更で申し訳ございませんが、本日リリースした最新バージョンpg_bigm-1.1-20150910だと、
> 全文検索インデックスを作成可能なカラムの最大サイズが43MBから102MBに増えましたので、
> こちらをお試しいただければと思います。

ありがとうございます。
ぜひアップデートさせていただきます。

それからご報告なのですが、#75418 のアドバイスに従い先に空のテーブルを作りインデクスを作成してからデータを投入してみたところ、問題は起こらずスルッと完了してしまいました。なんとも歯切れが悪くどうしようかと考えているうちご報告を怠ってしまいました。申し訳ありません。
#76849 への返信

メッセージ #76933 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: インデクスが作成できない (2015-09-24 22:23, fujii_masao, #76939)

[メッセージ #76933 への返信]
> それからご報告なのですが、#75418 のアドバイスに従い先に空のテーブルを作りインデクスを作成してからデータを投入してみたところ、問題は起こらずスルッと完了してしまいました。なんとも歯切れが悪くどうしようかと考えているうちご報告を怠ってしまいました。申し訳ありません。

問題の状況について共有いただきありがとうございます!
また何かありましたらお問い合わせいただけたらと思います。
#76933 への返信

メッセージ #76939 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする