トップページ⇒db
1001コメント373KB

PostgreSQL Part.5

レス数が1000を超えています。これ以上書き込みはできません。
0001NAME IS NULL2007/12/01(土) 21:38:37ID:LPSUO/OT
PostgreSQL (ぽすとぐれすきゅーえる, ぽすとぐれす) について語るスレです。
前スレ [【Windows】 PostgreSQL8 Part.1 【対応】] http://pc11.2ch.net/test/read.cgi/db/1102247223/

● 関連サイト
[PostgreSQL 本家] http://www.postgresql.org/
[日本PostgreSQLユーザ会] http://www.postgresql.jp/
[ドキュメント] http://www.postgresql.jp/document/current/html/
[ダウンロード] http://www.postgresql.jp/PostgreSQL
[pgFoundry] http://pgfoundry.org/

● 関連スレ
[2ch検索] http://find.2ch.net/index.php?STR=PostgreSQL
[WebProg/PostgreSQL 2テーブル目] http://pc11.2ch.net/test/read.cgi/php/1047317680/
0002NAME IS NULL2007/12/02(日) 00:41:47ID:Q5JHapW8
>>1
乙! 盛り上がっていきましょうw
0003NAME IS NULL2007/12/02(日) 13:35:21ID:???
もうpostgresSQLが入ってるサーバを全部ぶっ壊したい
0004NAME IS NULL2007/12/04(火) 02:25:53ID:???
ネタがないので、PostgreSQL関連の過去ログでもはっとく。

【Windows】 PostgreSQL8 Part.1 【対応】 http://pc11.2ch.net/test/read.cgi/db/1102247223/
■   PostgreSQLのことならここで聞け   ■ http://pc8.2ch.net/test/read.cgi/db/1056960249/
■   PostgreSQLのことならここで聞け   ■ http://pc8.2ch.net/test/read.cgi/db/1091523132/
PostgresSQLについて語ろう http://pc8.2ch.net/test/read.cgi/db/1056992724/
PostgreSQLについて語ろう where OID=2::oid http://pc8.2ch.net/test/read.cgi/db/1136805513/
PostgreSQL 2テーブル目 http://pc8.2ch.net/test/read.cgi/db/1056944337/
PostgreSQL & pgsql-jp ML 3テーブル目 http://pc11.2ch.net/test/read.cgi/db/1079771059/
0005NAME IS NULL2007/12/04(火) 02:34:18ID:???
「ネタがない」と書いて思い出したんだけど、8.3の正式リリースはいつかな?
年明けにでもPCを入れ替えるものがあるので、どうせなら8.3をつっこんでやろうかと思ったり。
0006NAME IS NULL2007/12/04(火) 09:38:05ID:???
>>5
今月とか来月じゃなかったっけ?
セミナーでベータ版使ってくれって言ってた。
0007NAME IS NULL2007/12/05(水) 00:41:02ID:gLh1+dWI
1月だね
本家のMLに流れてた
000852007/12/05(水) 00:53:45ID:???
>>6-7
サンクス。
初夏の頃にフリーズされてから結構かかったような。
こんなもんでしたっけ? 当初夏から秋にかけてリリースする
雰囲気だったような気もするのだが。

-- 素直に8.2を入れて頃合いを見て8.3へ上げることにすっかな。
0009NAME IS NULL2007/12/05(水) 10:55:20ID:???
1月リリース予定のミニプロジェクトの開発で8.3beta使ってる。
初めて使うもので (MySQL からの移行)、せっかくだから Auto VACUUM あったら楽そうでいいかなとか。

Beta 4 の文字列が公式サイトで見られるけど、配布されているもののファイル名は beta3 だね…。
0010NAME IS NULL2007/12/05(水) 11:05:25ID:???
AUTO VACUUMは8.1からあるべ
0011NAME IS NULL2007/12/06(木) 09:01:33ID:symOClnh
beta4やっとで配布サイトに入ったな
0012NAME IS NULL2007/12/07(金) 15:31:14ID:rx0IPmKF
CentOS5でphpPgAdminをrpmでインストールしようとしています。

http://phppgadmin.sourceforge.net/?page=download
↑のページの中断にRHEL用のrpmの置き場として、
↓へのリンクがあるのですが、NotFoundになっています。
http://ftp.icdevgroup.org/phpPgAdmin/


どなたか他の置き場などご存知ないですか??
0013NAME IS NULL2007/12/08(土) 09:29:08ID:???
DB使用中の一覧は以下のSQLで見られるようですが、
select * from pg_stat_activity
その接続を強制切断(強制終了)はできるのでしょうか?
Windows版使用です。
0014NAME IS NULL2007/12/09(日) 03:54:35ID:Pkpabdth
>>8
9.0とメジャーバージョンアップしてもいいぐらい
機能がてんこ盛りだからね。
レビューに時間がかかったみたい。
0015NAME IS NULL2007/12/09(日) 04:05:49ID:???
ポスグレと怪獣フェドラはどんどん成長してしまって、
もうわかりませんわ。
0016NAME IS NULL2007/12/10(月) 16:40:19ID:???
>>13
procpid でプロセスを終了させるといいようですが、
自分自身の接続のpostgres.exe の PID(procpid)を取得する方法はあるのでしょうか?
0017NAME IS NULL2007/12/12(水) 08:49:31ID:???
>>16
つpg_cancel_backend()
0018NAME IS NULL2007/12/13(木) 01:33:25ID:w5o1YGhv
>>17
16が知りたいのは自分自身のPIDを取得する方法
0019NAME IS NULL2007/12/13(木) 12:04:20ID:???
>>18 のレスの意味がよくわからなかったので>>17のpg_cancel_backend調べたら
引数にpidいるのかw
\df でそれらしいの探したら pg_backend_pid() というやつで返ってきたけど。
0020NAME IS NULL2007/12/13(木) 14:05:41ID:???
>>17-19
ありがとうございます。

select pg_backend_pid();
で自分自身の接続のpostgres.exe の PID(procpid)を取得できますね。
http://www.fiberbit.net/user/kunyami/postgresql/statcollector/statfunc/pg_backend_pid.html

select pg_cancel_backend(引数procpid);
で"t"(trueのこと?)が返ってくるけど、プロセスがKILLされるわけじゃないようだし。。。

pg_cancel_backend(引数procpid) の使い方がよくわからないけど、ま、いっか。(^^;
0021NAME IS NULL2007/12/13(木) 14:11:46ID:???
pg_cancel_backend(引数procpid)
って、たぶん実行中だとキャンセルされるっていう意味なんだろーなー?!(想像)
0022NAME IS NULL2007/12/13(木) 23:18:36ID:NFig6uWq
誰かプロの方、おしえていただけませんでしょうか。

テーブルの列には、改行コード(\n)を含む文字列が格納されています。
db=# insert into testtable values('123\n456\n789');
db=# select * from testtable;
value
-------------
123
456
789

そこで、上記のように改行された状態ではなく、以下のように
改行コードが\nのままの値でデータベースに入力したいのです。。。
db=# select * from testtable;
value
---------------
123\n456\n789

このようにするには、どのようにinsertすれば良いのでしょうか。。。
すいませんが、よろしくお願いしますm(__)m
0023NAME IS NULL2007/12/13(木) 23:32:12ID:???
>>22
> 改行コードが\nのままの値
改行コードが含まれているんだから、表示すると改行されるのが当たり前。

「改行コードを『'\n'という文字列に変換』して」ということなら、
INSERT INTO Table VALUES(replace('123\n456\n789','\n','\\n'));
なんかでやればいいけど、それはもう改行コードじゃなく'\n'という文字列。
0024NAME IS NULL2007/12/13(木) 23:33:24ID:???
>>22
http://www.postgresql.jp/document/pg825doc/html/sql-syntax-lexical.html
の4.1.2.1.
0025222007/12/14(金) 00:19:03ID:74gC5soq
>>23
>>24
どうもありがとうございます。
ちょっと試してみます。
0026NAME IS NULL2007/12/14(金) 00:52:16ID:???
>>20
pg_cancel_backend()は実行中のSQLをキャンセルする関数。
プロセスを終了させるもんではないわな。
例えば、数分間結果が返ってこないSQLを一旦キャンセルしたいようなときに使う。
0027NAME IS NULL2007/12/14(金) 02:15:50ID:???
>>26
やはりそうでしたか。
どうもです。
pg_kill_pid()なんていう関数があると便利なんですがねぇ。笑
0028NAME IS NULL2007/12/14(金) 04:16:14ID:???
バカって悪用される可能性を考えないんだよな。
0029NAME IS NULL2007/12/14(金) 05:05:24ID:???
プロセス切られることによって、それから悪用される可能性ってあるかなぁ?
0030NAME IS NULL2007/12/14(金) 05:17:17ID:???
もっとバカはね、
postgres.exe 以外のプロセスもKILLできると勘違いしてるか、
プログラミングができない人だよ。
仮にKILLできても、su や admin なら問題ない。
0031NAME IS NULL2007/12/14(金) 05:25:16ID:???
次の一手は、
『釣られてるよ』
ですかね?!
0032282007/12/14(金) 15:27:56ID:???
うえへへへへ、まったくバカだぜこいつ……orz
接続毎にバックエンドが上がるのを完全に忘れてた。

危険な機能には権限で対処てのは当然思ってたけど、
pg_cancel_backend(pid)も管理者権限がないと使えないんだな。
PQcancelと違って任意のバックエンドに対して使えるみたいだから
当然だけど。

13が意図してることはさっぱり理解も同意もできないし、
単に接続終了かキャンセル+終了でよさそうなもんだけど、
調べてみるとpg_terminate_backend(pid)てのがソースにあった。
中身はSIGTERM送るだけ。
信頼性を損ねるからダメとコメントが付いてて使えないが。

長文スマソ
0033NAME IS NULL2007/12/14(金) 17:05:37ID:???
プロセスの強制終了できないみたいね。
APIで強制終了できるのかな?
0034NAME IS NULL2007/12/14(金) 17:17:27ID:???
>>32
>単に接続終了かキャンセル+終了でよさそうなもんだけど、

それってどういうコマンドですか?
その操作でプロセスも終了するんですか?
0035NAME IS NULL2007/12/14(金) 17:23:54ID:???
32って反省文ですかね?

>>28
ちなみに悪用される危険性、わからないな。
悪用される危険性があるなら、されないように
関数を作ればいいんではないか?
0036NAME IS NULL2007/12/14(金) 17:28:39ID:???
Linuxでは、該当のプロセス、KILLできますか?
0037NAME IS NULL2007/12/14(金) 17:58:17ID:???
サービスの停止、最開始が手っ取り早そう。
なんの権限無しにできるのが、アレだけど。笑

悪用もへったくれもないが、さて、どんな風にからんでくるの?
0038NAME IS NULL2007/12/14(金) 17:59:07ID:???
>>37
×最開始
○再開始
0039NAME IS NULL2007/12/14(金) 18:03:27ID:???
>>37
Windowsの管理者権限だけが必要だね
0040NAME IS NULL2007/12/15(土) 08:20:17ID:???
「今から HOGE.HOUR 時間前」 ってどう書けばいいですか?

CURRENT_TIMESTAMP - INTERVAL (HOGE.HOUR || ' hour')

と書いてみたが HOGE.HOUR で構文ネラーで撥ねられた。
0041NAME IS NULL2007/12/15(土) 10:02:09ID:???
CURRENT_TIMESTAMP - CAST(HOGE.HOUR || ' hour' AS INTERVAL)
CURRENT_TIMESTAMP - (HOGE.HOUR || ' hour')::INTERVAL
0042NAME IS NULL2007/12/15(土) 10:10:07ID:???
おお、でけた。
INTERVAL って前置演算子みたいなものかと思ってましたが、よく考えたら型でしたね。
ありがとうございました。
0043NAME IS NULL2007/12/15(土) 16:02:06ID:???
PostgreSQL の INHERIT (テーブル定義) って中では内部結合でやってるんですか?
0044NAME IS NULL2007/12/15(土) 21:07:52ID:???
Vistaに8.2.5が入らないと思ってたら、以下のページを見つけたのですが、
8.3ではインストーラの方でVista対応してくれるんでしょか?
http://www.iwahrt.com/iwahrt/ListProblemSolution.do?problemNo=185&categoryNo=13
0045NAME IS NULL2007/12/17(月) 08:59:44ID:VmIYEZ1r
postgresql(linux版)を自分のノートパソコンにいれて使ってます。
某国の株価データを入れているのですが、レコードが7000万件くらいに
なってしまいます。(今はずーっとinsertしつづけていて、5000万件を
越えたところ)。まだ全部入ってないので途中なのですが、
SELECT * from stock_data;
とすると、20分ほど頑張った後でメモリ不足で表示がされませんでした。
一件のレコードは、35個のデータから構成されてます。こういう状況で
上記のSQLとかがサクサク実行できるような方法はありませんか?
メモリは2GB積んでます。
今週終わりくらいに時間がとれるので、oracleとmysqlもためしてみようと
思ってるんですが、mysqlはさわったことないし、oracleはGUI経由
で操作するのを強制されるようなところが嫌で、、psqlとかでリモートから
色々できるのがいいので、できればpostgresqlでやりたいんですが。。
あと、ティックデータも入手できれば飛躍的にデータ量が増えそうなのですが、
postgresqlの実用的な範囲って、データ量どれくらいなのでしょうか?
色々質問ばかりですいません。

0046NAME IS NULL2007/12/17(月) 14:00:41ID:???
自分は詳しくないので、答えられませんが、
詳細環境も提示したほうが答えやすいかも。
少なくともPostgreSQLのバージョンは。
0047NAME IS NULL2007/12/17(月) 14:47:10ID:???
DB触り始めで大量データ扱うと、最初にぶつかるよなこれ。
SELECT文で条件指定しないで全取得すれば、データ全取得しようとするから
遅いし、(クライアントの)メモリが足りなくなるよね。

とりあえずは、条件設定したり、LIMIT OFFSET で件数絞ってやってごらん。
0048NAME IS NULL2007/12/17(月) 14:50:17ID:???
条件設定して件数が少なくても遅いなら、プライマリキーやインデックスがどうなってるかもチェック
0049NAME IS NULL2007/12/17(月) 16:18:17ID:???
>>47
サーバではなくクライアント側のメモリが足らなくなるというのがポイントですな。
クライアント側では、普通、何万件オーダーのSQLの返りを受け取れるようにはできていないので。
0050NAME IS NULL2007/12/17(月) 16:19:54ID:???
カーソルの使い方覚えて、例えば10万件ずつFETCHするような
クライアントプログラムを書けばいい。
http://www.postgresql.jp/document/current/html/sql-fetch.html
http://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor

あとは、年月毎や銘柄毎でテーブルのパーティショニングを行うとかかね。
常にデータ全体をスキャンする必要があるならあまり意味無いけど。
http://www.postgresql.jp/document/current/html/ddl-partitioning.html
0051NAME IS NULL2007/12/17(月) 17:00:25ID:???
まずはcout(*)でチェクしてから、
Limit とかoffset で抽出してみるのわ?
0052NAME IS NULL2007/12/17(月) 17:03:15ID:???
count(*) ですね。
これもインデックス無いとかなり時間かかると思う。
0053NAME IS NULL2007/12/17(月) 17:11:04ID:???
COUNT() ってインデックス関係あるんだっけ?
0054NAME IS NULL2007/12/17(月) 17:54:48ID:???
WHERE句入ってれば場合によっては
0055502007/12/17(月) 18:00:28ID:???
8.3では同期スキャンの副作用でSELECTの度に結果が変動するリスクがあるため、
ORDER BY を付けずに LIMIT, OFFSET を付けたSELECT文の実行を繰り返すと妙な事になるかもしれない。
http://journal.mycom.co.jp/special/2007/postgresql/005.html

全体のデータを取り出したいのであれば、
SELECT * FROM hoge ORDER BY idhoge LIMIT 10000 OFFSET $1; ($1には数字を入れる)
みたいなSQL文を複数回実行するより
SELECT * FROM hoge ORDER BY idhoge;
のカーソルを作ってFETCHを繰り返した方がレスポンスは良くなると思う。
(カーソルを使わないとSELECTの度にソートが行われてしまうかも?)
結果がソートされてる必要も無ければ、ORDER句も外せてさらに快適に。
0056NAME IS NULL2007/12/17(月) 18:15:11ID:???
大昔に DB2 調べてて、ORDER BY + FETCH FIRST n ROWS ONLY 使うと
n 件の行を取ってきた後にソートするという動きで金玉もげるかと思ったのを思い出した。
0057NAME IS NULL2007/12/17(月) 22:05:56ID:VmIYEZ1r
みなさんありがとうございます。
ようやくinsertが終了しました。
kabu=# SELECT count(*) from stock_data;
count
----------
73056656
(1 row)

主キーは、日時、会社コード1、会社コード2、の3つです。
会社コード別か、日時を範囲指定して、selectすることが多いと
思うので、それらにインデックスを設定しようかと思います。
(インデックスって勝手には設定されないですよね。)

あと、カーソルというのを調べてみます。存在すら知りませんでした。
テーブルを分けるというのは考えてみませんでしたが、上記のことを
やってみてダメだったら考えます。でもINSERTのやり直しは嫌だなあ。

それにしても、データだけでディスクをかなり占領するし、メモリ確保関係の
エラーにも何回も遭遇するし、大量データを扱うのは大変ですね。
これ以上データサイズが増えるととても扱いきれないと思いました。

あと、バージョンは、postgresql-8.2.4-27 となってました。
openSuSEのrpmのバージョンです。
ありがとうございました。

oracleとmysqlはやってみてあとで報告します。

0058NAME IS NULL2007/12/17(月) 22:11:07ID:???
>>57
ノートPCでメモリ2Gでクライアント&サーバをやって
> それにしても、データだけでディスクをかなり占領するし、メモリ確保関係の
> エラーにも何回も遭遇するし、大量データを扱うのは大変ですね。
ってそりゃあ、おいおいって感じだ。
0059NAME IS NULL2007/12/17(月) 22:16:00ID:???
零細がダイレクトメール用の情報扱ってるみたいな状況だな。
0060NAME IS NULL2007/12/17(月) 23:17:42ID:???
7300万件w
0061NAME IS NULL2007/12/18(火) 09:32:43ID:???
慣れればどうってことないけど、最初は少ない数でいろいろやったほうが
操作も覚えるしいいと思うがな
0062NAME IS NULL2007/12/18(火) 14:06:28ID:???
>>57
データベースシステムを図書館と司書さんに例えると、
----------------例え話----------------------------
お客(クライアント)は、司書さんに「○○の本を貸してください(SELECT * FROM xxx WHERE ○○)」と問合せをかける。
お客は問合せの結果をバッグに入れてユーザーの所まで持ってくるわけだ。

藻前さんが最初にやったのは、図書館の本全部を一気にバッグに入れて持ってこさせようとした。そりゃ無理だ罠。

だからこそ、「○○な本のうち、50音順で500冊目から100冊持ってきて」という様に要求を区切って出したり、
「○○な本全体で、△△という単語が何回出現するか数えてきて」と集計する要求を出したりするわけだ。

DBのテーブルを分類ごとの書架だとすると、
その書架でも本がすごく多いモノ(例えば小説とか)を一定単位(作者別とか)で仕切るのをパーティショニングという。
パーティショニングされていないと、司書さんは書架全体の中から探す事になり、時間が掛かる。

インデックスっていうのは、図書館の蔵書を管理するカードの様なもので、それを元に検索すると素早く検索できる。

いくら司書さんが、本の扱いに慣れていても、一瞬一瞬に扱う本は1冊づつで、
その時扱っている本(インデックス含む)を差す指がカーソルという事だ。
----------------例え話----------------------------

株価のデータベースで、過去も含めた全てのデータを集計もせずに取り出す場面が(バックアップ目的以外で)あるとも思えない。
バックアップ用途なら、ダンプを取れば良いし、集計クエリやら条件付けやらをして、取り出す件数を絞れば、
メモリ不足でクライアントが動かなくなる事態がそうそう頻発するとは思えない。

OlacleやらMySQLにデータを移すなら、共通に使えるクライアント(ODBC等)経由で、
PostgreSQLのテーブルからSELECT INTOとか使って一気に流し込んじゃう方が楽だ。
0063NAME IS NULL2007/12/18(火) 23:20:02ID:/fynqWlS
これかなーり便利だわ
http://pgfoundry.org/projects/ptop/
0064age2007/12/18(火) 23:53:42ID:???
よくわからないけど、自分には関係なさそう
0065NAME IS NULL2007/12/19(水) 00:45:26ID:kklpHsFG
>>63
パフォーマンスチューニングするのに使えそうね。

そういえば8.3の全文検索機能試してる人いる?
0066NAME IS NULL2007/12/19(水) 00:50:25ID:???
Ludia は試して… みたい
0067NAME IS NULL2007/12/19(水) 10:38:38ID:???
>>62
57じゃないが、勉強になったThx
0068NAME IS NULL2007/12/21(金) 03:10:15ID:fwC7Qy9u
JPUGの忘年会は盛り上がったの?
0069NAME IS NULL2007/12/21(金) 10:46:56ID:???
あー、昨日だっけ。
参加できたなー、申しこむんだった
0070NAME IS NULL2007/12/27(木) 00:25:14ID:???
v8.3はまだRCも出てないんだね
0071NAME IS NULL2007/12/27(木) 08:24:23ID:YLT4m45U
57です。
色々勉強になりました。(62の方とか)
ところでoracleとmysqlとの比較ですが、ノートではきついので
別のマシンでやることにしました。postgresqlへのinsertは終わったのですが、
mysqlとoracleへの移行で止まってます。

> OlacleやらMySQLにデータを移すなら、共通に使えるクライアント(ODBC等)経由で、
> PostgreSQLのテーブルからSELECT INTOとか使って一気に流し込んじゃう方が楽だ。
これについて、もう少し具体的におしえてもらえませんか?
一方のDBからselect * from tableとかでデータを読み込んで、それをselect into
で別のテーブルに流し込むんですよね?それはpsqlの中で行えますか?

上の内容が分からなかったので、postgresqlにダンプをsqlで出させて移行しようと
思ったのですが、(例えばmysqlについては、こんな感じ)
# pg_dump -d kabu > dump_file
# dump_fileを編集(テーブル一個の単純なDBなので、これは簡単そう)
# mysql -u root kabu < dump_file
これよりも速くできると思われるでしょうか?
0072NAME IS NULL2007/12/27(木) 10:49:45ID:???
スクリプト書いて両方にアクセスするって話でしょ?
psqlでDOBC使わないし。
ODBC使うツールでやってくれるやつもありそうだけど。

まあ実行可能ならdumpしたSQL食わせるのでいいと思うよ
0073NAME IS NULL2007/12/28(金) 07:27:58ID:???
>>71
> # pg_dump -d kabu > dump_file
> # dump_fileを編集(テーブル一個の単純なDBなので、これは簡単そう)
本当に編集が簡単と思っているのか?
7000万件INSERTした結果のdump_fileなんだぞ?
なんか最初から見てるけど、感覚がおかしい。
0074NAME IS NULL2007/12/28(金) 12:36:23ID:e6yBnBlw
>>73
テーブルが一個しかなくて、編集といっても、create tableと
insert 以外を削除するだけで、7000万件のinsertには触らなかったので、、、、
スクリプト(ruby)を書いてなんとかやりました。
いまmysqlのDBにinsert中です。
insertが始まってから3時間くらいですが、もう4000万件を突破しました。
select count(*) from table;
も速いし、とりあえずmysqlのほうが速そうな感触を持ちました。

ところで7000万件がDBとして多いのかどうかいまいち見当がつかないのですが、
株価のデータとしては仕方ないというか、みんなこれくらいのサイズになって
しまうと思うのですが、大体では、
3000(上場の会社数)×340(一年で市場が開いている日数)×80(データのある年の数)=81600000
になります。(実際には昔に行くほど会社数が少なくなる)
これはやはり、多すぎると考えるべきなのでしょうか?
それともDBの使い方がまずいのでしょうか?
0075NAME IS NULL2007/12/28(金) 12:42:12ID:???
>>74
少なくとも
> それともDBの使い方がまずいのでしょうか?
なんてことを書いているようなレベルの人には
> これはやはり、多すぎると考えるべきなのでしょうか?
多過ぎるかと。
0076NAME IS NULL2007/12/28(金) 12:48:55ID:???
>>74
抽出条件に対して適切にINDEX張ってれば
そんなに多いって訳でもないと思うが…
>>75の言うことももっともだと思う。
0077NAME IS NULL2007/12/28(金) 14:39:10ID:???
少ないデータで仕組みきっちり作ってから
大量データ流し込んでチューニング
0078NAME IS NULL2007/12/28(金) 21:26:08ID:???
>>71
いまさらだろうが、クライアントPCにMS-ACCESSと各DB用のODBCドライバをインスコして、
テーブル構造だけ先に作って、
INSERT INTO コピー先 (項目1,・・・,項目n) SELECT 項目1,・・・,項目n FROM コピー元;
とかやれば、変に編集する手間もなくコピれる。

藻前さんが何をやりたいのか今ひとつ理解できないが、
MySQL、Oracle、PostgreSQLのどれを選ぶかの目安を書いてみようと思う。
・ クライアントプラットフォームが多種多様になる場合
  → ストアードプロシージャによるビジネスロジックの共通化が有効
    → OracleかPostgreSQL
・ webなどクライアントが1種類のみで処理スピードの高速化が必要な場合
  → DB単体でのスピードを優先
    → MySQL
・ DB未経験でこれから色々なシステムを構築するための勉強の場合
  → ストアードプロシージャに慣れておく事は有効
    → OracleかPostgreSQL
って感じだと思われ。

OracleとPostgreSQLだが、仕事として見た場合、
・ 客の予算が少ない or 面倒事を自分でやってでも金が欲しい時はPostgreSQL
・ 客の予算がとても多い and (客がうるさい Or 忙しいので面倒事をサポセンに任せたい)時はOracle
・ 客の予算が少ない and (客がうるさい Or 忙しいので面倒事をサポセンに任せたい)時は仕事自体をお断りする
って感じだと思われ。
0079NAME IS NULL2007/12/29(土) 08:56:26ID:???
仕事自体お断りする権限がないときは辞めるしかないか・・・
0080NAME IS NULL2007/12/29(土) 10:08:24ID:???
>>79
作るだけ作って辞めるのもアリだなwww
ドキュメント? メンテナンス? シラネwww
0081NAME IS NULL2007/12/29(土) 20:30:37ID:???
>>79
お断り出来ないときは、見積でふっかけましょう。

メンドクサイ客で予算が少ない時は、見積次第で客をコントロールする事は可能です。
自社の営業がヘッポコな時はむずかしいですが、
自社の営業を接待漬けにするぐらいの勢いがあれば危機対応能力は向上すると思います。
0082NAME IS NULL2007/12/30(日) 22:50:01ID:???
見積もりで吹っかける→「いやーそれは高いでしょう」→見積もり減

見積もりするけんg(ry
0083NAME IS NULL2007/12/31(月) 02:37:49ID:???
そうですか この見積もりでだめだとしますと他をあたっていただく事になりますが。
0084NAME IS NULL2007/12/31(月) 13:18:59ID:???
つ〜か、最初から予算ありきで
「お前らの見積なんぞ知らんがな。とにかくこれだけの金で作れ。」
・・・ってところも多いがな。
0085NAME IS NULL2007/12/31(月) 17:03:38ID:n233Vr/g
8.3日本語版はいつでんの?
0086NAME IS NULL2008/01/02(水) 10:20:25ID:???
日本語版って何よ
0087NAME IS NULL2008/01/02(水) 14:47:49ID:???
すごいくだらないことかもしれなけど質問させてください。

ユーザーを管理するテーブルって何て名前にしてます?
user
はすでにあるみたいで使えないし
"user"
にすると、セレクトかける時も"user"にしなきゃならないし
tbl_user
とか接頭語や接尾語つけるのはあんまり好きじゃないし・・・
users
っていうのも考えたけど、なんでユーザーだけ複数なんだ?って感じだし

どうして、こんな一般的にみんな使いそうな名前を初期で入れてるだよ〜
他の名前にしてくれればいいのに
まあ、どうでもいいから好きなのつけろって言われそうだけど、皆さんどうしてます?
0088NAME IS NULL2008/01/02(水) 15:02:56ID:???
affiliate, associate, brother, comrade, constituent, fellow, joiner, member, sister
どうでもいいから好きなのつけろ
0089NAME IS NULL2008/01/02(水) 17:13:26ID:???
>>86
http://www.postgresql.jp/PostgreSQL?top
0090NAME IS NULL2008/01/03(木) 01:08:09ID:???
>>89
本体は日本語版も何も無いだろう
0091NAME IS NULL2008/01/03(木) 16:09:34ID:???
>>87
passwd
0092NAME IS NULL2008/01/03(木) 17:34:40ID:???
>>90
そもそも本体の話しはしてない禿
0093NAME IS NULL2008/01/05(土) 11:36:26ID:???
>>87
usertbl
0094NAME IS NULL2008/01/05(土) 12:38:26ID:???
Oracleと性能比較した資料てどこかにある?
0095NAME IS NULL2008/01/05(土) 12:58:23ID:???
>>94
そんな資料は出せないはず。Oracleが禁止してなかったっけ?
昔の話だから、今はどうか知らないけど。
0096NAME IS NULL2008/01/05(土) 20:22:55ID:???
データ型として配列を使っています。
配列の要素にNULLが存在する場合にマッチするクエリは、どのように記述するのか教えてください。

PostgreSQL 8.3beta4です。
0097NAME IS NULL2008/01/05(土) 20:45:32ID:Ible2iRH
http://click.j-a-net.jp/1006827/223692/
0098NAME IS NULL2008/01/06(日) 12:11:23ID:???
>> 96
自前で比較用の関数用意するしかないんじゃね。
ANYとIS NULLの組み合わせじゃダメだし。
0099NAME IS NULL2008/01/06(日) 20:18:51ID:???
>>98

ありがとうございます。次のテーブルに対して、
下記のクエリを作成することで対処しました。遅いですが。

create table tbl(pkey integer primary key, a integer[] not null);

select * from tbl t1 where exists(
select * from (select a,generate_series(array_lower(a,1),array_upper(a,1)) from tbl t2 where t1.pkey=t2.pkey) as t3(a,i) where a[i] is null
);
0100NAME IS NULL2008/01/07(月) 12:56:11ID:???
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050722/165140/?P=2

このページのConstraint Exclusionは、条件に合う部分だけ検索がかけれるということなのでしょうか?
実際に試してみたところ、テーブル内を全て検索するのと速度があまりかわらないような気がするのですが・・・

PostgreSQL 8.2.5です
0101NAME IS NULL2008/01/07(月) 23:12:54ID:???
2008-01-07 Cumulative Security Update Release (8.2.6, 8.1.11, 8.0.15, 7.4.19 and 7.3.21)
http://www.postgresql.org/about/news.905

PostgreSQL 8.3RC1 is out.
http://www.postgresql.org/ftp/source/v8.3RC1/
http://www.postgresql.org/ftp/binary/v8.3rc1/
0102NAME IS NULL2008/01/07(月) 23:19:12ID:???
っと、まだ8.3rc1はアナウンスされておらず勇み足だったらしい。すまぬ。
0103NAME IS NULL2008/01/08(火) 08:03:14ID:NK7MHFFt
今朝見たらアナウンスされてました。
しかし8.3は難産ですね。RCも1で終わってくれるのかな・・・?
0104NAME IS NULL2008/01/08(火) 08:52:18ID:???
http://www.postgresql.org/developer/beta
http://archives.postgresql.org/pgsql-announce/2008-01/index.php

8.3rc1のアナウンスはまだじゃない?と見てたら、pgAdminIII 1.8.1 が出てるね。

pgAdmin III v1.8.1 released
http://archives.postgresql.org/pgsql-announce/2008-01/msg00001.php
0105NAME IS NULL2008/01/08(火) 12:50:49ID:???
PostgreSQLに危険なセキュリティ・ホール,管理者はバージョンアップを
http://itpro.nikkeibp.co.jp/article/NEWS/20080108/290554/
0106NAME IS NULL2008/01/08(火) 23:54:49ID:???
PostgreSQLに脆弱性:バージョン7.3ブランチのサポート打ち切りに
http://builder.japan.zdnet.com/news/story/0,3800079086,20364378,00.htm

PostgreSQL 7.3ブランチが終了:8.2系へアップグレードを
http://builder.japan.zdnet.com/news/story/0,3800079086,20364391,00.htm

後者の記事は、Windows版バイナリとそれ以外のEOLの話をごっちゃにしているのが何とも。
0107NAME IS NULL2008/01/09(水) 03:56:47ID:???
Windows版 8.3 に期待してるのだけど
通常、PC-Unix 版に比べてどのくらい遅れてリリースされるのかな。
0108NAME IS NULL2008/01/09(水) 20:39:00ID:???
>>107
普通は遅れはほぼゼロ。
0109NAME IS NULL2008/01/10(木) 00:13:06ID:???
sequenceをデフォルトテーブルスペース以外に作成する方法はないんかいな?

マニュアル見ても、create/alter でテーブルスペース指定することはできないし、
serial型で自動作成されるsequenceも指定できないし。(テーブルが別テーブルスペースでもsequenceはデフォルト域になってしまう。)
最新の8.3でもだめそう。
だれかこの件について情報持ってないですか?

ちなみに、pg_classのテーブルスペース情報をupdateして、物理ファイルをmvしたら、なんとなく動いてるいるようには見える。が、さすがに本番では怖いのでやってない。
0110NAME IS NULL2008/01/10(木) 02:13:10ID:???
>>108
サンクス
0111NAME IS NULL2008/01/10(木) 02:13:20ID:???
>>109
そもそもSEQUENCEを別のテーブルスペースに作成する意味はあるの?
メリットが分からん。

あと、pg_classをUPDATEしなくても、移動した物理ファイルに対して、
ln でリンクを作ってやればいいんじゃない?
0112NAME IS NULL2008/01/10(木) 07:28:05ID:???
>> 109
設定パラメータ default_tablespace を変更してもダメ?

>> 111
> SEQUENCEを別のテーブルスペースに作成する意味はあるの?
誰しもそう思っているから、むしろ忘れられていたのかも。
機能としてはあってもかまわない気はする。
0113NAME IS NULL2008/01/10(木) 21:50:07ID:???
java+tomcatであるテーブルの列を50づつ表示するロジックを作ったとします。
まずはじめの0〜50は正常に表示されるのですが次の50を表示するを選択すると
50〜100までの表示ではなく50〜ラストまでの表示になってしますのです。
SQL文は次のようになっています"select * from -- where number > "+number+" and number <= "+number+50;
何か間違っていることがあれば指摘してください。お願いします。numberの変数はデバッグで意図した値な事を
確認しています。なおnumberはserialです。
0114NAME IS NULL2008/01/10(木) 21:53:18ID:???
>>113
知らんがな。実際に発行されているSQL文を0〜50と50〜100の時で
どうなってるか確認して、psqlで実行してみなよ。
0115NAME IS NULL2008/01/10(木) 22:22:12ID:???
LIMIT OFFSET のが簡単な気も
0116NAME IS NULL2008/01/10(木) 23:01:47ID:???
>>113
全然関係ないけど、実験の時でも普段から PreparedStatement 使うようにしとくといいぜ。
0117NAME IS NULL2008/01/11(金) 00:05:06ID:???
>>113
String + int + int って、((String + int) + int) って解釈されね?
n = 0 なら "number <= 050" で上限は 50 と解釈されるけど、
n = 50 だと "number <= 5050" になる気がするんだが。
「number <= " + (number+50)」と括弧を付ければ良いのでは。
0118NAME IS NULL2008/01/11(金) 00:14:40ID:???
同じ演算子の優先順位は左から右だから >>117 の通りだよ。

int n = 50;
System.out.println("select * from ... where number > " + n + " and number <= " + n + 50);

↓結果

select * from ... where number > 50 and number <= 5050

あと Statement は事故の元だから PreparedStatement 使え。
0119NAME IS NULL2008/01/11(金) 00:51:40ID:???
>>111
>>112
レスありがとうございます。

>>111
SEQUENCEを別のテーブルスペースに作成するメリットは、
テーブルを別のテーブルスペースに作成するメリットと同等と思ってます。
つまり、SEQUENCEのNextValを取得する際のI/O分散です。

>>112
default_tablespace を変更してから作成しても、だめなようです。

alter database db_hoge set defalult_tablespace = tablespace_hoge;
した上で、
crate table table_hoge( colume_hoge serial ) ;

したら、table_home は、tablespace_hoge 上に作成されますが、
colume_hoge の sequence は、oid = 0 の tablespace 上に作成されてます。
01201132008/01/11(金) 09:06:04ID:???
詳しい説明ありがとうございます。
01211132008/01/11(金) 09:08:10ID:???
が、numberはintです。
0122NAME IS NULL2008/01/11(金) 09:11:29ID:???
>>121
だからさぁ、PostgreSQL的にはそんなことどーでも良いんだよ。
サーバ側で処理したSQLをチェックしろ。
意図した通りのSQLになっていて、取得結果がおかしいなら
ここで質問するのはありだが、プログラムの間違い探しなら
よそでやれ。
01231132008/01/11(金) 09:29:57ID:???
失礼しました。>117様の言う通りでした。
0124NAME IS NULL2008/01/11(金) 11:14:28ID:???
"select * from -- where number > " や " and number <= " は文字列だからな。
しかしどれ使うにしても、ORDER BY つけないとな。

そして、実行するSQL文を吐き出してpsql等で確認するのは常に必須。
0125NAME IS NULL2008/01/11(金) 15:38:10ID:???
あらかじめ用意されたテーブルicmpを

create table d22t11(check(time < '2005-11-22 12:00:00' and time >= '2005-11-22 11:00:00)) inherits(icmp);

というように時系列で分割した後、constraint_exclusionパラメータをonにしてSELECT文かけてみたんですが、分割前と検索速度が変わっていません・・・。
もしかして分割してからデータを挿入しなければならないのでしょうか?
01261132008/01/11(金) 20:54:51ID:???
>124 なるほど〜order by という便利なソート機能があったんですね。
更新すると列が最後尾にくるので"どうしたもんか?"と思っていたところでした。
情報ありがとうございます。
0127NAME IS NULL2008/01/11(金) 21:42:42ID:???
>>119
> つまり、SEQUENCEのNextValを取得する際のI/O分散です。
それはさすがに意味ないと思う。千〜万単位で SEQUENCE 作るつもりでない限りは。
たいていはキャッシュに乗ってる。
バックアップなり信頼性目的ならば、ありうる状況かも。
0128NAME IS NULL2008/01/11(金) 23:34:41ID:???
>>127
今回の疑問は、そもそも、sequenceのテーブルスペース変更はできないのは何故なのか?
という好奇心的なものが発端でして、実質的に問題が発生しているわけではありませんけどね。
対応してないなら仕方ないですね。少し残念です。
0129NAME IS NULL2008/01/12(土) 01:08:46ID:???
>>125
それは、どう変わることが期待されてんの?
0130NAME IS NULL2008/01/12(土) 11:39:49ID:???
>> 125
timeを検索条件にした?
0131NAME IS NULL2008/01/12(土) 12:31:21ID:bIgQT3Xd
>>125

Aというテーブルが親なら、 A1 A2 A3 A4という子の
テーブルを継承で作成する。そんで、A1 A2といった子に
insert する。そうすると親のAに対してselect すると、子を見て
くれて、制約があれば関係ないのは除外するという仕組み。
0132NAME IS NULL2008/01/14(月) 19:14:38ID:???
質問です。
2つのテーブル、TABLE_A と TABLE_B があります。
両者のカラム構成は同じです。
現在、使用しているテーブルは TABLE_A です。TABLE_Bは使われていません。
TABLE_B にデータ列を挿入します。
その後、両者のテーブル名を入れ替える操作を次のようなSQLで行います。

BEGIN;
ALTER TABLE "TABLE_A" RENAME TO "TABLE_TMP";
ALTER TABLE "TABLE_B" RENAME TO "TABLE_A";
ALTER TABLE "TABLE_TMP" RENAME TO "TABLE_B";
COMMIT;

このように、テーブル名をスワップする際、データ量とかによっては、
TABLE_Aにアクセスできない時間が発生するのかどうかが疑問です。
(リネーム時に何かしらデータ量に応じた処理が行われますか?)

上記テーブルデータは、WEBサービスで使うデータで、
WEB上からユーザーがアクセスしてきた際に、呼び出されます。
アクセスのタイミングによっては、ユーザーには、空データが表示されてしまうのでしょうか?

よろしくお願いします。
0133NAME IS NULL2008/01/15(火) 01:04:38ID:???
>>132
> (リネーム時に何かしらデータ量に応じた処理が行われますか?)

行われない。
たぶんシステムカタログの一部が更新されるだけ。

> アクセスのタイミングによっては、ユーザーには、空データが表示されてしまうのでしょうか?

一瞬だけど TABLE_A が存在しないタイミングがあるから、
そのときのアクセスはエラーになる。
0134NAME IS NULL2008/01/15(火) 01:25:31ID:???
エラーじゃなくてテーブルロックの解除待ちじゃないかな。
他からTABLE_AとTABLE_Bを順次SELECTされた場合、
タイミングによっては片方のテーブルを2度読みしちゃう可能性があるけど。
01351332008/01/15(火) 02:02:36ID:???
>>134
ALTER 文が BEGIN, COMMIT で囲まれてるの見のがしてた。
ロック待ちだね。

> 他からTABLE_AとTABLE_Bを順次SELECTされた場合、
> タイミングによっては片方のテーブルを2度読みしちゃう可能性があるけど。

1トランザクションで ALTER 文を全部実行してるから、2度読みはないはず。
01361342008/01/15(火) 02:45:10ID:???
>>135
> 1トランザクションで ALTER 文を全部実行してるから、2度読みはないはず。

TABLE_Aを読み出して、TABLE_Bも読み出そうとしたら >>132が走ってロック待ち、
解除後TABLE_Bを読み込んだら、それはリネームされる前のTABLE_A。
0137NAME IS NULL2008/01/15(火) 07:53:27ID:???
>>136
最初に全部ロックを取ってしまうのはどうだろう。
BEGIN;
LOCK TABLE_A IN ACCESS EXCLUSIVE MODE;
LOCK TABLE_B IN ACCESS EXCLUSIVE MODE;
...
0138NAME IS NULL2008/01/15(火) 08:06:32ID:???
ていうかそういうのは読み込み側がトランザクション分離レベルやテーブルロックを適切に設定してないだけじゃん。
0139NAME IS NULL2008/01/15(火) 12:57:46ID:L9najbhe
※nextval(text)とcurrval(text)について
PHPからDBにアクセスしIDを表示するようなシステムを作っています

CREATE TABLE test_tbl (id SERIAL PRIMARY KEY,memo TEXT);
というテーブルがあり
idカラムの番号を表示で利用する場合
1)が正しい気がしますが2)でも大丈夫なきもします
1)と2)どちらがpostgres(DB)としては安全で正しい運用方法
なのか教えていただけないでしょうか?

1)IDを前もって取得し変数($id)に入れて使いまわす方法
SELECT NEXTVAL('test_tbl_id_seq');
BEGIN
INSERT INTO test_tbl(id,memo)VALUES($id,'AAAA');
COMMIT

2)IDを後から取得して使う方法
BEGIN
INSERT INTO test_tbl(memo)VALUES('AAAA');
COMMIT
SELECT CURRVAL('test_tbl_id_seq');
0140NAME IS NULL2008/01/15(火) 22:40:11ID:???
>>135
ふつう、DDLにトランザクションは効かないか発行時点でcommitされてしまうと思うが。

と思って調べてみたら、SQLServerはDDLもrollbackできるんだな。
0141NAME IS NULL2008/01/15(火) 22:43:09ID:???
DB2 でも普通にできるが。
0142NAME IS NULL2008/01/16(水) 00:22:19ID:???
>>136
両テーブルのSELECTも、トランザクションで実行するもんだと思うが。
0143NAME IS NULL2008/01/16(水) 00:55:16ID:???
>>139
どっちでも完全に一緒。お好みで。
PostgreSQLの方言でよければ RETURNING もアリ。
INSERT INTO test_tbl(memo) VALUES('AAA') RETURNING id;
0144NAME IS NULL2008/01/16(水) 01:13:31ID:13aLpW9J
>>133-138
>>140-142

ご回答ありがとうございます!
大変参考になりました!

ただ、考えてみれば、
テーブルデータ更新中のアクセスに対応するための方法だったので、
更新失敗によるデータ破損や、自前の例外処理を心配するぐらいなら、
最初から1テーブルで、データ更新 (COPYで行う) 自体をトランザクションで行う方が安全だと気づきました…。
で、シーケンスを更新する、と。

ただ、空データ表示時間があったとして、その機会損失損害額を考えると
どういう方法がベストなのか今でも分かりませんが…。

ああ、SEへの道は遠いなぁ…。

皆さん、どうもありがとうございました!
0145NAME IS NULL2008/01/17(木) 04:44:40ID:EaOIQdVo
Sun、MySQLを買収へ
http://www.itmedia.co.jp/enterprise/articles/0801/17/news005.html

Sun Microsystemsは、オープンソースのRDBMS「MySQL」を開発するMySQLを
総額約10億ドルで買収することを明らかにした。

 Sun Microsystemsは1月16日、オープンソースのRDBMS「MySQL」を開発する
MySQLを総額約10億ドルで買収することを明らかにした。
買収は3月末をめどに完了させる予定。MySQLはIPOを待たずして買収されることとなった。

 MySQLが自社サイトに開設しているブログに、同社のコミュニティ担当バイスプレジデント、
カイ・アーノ氏がその旨を伝えるエントリを投稿したのとほぼ同時期に、
Sunからも正式なプレスリリースが出されている。

 カイ氏はエントリの中で、「オープンソースをよく理解しているSunがMySQLを買収したことは、
MySQLコミュニティーにとっても有益なものになる」と述べている。

 一方、Sunのジョナサン・シュワルツCEOも自身のブログでこの件について言及、
MySQLの顧客に対して買収の完了を待つことなくサポートサービスの提供を開始する予定であると述べた。

 MySQLについては、過去にOracleが買収を試みたことが知られている。
今回Sunが買収したことで、OracleやMicrosoft、
IBMなどとデータベース市場で争うための基盤をSunは手に入れたことになる。
0146NAME IS NULL2008/01/17(木) 10:49:44ID:???
8.3で忌まわしきVACUUMが無くなるって話を聞いたんだが、これって公式にアナウンスされてる?
もしVACUUMが無くなるならば、ようやく使えるDBになるな
速度の問題だけじゃなくて、VACUUMの手間を避けたいがゆえにMySQLに行った人って多いでしょ
0147NAME IS NULL2008/01/17(木) 10:53:35ID:???
> 今回Sunが買収したことで、OracleやMicrosoft、
> IBMなどとデータベース市場で争うための基盤をSunは手に入れたことになる。

( ´д)ヒソ(´д`)ヒソ(д` )
0148NAME IS NULL2008/01/17(木) 12:27:46ID:???
バキュムはどっかでやってるだけでしょ。
てか普通に空いた時間でやってくれてると思うが、
そんなに面倒かな。
0149NAME IS NULL2008/01/17(木) 16:25:33ID:???
>>148
My SQL使いは Auto VACUUM の存在を知らない人が多いよ
というか、もはやPostgreSQLに目もくれないご様子で…
0150NAME IS NULL2008/01/17(木) 18:08:10ID:???
なんでMySQLの話題ばかりなんだよ。
というわけで
SRA OSS、PostgreSQL 8.2をベースにしたHAクラスタソリューション
ttp://enterprise.watch.impress.co.jp/cda/software/2008/01/16/12025.html
なんて話題を振ってみる。

HAクラスタソフトにはLifeKeeperを使っているとのこと。
0151NAME IS NULL2008/01/17(木) 18:41:57ID:???
>> 150

> ベースとなるPostgreSQLが8.2.5へバージョンアップ。

最近のセキュリティフィックス入ってないじゃん。
0152NAME IS NULL2008/01/17(木) 21:56:40ID:???
まぁデフォルトで autovacuum が on になるから、
「設定不要になった」と言っても嘘にはならないだろう。

「VACUUMが無くなる」という発想そのものは、何も分かっていない証拠。
Oracle で UNDO セグメントを無くせないとのいっしょ。
0153NAME IS NULL2008/01/17(木) 22:14:51ID:???
どうでもいいから日本postgresqlユーザ会、8.3の日本語版早く出してくれ。
0154jin2008/01/18(金) 11:18:11ID:EMckNTsF
Postgre for windowsのチューニングについて教えてください。
64bit版の機器で16GBのメモリをつんだ機器でポスグレをインストール
したのですが、Shared Memoryを1GB以上にするとポスグレが起動できません。
16GBつんでるのでメモリを最大限まで使用したいです。どうしたらいいので
しょうか。教えてください。
0155NAME IS NULL2008/01/18(金) 15:22:21ID:???
>>154
バージョンいくつ?バイナリは32ビット版だよね?
01561542008/01/18(金) 16:10:40ID:???
サーバー用にOS:VISTA PC買ったらPOSTGRESQLインスト出来ねえでやんの;
その時オワタおもた。
0157NAME IS NULL2008/01/18(金) 16:12:26ID:???
失礼。ミスた俺は>154じゃない。
0158NAME IS NULL2008/01/18(金) 23:01:42ID:???
Windows 用の 64bit バイナリってあったっけ?
少なくとも配布されているのは 32bit 版だけだったような…。
必ずしも shared_buffers にメモリを全部割り当てる必要は無いから
(OSがキャッシュに使ってくれる) 1GB で我慢しれ。
0159NAME IS NULL2008/01/20(日) 00:59:56ID:???
http://japan.cnet.com/blog/hosting/2008/01/17/entry_25004180/

> 最近利用が増えてきているPostgreSQLと比較しても、約2倍ほど
> 高速に動作します。

デマが流れてるぞ
0160NAME IS NULL2008/01/20(日) 01:42:32ID:rsAddFWz
>>159
だれだ さぁや って知ったかライター(インチキ)か。

posgreSQLにもMySQLにも迷惑だ。潰してやれ。
0161NAME IS NULL2008/01/20(日) 13:27:12ID:???
>>160
迷惑だと言えば、MySQLスレに出張して、
やたらとSunの買収について不安を煽っている人間がいたね。
大人げ無いから止めとくれ。>>152=>>158
0162NAME IS NULL2008/01/20(日) 14:33:36ID:???
ゼイタクギガサーバーがあまりにも贅沢すぎるw
0163NAME IS NULL2008/01/20(日) 17:00:55ID:???
postgreSQLはMYSQLと比べて便利すぎる。
0164NAME IS NULL2008/01/20(日) 22:18:45ID:???
MySQLは商用版も出てたし、業界再編の波に飲まれているのでは?
0165NAME IS NULL2008/01/20(日) 22:51:34ID:???
安定して使えりゃどっちでも良いよ
0166jin2008/01/21(月) 09:20:39ID:Q97Sm1d1
ver.はPostgreSQL 8.2.6です。確かに32bit版のようです。出来る限り16GB
のメモリを効率的に使用して処理速度をあげたいです。shared_buffers以外
にもどの部分のチューニングをすればいいのでしょうか。教えてください。
0167NAME IS NULL2008/01/21(月) 11:27:09ID:???
アナウンスがまだだけど、PostgreSQL 8.3 RC2。
http://packages.debian.org/source/sid/postgresql-8.3
0168初心者2008/01/21(月) 15:28:41ID:???
初心者です。

PostgreSQL のユーザ定義関数を使って和暦変換関数を作成したいのですが

IBMのICU4Cを使ってC++で和暦変換関数を作成しました

C++で作った和暦変換関数を組み込もうとしてるのですが、

C関数でないせいかうまくいきません。



誰か詳しい方教えてください。
0169NAME IS NULL2008/01/21(月) 16:48:37ID:???
C++で作ったって、外部向け関数だけをCリンケージでやったらいいんじゃないかな。
0170NAME IS NULL2008/01/21(月) 16:49:42ID:???
>>156
Vistaへのインストールはコツがいる。
ググってわからなかったらまたおいで。
0171NAME IS NULL2008/01/21(月) 18:42:22ID:???
>>168
まず、どのように「うまくいかない」のか書くべし。

postgres のヘッダで、typename や delete なんかの C++ のキーワードを
仮引数名として使っている箇所があったような気がする。
postgres と繋ぐ箇所だけを別のCソースで書くか、
include 前に #define typename typename_ で誤魔化すか。
0172初心者2008/01/21(月) 20:49:30ID:???
c++和暦関数
(cal_func.cpp)↓↓↓↓↓
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "unicode/smpdtfmt.h"
#include "japancal.h"
#include "cal_func.h"

char* cal_func(int year, int manth, int day){

/**** 略 ****/

return target;
}
(cal_func.cpp)↑↑↑↑↑



(wareki.c)↓↓↓↓↓
#include <stdio.h>
#include "postgres.h"
#include "fmgr.h"
#include "cal_func.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(wareki);
Datum
wareki(PG_FUNCTION_ARGS){
int32 year=PG_GETARG_INT32(0);
int32 manth=PG_GETARG_INT32(1);
int32 day=PG_GETARG_INT32(2);
char *t;
t=cal_func(year,manth,day);

text *new_t=(text *)palloc(VARSIZE(t));
VARATT_SIZEP(new_t)=VARSIZE(t);
memcpy(VARDATA(new_t),
VARDATA(t),
VARSIZE(t)-VARHDRSZ);
PG_RETURN_TEXT_P(t);
}
(wareki.c)↑↑↑↑↑


こんな感じで作ってるんですが、
どこがうまくいかないかというと
C側からcal_func()を呼び出して、C++側で西暦から和暦へ変換して
和暦に変換した文字列が返ってこないんです。

わかりにくい文章で申し訳ありませんがよろしくお願いします。
0173NAME IS NULL2008/01/21(月) 20:57:30ID:???
>>172
extern "C"とかで解決する問題?
0174NAME IS NULL2008/01/21(月) 21:40:42ID:???
ヘッダファイルで
#ifdef __cplusplus
extern "C" {
#endif

#include "postgres.h"
#include "fmgr.h"
char* cal_func(int year, int manth, int day);

#ifdef __cplusplus
}
#endif

ってしてるので、そこは大丈夫だと思うんですが。

一応CREATE FUNCTIONってでてるので関数は作成できてるみたいです。

たぶん問題はC++の和暦変換関数から文字列を参照渡しで渡す際にダメみたいです。
0175NAME IS NULL2008/01/21(月) 22:44:12ID:17f4QTHj
ハードディスクがあふれないようにテーブルの行数に制限つけろと言われた。
100年以上運用しても余裕があるっていう資料出したのに仕様に入れてきやがった…
cronで定期的にcount取って制限に達したら古いデータを削除しようと思うんだが、
これぐらいしか方法無いよねぇ?
0176NAME IS NULL2008/01/21(月) 22:46:04ID:???
>>175
トリガ使って都度チェックとか
0177NAME IS NULL2008/01/21(月) 22:47:59ID:???
>>176
insertのたびにcountって重くね?
0178NAME IS NULL2008/01/21(月) 22:51:51ID:???
>>177
どれくらいの行数を想定しているとか分からないから、知らんがな。
そんなこと言われても、方法を提示しただけです。
0179NAME IS NULL2008/01/22(火) 00:54:34ID:???
>>175
行数より実際のディスク容量を監視した方がよくないか?
デッドタプルみたいに、行数には現れないが容量喰うものはあるわけで。
0180NAME IS NULL2008/01/22(火) 10:10:05ID:tyWoTrKG
>>167
PostgreSQLの公式ページで正式にRC2が発表された模様
0181NAME IS NULL2008/01/22(火) 15:46:20ID:???
そういえば、8.3ってそもそもは昨年中にリリースするつもりじゃなかったっけ?
0182NAME IS NULL2008/01/22(火) 17:43:02ID:7/qXfoyh
00000_1
00000_2
11111_1

といったデータがあった場合、
group byを使って00000をまとめることはできないものでしょうか。
もしありましたらご教示いただけますと幸いです。
0183NAME IS NULL2008/01/22(火) 18:27:56ID:???
GROUP BY SUBSTR(str, 0, 6) とか?
0184NAME IS NULL2008/01/22(火) 22:42:35ID:???
>>179
仕様で行数って書いてあるんだから気にしない
0185NAME IS NULL2008/01/22(火) 23:05:16ID:???
>>172
char *t に対して VARSIZE(t) しているのが間違い。
DirectFunctionCall1(textin) でもしておけ。
0186NAME IS NULL2008/01/23(水) 14:04:34ID:???
>>175
ちょっとトリッキーな方法かもしれんけど…

・serial型の列を作成して、それを主キーにする。
・自動的に作成されるシーケンスにMAX値とCYCLEを指定する。(MAX値は最大行数)
・主キーが重複したら削除するBEFORE INSERTのトリガーを作成する。
・取り出すときはINSERT時間でも入れといて、ソートする。
0187初心者2008/01/23(水) 23:52:29ID:???
>>185
何度もすみません。

どんな感じでDirectFunctionCall1(textin)を使えばいいのですか?

DirectFunctionCall1(textin,CStringGetDatum(t));

みたいな使い方でいいんですか?

教えてください。
0188NAME IS NULL2008/01/24(木) 08:04:47ID:???
>>187
「DirectFunctionCall1(textin」でウェブを検索なり、Postgresのソースコードをgrepなりしてみなさい。
もし前例があれば、正しい使い方だと判断すればいい。
自分で考えるのを放棄して教えを請うのは「初心者」だからといって許されない。
0189NAME IS NULL2008/01/24(木) 11:20:06ID:???
自分で調べたり考えたりググったりしない人間は、
DBやらプログラミングやらには激しく向いてない気がしてならない今日この頃
0190NAME IS NULL2008/01/24(木) 14:02:21ID:???
何にも向いていない。
てかあるレベルで止まる。
0191NAME IS NULL2008/01/24(木) 17:17:30ID:???
pg_dumpしようとすると
pg_dump: query to get table columns failed: ERROR: kind mismatch between backends
といったエラーが発生するのですが、pg_dumpを使わずにとりあえず
バックアップできる方法があればご教示願います。

権限は一つのDBに対して与えられているだけで、postgres権限はありません。
0192NAME IS NULL2008/01/24(木) 17:29:35ID:???
>>191
pgpool使ってる?
0193NAME IS NULL2008/01/24(木) 17:52:08ID:???
>>192
はい、使ってます。
色々調べてみましたところ、oid等が2台のサーバでずれている
可能性があるみたいですが、ユーザ権限では今のところどうし
ようもないという結論に至ってます。

せめて定期的にバックアップだけはとっておきたいと書き
込ませていただきました。
0194NAME IS NULL2008/01/25(金) 07:15:51ID:???
pgpool経由じゃなくて、直接PostgreSQLにpg_dumpすればOK。
0195NAME IS NULL2008/01/25(金) 15:47:09ID:???
>>194
アドバイス感謝です。

pgpool経由ではないようにpg_dumpすると言うことは、
各種DBサーバへ入って直接pg_dumpを行うという認識
で宜しいでしょうか。

/usr/bin/pg_dump -h 127.0.0.1 DB > backup.db

DBサーバへログインし、上記で試してみましたが、
やはりどちらからやっても同じエラーが出てしまい
ました。
大変恐れ入りますが、ご教示いただけますと幸いです。
0196NAME IS NULL2008/01/25(金) 16:07:47ID:???
pgpoolへのポートじゃなくて、pgpoolが使ってるPostgreSQLへのポートを指定するのよ
0197NAME IS NULL2008/01/25(金) 16:11:05ID:???
>>195
同じエラーって、それpgpoolに繋がってるんじゃ?
そのエラーメッセージはpgpoolが出してるんだけど。
違うポート番号で立ち上げてるんじゃないの?
0198NAME IS NULL2008/01/25(金) 19:58:28ID:???
>>196-197

PostgreSQL指定ポートというものがわからなかったため、
とりあえず5433で以下実行しましたらいきましたので
取り急ぎご連絡させていただきます。

/usr/bin/pg_dump -h 接続IP DB -p 5433 > backup.db

本当に有難うございます。
また何かありましたら報告させていただきます。
0199NAME IS NULL2008/01/25(金) 23:03:32ID:???
この辺は身体でわかってないと、無理だね。
一歩ずつね。
0200NAME IS NULL2008/01/27(日) 00:48:13ID:???
便乗質問だけど、pg_poolってデフォルトでは5432
ポートで動いているんですか?
>>198は5433でPostgreSQLへ繋いでるみたいだけど。
0201NAME IS NULL2008/01/27(日) 00:53:29ID:???
>>200
そりゃあ、クライアント側の設定はそのままでいけるように、pgpoolは5432でしょう。
0202NAME IS NULL2008/01/27(日) 10:17:02ID:???
+1するのはセキュリチやラッパでよくあるね。
おらくるでは1522とかw
0203NAME IS NULL2008/01/28(月) 11:26:23ID:SakCgkQ0
initlocationってなくなっちゃったの?
0204NAME IS NULL2008/01/28(月) 14:16:08ID:qNEN3OcM
横からすみません

私はpgpoolじゃなくslony1使ってるんですが、
8.1でpg_dumpしたデータを8.2にリストアするとプロセスが落ちてしまいます。

落ちるのは毎回決まった場所で、
リストア中に「SET」という表示が出るあたりで処理が固まってしまいます。
何か心あたりある方いないでしょうか。
0205NAME IS NULL2008/01/28(月) 15:13:14ID:???
漢字使ってる?
02062042008/01/28(月) 15:19:51ID:qNEN3OcM
>>205

私ですか?
使ってます。

ちなみにpg_dumpのとき文字コードは何も指定してません
-Eつけずに実行しました
0207NAME IS NULL2008/01/28(月) 16:07:48ID:???
んー、Slony-Iの無い8.2に入れて、そこからまたdumpするとか。
8.2は文字コード厳しいんだよねえ、8.1と比べると。
0208NAME IS NULL2008/02/03(日) 01:46:04ID:JW+WwUKE
SELECT * FROM table1 WHERE XXX...
という条件で table1 のレコードを絞り込んでいます。
このとき、この条件で絞り込んだレコードに flag=0 カラムを追加して
SELECT *, 0 AS flag FROM table1 WHERE XXX...
とし、それ以外のレコードに flag=1 カラムを追加して
SELECT *, 1 AS flag FROM table1 WHERE XXXじゃない条件...
とし、それを UNION するにはどうしたらよいでしょうか?
0209NAME IS NULL2008/02/03(日) 08:57:15ID:???
>>208
UNIONだろw
UNIONじゃなくてもCASEで1,2を分けてもいいかな。
0210NAME IS NULL2008/02/03(日) 11:39:03ID:???
SELECT *, CASE WHEN XXX THEN 0 ELSE 1 END AS flag FROM table1;
0211NAME IS NULL2008/02/04(月) 09:32:31ID:htIE4kq7
PostgreSQL 8.3.0
0212NAME IS NULL2008/02/04(月) 11:05:26ID:kJ2XdWCk
>>207
とりあえずやってみます

ただ、気になるのが2点ありまして・・・

1つ目はリストアしてるとき
「SET」ってレスポンスが出た直後に固まるところ。

2つ目はOIDが何とかってログ。
以下のログが出てるんですが・・・
-oのオプションとかいるんですかね?

server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
connection to server was lost
LOG: server process (PID 541) was terminated by signal 11
LOG: terminating any other active server processes
LOG: all server processes terminated; reinitializing
LOG: database system was interrupted at 2008-01-23 21:41:45 JST
LOG: checkpoint record is at 0/487008
LOG: redo record is at 0/487008; undo record is at 0/0; shutdown FALSE
LOG: next transaction ID: 0/597; next OID: 24576
LOG: next MultiXactId: 1; next MultiXactOffset: 0
LOG: database system was not properly shut down; automatic recovery in progress
LOG: redo starts at 0/487058
LOG: record with zero length at 0/70F1A8
LOG: redo done at 0/70F178
LOG: database system is ready
0213NAME IS NULL2008/02/04(月) 15:44:34ID:???
>>211
2008/02/01にダウンロードできるようになってるけど、
トップ更新もまだだしリリースノートもまだだねぇー。
最終チェック中?
0214NAME IS NULL2008/02/04(月) 20:40:02ID:q5dGF2Ty
記念あげ
0215NAME IS NULL2008/02/04(月) 23:18:37ID:???
ttp://www.postgresql.org/about/news.918
0216NAME IS NULL2008/02/05(火) 11:43:01ID:???
pgAdmin�Vでリストアするときに

pg_restore: creating PROCEDURAL LANGUAGE plpgsql
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 283; 2612 16386 PROCEDURAL LANGUAGE plpgsql postgres
pg_restore: [archiver (db)] could not execute query: ERROR: language "plpgsql" already exists
Command was:

というエラーが出るんですけど解決方法ご存知の方いらっしゃいませんか?

エラー出てもリストアはうまくいっているようです。
ネットで調べたところ「手続き言語plpgsqlは削除しておくこと」という文言を見つけたのですが
手順がわかりません。

どうかご教授の程を。
0217NAME IS NULL2008/02/05(火) 17:31:00ID:???
pgadminはバグが多いので、PostgreSQL本体の付属品ではなく、
単品の最新版をインストールすべき。それでもやっぱりある程度の
大きさのSQL流し込むとやっぱりダメなことが多いけど。

ってことで、大きなSQLを叩き込む場合は、素直にコマンドラインの
psqlを使ったほうがいい。
0218NAME IS NULL2008/02/05(火) 20:14:12ID:???
8.3キターー
0219NAME IS NULL2008/02/05(火) 20:36:09ID:z0f3Z9+p
すいません質問があるんですけど・・・

重複したデータを削除したいのですが記述の仕方がわかりません..
条件が非常に縛られているので削除方法がわからないんです...

このようなデータベース
↓
○テーブル名:main1
・カラム:id, name
○テーブル名:main2
・カラム:id, info
○テーブル名:relation
・カラム:id, main1_id, main2_id, point

以上のような3つのデータベースを作りました.
relationはmain1とmain2の関連テーブルになっています.

ここで問題が起きたのですが,relationにはmain1とmain2のidを結びつけたインスタンスが
登録されています.
なのでmain1とmain2のidの組み合わせが重複することはないのですが,なぜか
存在してしまいました.
つまり,main1とmain2のidが等しいデータが違うidで存在しています.

この重複部分を削除したいのですがわからないのでカキコしました.
消すデータは後ろのidの方のデータを消したいと思っています.

このrelationのデータ数が非常に多いので,手動では時間がかかりすぎるのでSQLで解決したいんです!
どなたか教えてくれませんか??

一度,重複しているidをすべて1度selectしてからdeleteしても全然おkです.
0220NAME IS NULL2008/02/05(火) 20:55:50ID:???
>>219

truncate main1;
truncate main2;
truncate relation;

でいいよ。重複部分もちゃんと削除される。

0221NAME IS NULL2008/02/05(火) 21:03:53ID:gyamhWYh
TRUNCATE -- 1テーブルまたはテーブル群を空にする

ただでさえ人少ないのにさらに減らすようなことやめようよ。
0222NAME IS NULL2008/02/05(火) 21:32:15ID:???
>>219 重複が合った場合は relation.id の最小のものを残す
DELETE FROM relation WHERE id NOT IN (SELECT min(id) FROM relation GROUP BY main1_id, main2_id);

もっと効率の良い方法があるかもしれない。
0223NAME IS NULL2008/02/05(火) 23:51:47ID:???
>>221

重複部分「も」ちゃんと削除される
というのは正しいでしょ。やっぱりダメか(笑)

>>222 を参考にするとこんな感じでも書けるのかなぁ。
試してないけど。

create function delete_dup() returns int as $$
declare
r record;
begin
for r in select min(id) as min_id from relation
where main1_id = main2_id
group by (main1_id, main2_id)
loop
delete from relation where id <> min_id and main1_id = main2_id;
end loop;
end;
$$
language 'plpgsql';

select delete_dup();



0224NAME IS NULL2008/02/05(火) 23:52:26ID:???
>>223

あ。最後に return 0; とか書いておいてね。
0225NAME IS NULL2008/02/06(水) 07:54:42ID:???
>>223 むしろ遅くなるぞ。
>>222 がどういう実行プランに落ちるか、イメージできているのか?
relation へ SeqScan 1回で済むような方式でなければ、222を超えられない。
0226NAME IS NULL2008/02/06(水) 09:03:43ID:???
>>225

indexがあるかどうかもわからないのに、どちらとも言えないでしょ。
0227NAME IS NULL2008/02/06(水) 10:19:10ID:???
>219 8.2の初期バージョンはリストアしても完了にならないバグがあるから
何度もok選択するとデータがダブって入る。
0228NAME IS NULL2008/02/07(木) 00:43:43ID:cSQE2+AL
今までAccessとSQL Serverしかさわったことがなく、
はじめてPostgreSQLを phpPgAdmin でさわっているんですが、
Accessでいうリレーションの設定は、外部キーの追加 にあたるのでしょうか?
また、リレーション図の作成といった機能、または外部ツールなど
ありましたら教えてください。
よろしくお願いします。
0229NAME IS NULL2008/02/07(木) 00:56:30ID:???
リレーションはSQL文発行するときに毎回作成するんだよ
リレーション図作るならACCESSからODBCでテーブルリンクしてやっちゃった方が手っ取り早いと思う
02302282008/02/07(木) 01:04:32ID:???
さっそくのレスありがとうございます。
なるほど、そういう手がありましたか >ACCESSからODBCでテーブルリンク
リレーションについてですが、すみません、おそらく
自分が言いたかったのは、参照整合性のことだと思います。
それはやはり外部キーのことでしょうか?
0231NAME IS NULL2008/02/07(木) 07:36:05ID:???
>>230
YES. 参照整合性 = 外部キー制約
http://www.techscore.com/tech/sql/03_04.html
>>229
リレーションって単にテーブルの意味で使うような。
0232NAME IS NULL2008/02/07(木) 12:10:58ID:Zq40oyH1
SQLサーバーとアクセスで、年商100億以下の企業のシステムが組めるそうです。まさに、オフコンキラー・エンドユーザーキラーです。
02332282008/02/07(木) 23:12:53ID:???
>>231
ありがとうございました!
ようやく分かってきました
0234NAME IS NULL2008/02/08(金) 15:50:41ID:HqMhws4W
バージョン:8.3
costとactual timeを比較しながらSQLチューニング
を行っています。

そこで質問なのですが、「costが激減したがactual timeが早くならないという」
現象は普通起きるのでしょうか?
もし起きたとすれば、それはDBサーバの処理能力が低いことが
原因と考えても宜しいでしょうか?

宜しくお願いします。
0235NAME IS NULL2008/02/08(金) 20:28:16ID:???
どのDBでもそうだけど、コストっていうのは
こうしてそうしてああすればこうなるっていうのを数字にしたようなものなので
それを改善すれば必ず速くなるというものではない。

CostっていうのはSQL文の中のボトルネックを探すのに使うとよいと思う。
0236NAME IS NULL2008/02/09(土) 15:38:14ID:Mdw0byD5
助けてください。

8.2.3です。

Debian上で動作しているPostgreSQLサーバの管理をすることになりました。
このDBは社内システム用に使っています。

これまでほとんど管理されてなかったサーバなので、まず色々調査しなければなりません。
しかし前任者が先日、事故で死亡してしまい、情報がありません。
ログインアカウントは現在、メモなどを探しているところなので、まだサーバに入れていません。
私はこれまで、単なるPGをしていたのでDBの管理なんて何をしたら良いのか分かりません。

まずは何をしたら良いのでしょうか?
HDDの容量見たり、topで確認したりはするつもりです。
バックアップがどうなっているかも調べるつもりです。
それと、バキュームしないとまずいよね、と聞いたので、まずはそれをするつもりですが、
他にすることはありますか?
0237NAME IS NULL2008/02/09(土) 15:50:23ID:???
止める時間と別マシンがあったら、鯖からHDDすっこぬいて別のマシンにつなぎ、別マシンのルート権限で
旧マシンの/etc/passwd の周り書き換えるなり移植するなり。
つーか全部ここで言うことじゃねえや。
02382362008/02/09(土) 16:03:22ID:???
>>237
アドバイスありがとうございます。
アカウントが見つからなければその方法で試してみます。
なるべく止めたくないので、もう少し頑張ります。
0239NAME IS NULL2008/02/09(土) 18:49:46ID:???
>>236
アカウントやパスワードは、
使用しているアプリケーションのソースを見たら検討つくのでは?
ログインのソースとか。
あと日次や月次などバッチ処理などが深夜などに、
別途、稼動しているかどうかも確認したほうがいいでしょう。
バキュームやバックアップもバッチで自動で行っているかもしれないでしょうし。
02402342008/02/10(日) 00:32:05ID:???
>>235
ありがとうございます。
必ず速くなるものではないんですね…勉強になりました!
0241NAME IS NULL2008/02/10(日) 09:35:21ID:???
ぱっと思いつくだけでも

rootになって全ユーザのcrontabチェックしてバックアップとバキュームしてないか確認。
ついでに、バッチでDBアクセスがないか確認。(時間も控えとく)
DBの設定みてオートバキュームしてないか確認。
リモートから接続許可してる場合、許可してるマシンからもバックアップ、バキュームしてないか確認。
資料探しまくって手動cronがないか確認。(○曜日に出社したらなにかするとか)
クライアントの利用時間帯やらをヒアリング。

わかったことは全部ドキュメントに残す。
02422362008/02/10(日) 14:04:58ID:???
>>239
あ、たしかにアプリケーションのソースを見れば分りますね。
会社に行ったら確かめてみます。

>>241
手動cronは私の発想からは出てきませんでした。
ありがとうございます!
0243NAME IS NULL2008/02/11(月) 20:33:23ID:???
PHPやってて
GETで持ってきた引数をデコードした文字列を問い合わせ文のWHEREの条件に入れるとうまくいかないんですがどうしてでしょうか?

アドバイスよろしくお願いします
0244NAME IS NULL2008/02/11(月) 20:47:25ID:???
相手に伝える言葉の使い方が分かっていないから
0245NAME IS NULL2008/02/11(月) 22:26:20ID:???
SQL文を勉強しましょう
SQL文を検証しましょう
二行ですむな
0246NAME IS NULL2008/02/12(火) 05:35:17ID:???
>>243
シングルクオートの処理が間違ってるんじゃないか?
0247NAME IS NULL2008/02/12(火) 15:24:22ID:???
MLのインストールの話題だけど普通は自前コンパイルなのか?
CentoOSな俺は ttp://yum.pgsqlrpms.org/howtoyum.php で入れてる
0248NAME IS NULL2008/02/14(木) 01:27:38ID:???
Solarisだから普通にビルドしてるなあ
最近も64ビットでビルドするからなおさら
02492042008/02/15(金) 00:03:26ID:???
とりあえず報告を。
バージョンアップうまくいきました。
原因はSlony-�Tでした。
207さんの言ってたことに近かったんでしょうか。

Slony1をアンインストールして、
その後pg_dumpallでバックアップ取る
8.2をインストールしてリストアしてから
再度Slony1をインストールとやって動かせました。

バージョンアップと冗長化一緒にやるのって
えらいめんどくさいものなんですね。。。
0250NAME IS NULL2008/02/15(金) 10:24:41ID:???
BOOL型をINT型に変換するような関数はありませんか?
0251NAME IS NULL2008/02/15(金) 14:05:07ID:???
どういう状況で使うか分からんが、case文でやっちゃってみてはどうか
0252NAME IS NULL2008/02/15(金) 20:38:59ID:???
単にキャストすれば?
=# SELECT true::integer, false::integer;
int4 | int4
------+------
1 | 0
0253NAME IS NULL2008/02/18(月) 10:36:27ID:lPcRZOP6
2回レコード全体を検索するのは無駄なので、count(*) でレコードを数えるのとレコードのデータ取得を同時にやる方法ってないでしょうか
PostgreSQLは8.2.6、PHP5.2.4から操作しています
なるべくDB側の機能を使って対処したいです
0254NAME IS NULL2008/02/18(月) 12:34:23ID:???
>>253
pg_numrowsでは駄目?
0255NAME IS NULL2008/02/18(月) 12:53:54ID:???
>>254
それだとoffset limitで指定した区間のレコード数しか出ないので
全件中○〜○という風に表示するために総レコード数を数えたいのです
あとPDOでやってます
0256NAME IS NULL2008/02/18(月) 22:28:09ID:???
>>255

PDOだったらこれでどうよ

$offset = 0;
$limit = 10;

$sql = "SELECT * FROM hogehoge ORDER BY foobar";
$st = $conn->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$st->execute();
echo $st->rowCount() . " rows.\n"; // 件数
$i = $offset;
while($i<$offset+$limit && $row = $st->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_ABS, $i)) {
$i++;
// 処理
}
0257NAME IS NULL2008/02/18(月) 22:55:50ID:???
>>255
よくわからないけど、こんな感じとか?

select
code as コード,
hinmei as 品名,
(
select
count(code)
from syohin
) as 総数
from syohin
where
code=1
0258NAME IS NULL2008/02/18(月) 23:08:14ID:???
offset と limit を使用するなら、こんな感じ?

select
code as コード,
hinmei as 品名,
(select count(code) from syohin) as 総数
from syohin
order by cocd
offset 0
limit 10
0259NAME IS NULL2008/02/18(月) 23:10:13ID:???
>>258
誤字訂正
×order by cocd
○order by code

offset と limit を使用するなら、こんな感じ?

select
code as コード,
hinmei as 品名,
(select count(code) from syohin) as 総数
from syohin
order by code
offset 0
limit 10
0260NAME IS NULL2008/02/19(火) 11:54:27ID:???
>>259
それでいいのですが、whereでの条件が多くなると遅くならないのですか?
検索結果をキャッシュとかしてるのだったら問題ないのですが
0261NAME IS NULL2008/02/19(火) 13:04:45ID:???
>>260
心配だったら検索結果をtemporary tableにでもキャッシュしてみたら?
0262NAME IS NULL2008/02/20(水) 04:24:26ID:???
>>260
詳しくないので、遅いかどうかはわかりませんが、
1つのテーブルで100万レコードからの抽出だと、
1秒ちょっとで、抽出できます。
02632532008/02/20(水) 14:03:53ID:???
気にするほどの付加増ではないようなのでサブクエリでやってみます
temporary tableとの比較もそのうちやってみたいと思います
ありがとうございました
0264NAME IS NULL2008/02/21(木) 06:15:23ID:???
vacuum verbose analyzeで出力されるログをjdbcで取得する方法はありますか?
javaプログラムからvacuum実行して結果を管理画面とかで確認したいのですが。

postgres.confでinfoログも出力するように設定してログファイルを
見に行かないと駄目?
0265NAME IS NULL2008/02/21(木) 10:31:42ID:???
BOOLをINTに変換する関数はありませんか?
TRUE→1
FALSE→0

MySQLではBOOL+BOOLでINT型に自動変換されますが、PgSQLでは変換されません
0266NAME IS NULL2008/02/21(木) 11:43:35ID:???
>>265
>>250-252じゃいかんのか?
0267NAME IS NULL2008/02/21(木) 11:44:18ID:???
case文使うか関数作る方が調べるより早いと思う。
02682652008/02/21(木) 11:49:28ID:???
うお、ちょっと前に同じような質問がっ!
ありがとうです
0269NAME IS NULL2008/02/21(木) 22:49:06ID:???
> MySQLではBOOL+BOOLでINT型に自動変換
キモすぎる…
0270NAME IS NULL2008/02/22(金) 00:43:47ID:???
VBとCを両方やったのでFA:LSEが0か‐1か今一得心が行くことがないのでcase文で対処
0271NAME IS NULL2008/02/25(月) 09:33:31ID:???
1000万件ほどのある行から全文検索を行いたいんだけど何かお勧めない?
`tbl1` || `tbl2` || 'tbl2' … `tbl10` LIKE '%検索ワード%' とかだと、検索結果まで数秒〜数十秒まで時間がかかってしまうことがあります。
0272NAME IS NULL2008/02/25(月) 15:49:29ID:???
単一テーブルでLIKE '%検索ワード%'ならもうどうしようもないんじゃないかな。
Oracle+Times10にするとか、そこだけ全部メモリに持つかしないと。

つかうちだと500万件のテーブルをselect count(1)するだけで70〜90秒くらい
かかるんだけど、1000万件でそれなら優秀なんじゃない?

ちなみにshared_buffer増やしても、検索したoidに対応するレコードがキャッシュに
あったら引っ張ってくるだけで、select countには意味ないんだよね?
0273NAME IS NULL2008/02/25(月) 16:40:51ID:???
>>271
tsearch2というのがあるらしい。
0274NAME IS NULL2008/02/25(月) 22:18:39ID:???
googleのアプライアンスサーバでも導入するほうがよいんでは?
0275NAME IS NULL2008/02/26(火) 04:10:08ID:???
プログラムロジックを介さず、DBのみで…というのが適切な表現かどうかはわかりませんが、
PostgreSQLで、1対2とか、1対多関係のうち1対nのnを限定して表現する事は可能ですか?
また可能でしたら是非その手法をご教示頂きたいと思います。よろしくお願いします。

例えばサッカーや野球の試合は必ず2チーム間で行われますが、
試合{試合ID, 一方のチームID, 他方のチームID }
と1テーブルで冗長化した表現でなく、
試合{試合ID} <1-2> カード{試合ID, チームID}
みたく正規化した表現を使いたいのですが...
やっぱり冗長化表現が一般的なんでしょうか?

と、ここまで書いてるうちに今回必要な1-2に限定して思いついたんですが、
カードテーブルにbooleanみたいな2値のカラムを新たに設けて、そのカラムと試合IDの組を
uniqueというかPKにすればなんとかなるかなと…
booleanだとアレなのでenumにすれば、他の1-nもenumの定義によって制限できる…かな。
いやでもこれだと1-(n-m)も許容しちゃうかな…

というのはさておき、何かもっとスマートな手法があれば…何卒ご教示お願いします。
0276NAME IS NULL2008/02/26(火) 07:37:02ID:???
>>275 nを厳密にしたい目的はなに?
表現の曖昧さを避けるだけなら、冗長化した形で CHECK(一方のチームID < 他方のチームID) とか。
チームIDで検索したいだけなら GIN 使う手もあるし。
0277NAME IS NULL2008/02/26(火) 08:35:01ID:???
>>275
チームIDはチーム情報のマスターに格納してあるんでしょ?
0278NAME IS NULL2008/02/26(火) 14:54:48ID:???
>>276
まさに、その何かの試合に関するテーブルを作ろうと思ってまして、
その際必ず試合1に対してチームが2になります。

カードを外に出したいのは、集計のためだったりします。
あるチームを基点に試合を検索する場合、一方か他方かがそのチームで、
検索されたデータからもあるチーム以外のチームを見つけなきゃいけない、
というのが面倒な気がしました。
一方外に出しておけば、おそらくクエリだけでなんとかなります。

検査制約とか配列を使うのはアリかもしれません。
ありがとうございます。


>>277
明示しませんでしたが、チームIDはチームテーブルのPKです。
0279NAME IS NULL2008/02/26(火) 14:57:34ID:???
>>278
サッカーなんて単語が出てたから、PKってそっちの方かと思ってたよ。
いや、なにやらごちゃごちゃ書いてあったから詳しくは読んでないんだけどね。
0280NAME IS NULL2008/02/26(火) 15:32:19ID:???
ソフトのロジックが複雑でも、
テーブル設計は、標準的でシンプルなほうがいいかもね。
メンテなどしやすい方が便利な事が多い。
0281NAME IS NULL2008/02/26(火) 21:47:49ID:???
>>271
>>273
tsearch2よりはludiaの方がいいんじゃないか。
tsearch2は形態素解析。ludiaはN-gram。
形態素解析だとLIKE %% と違った結果になるぞ。
0282NAME IS NULL2008/02/26(火) 23:00:26ID:???
LIKEやN-gramなら漏れが無いってわけでもないので、
割り切れるならば形態素解析も使いどころはある。適材適所で。
0283NAME IS NULL2008/02/26(火) 23:54:36ID:???
WEBプログラミング板でこちらで聞いてくれと教えていただいたので質問です。

自分は初めてPostgresに触るド素人です。
Postgres8.2.5を使ってDBを作ろうとしてます。OSはLinuxです。
データベースにログイン可能なユーザーを作るため、
スーパーユーザーでCREATE ROLE name WITH PASSWORD 'pass' LOGIN;
と設定しようとしたところ『-bash: CREATE: command not found』とエラー吐かれました。
おかしいなと思ってためしにcreateuser -P nameとしたところ
『CREATE ROLE』 と出ました。
ROLE(ユーザー?)が出来たのでログインしようと試みたところ、
『su: name というユーザは存在しません』とエラーを吐かれました。
CREATE ROLEでもcreateuserでもユーザーが作れない理由と対処方がわかりません。
どなたか教えていただけないでしょうか?
0284NAME IS NULL2008/02/27(水) 00:33:16ID:???
>>283
>CREATE ROLE name WITH PASSWORD 'pass' LOGIN;
これはpsql等で実行するもの。

>createuser -P name
こっちはシェル(bash等)で実行するもの。
でこっちは実行出来たっぽいね。userつってもあくまでdb用userで
psql -U name -d dbname
と言う具合につかう。

ちょっと初歩的すぎるので、何か本でも買って読んだ方がよさげ。
0285NAME IS NULL2008/02/27(水) 01:51:48ID:???
>>284
丁寧な解説&ご指摘ありがとうございます。
どこで使うかをわかっていないせいで、知識がごちゃ混ぜになってたんですねorz
一からきちんと勉強しなおします。ありがとうございました。
0286NAME IS NULL2008/02/27(水) 15:48:47ID:???
8.3.0 for Windowsです。

ふとログを見たら、plugin_debugger.dllというのが頻繁にロードされていました。
postgresql.confを見たら、
shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll'
がデフォルトで有効になっていたんですが、このplugin_debugger.dllとは何者なんでしょうか?
0287NAME IS NULL2008/02/27(水) 17:03:48ID:???
プラグインのデバッガじゃね?
0288NAME IS NULL2008/02/28(木) 00:26:16ID:???
>>286 PL/pgSQL のデバッガだったはず。
使わないなら単なるリソースの無駄なので外すべし。
0289NAME IS NULL2008/02/28(木) 00:41:09ID:???
plpgsqlのデバッグって出来たんだ……!
0290NAME IS NULL2008/02/28(木) 13:47:48ID:???
pgpool使用時に、100回に1回くらい通常時1秒程度のplpgsqlによるストアドの返答に
数十秒、長いときだと数分かかるんですが、原因がまったく検討つきません。

アクセスは一秒数回ありますが、autovacuumの実行なども発生には関係ないようで
一度killしてから同じSQLを走らせると1秒程度で終わります。
また、ストアド実行中に同じストアドを別の引数で呼び出しても、全く問題なく実行できます。
ストアド自体にはみたところ問題はありません。
原因や解決策などに心当たりがございましたら、ご教示ください。
0291NAME IS NULL2008/02/28(木) 14:45:33ID:???
自分は、詳しくないので見当つきませんが、
アドバイスを受けるのでしたら、
少なくとも、バージョンや環境は提示した方がいいでしょう。
02922902008/02/28(木) 14:49:09ID:NWie+e5y
申し訳ありません。
FreeBSD6.3、amd64
PostgreSQL8.3
pgpool-II version 2.0.1
です。

また、稼動を続けるとCPU使用率が増加していき、postgresを再起動すれば治ります。
0293NAME IS NULL2008/02/28(木) 15:09:55ID:???
負荷が高くなっていくのは、運用では困りますね。
原因が見つかるといいですね。
8.2.x など旧バージョンと比較して試してみるのはどうでしょうか。
0294NAME IS NULL2008/02/28(木) 18:03:40ID:???
8.3もpgpoolII 2もまだまだ枯れていないからなぁ。
0295NAME IS NULL2008/02/29(金) 00:52:01ID:???
>>290
問題を切り分けるのに、PostgreSQLだけで同じ事象が
発生するか試したら?
0296NAME IS NULL2008/02/29(金) 13:45:44ID:???
そうだな。pgpool切り離しと、ネットの影響もあるからlocalhostだけでやるのも
0297NAME IS NULL2008/02/29(金) 21:16:15ID:sA1ohjpH
ファイアウォールとSELINUXを切ってみては?あとは
PHPとかから呼んでるなら、永続的な接続を使ってると色々
リソースを食い続けるので、非永続で。CPU使用率はpostgreSQL
が使ってるのかな? 8.3に興味あるけど、まだ怖いね。

pgpool-II Ver 2は、こういった分野のソフトにしてはバグが多い印象。
ver 1 を使ったほうがいいかもww
02982902008/03/01(土) 21:56:32ID:???
すみません、SQLを改善したら解決しました
問題きりわけのためにplpgsql内のWHERE条件を分割して実行したところ
再発しなくなりました。
元のSQLが間違ってたようには思えないのですが…

pgpoolをはずして、4BSD、ULEどちらのスケジューラーでも試しましたが
問題はpostgresql単体の問題のようです。
0299NAME IS NULL2008/03/01(土) 22:12:52ID:???
時間かかった時は不適切な実行計画が選択されちゃってたとか?
0300anonymous2008/03/02(日) 08:06:09ID:???
>>298
よかったですね。
旧バージョンでは問題なくても、
新バージョンで問題が発生する場合もあると思います。
0301NAME IS NULL2008/03/02(日) 12:58:39ID:4NEnxdcC
>>298
参考のために、オリジナルと分割後のSQLを教えて。
もしPostgreSQLのバグなら、誰かが対処してくれるかもしれないし。
03029202008/03/02(日) 22:09:11ID:???
調査を続けていたところ、NULLが絡んだときにSQL自体が
PERFORM 1 FROM target_table
になっている場合があることに気がつきました。
これの応答に時間がかかっていたようです。
お騒がせしまして申し訳ありません。
SQL間違いとはお恥ずかしい…
03032902008/03/02(日) 22:11:26ID:???
すみません、920ではなくて290です。
0304NAME IS NULL2008/03/02(日) 22:22:55ID:???
http://www.postgresql.jp/
> 重要なお知らせ:
> 2月24日にwww.postgresql.jpサーバが部外者によりクラックされていた事が判明致しました。このため、サイトは安全な別サーバに移動し、トップページのみ表示されるようになっています。
> 現在、復旧作業中です。今のところルート権限を取得された形跡は発見されていません。 詳しい情報は後日公開致します。
> ご迷惑とご心配をお掛けする事をお詫びいたします。
0305NAME IS NULL2008/03/03(月) 14:31:40ID:???
うわぁ…
postgresql.jp って、SRAが事務局でサーバも提供してたのは、もう昔の話?
0306NAME IS NULL2008/03/04(火) 16:38:38ID:???
うげ、8.3って数値から文字列の暗黙の型変換がされないのか。
怖すぎてアップグレードできん。
0307NAME IS NULL2008/03/04(火) 16:49:33ID:???
2月27日 9:13 外部よりjpug.postgresql.jp(www.postgresql.jp)よりsshブ
        ルートフォースアタックを受けていると連絡が入る
     10:20 pscan2が走行しているのを確認し停止させる
        図らずもsshdのパスワード認証が有効になっていたため、ブ
        ルートフォースアタックで作業用アカウントのパスワードが解
        析され侵入を許していた。
        sshdのパスワード認証を禁止し、RSA認証のみとした。
     17:00 改ざん等がないか確認開始
  28日 14:00 改ざんと個人情報の流出が無いことを確認した。
3月 1日    告知用サーバ運用開始
0308NAME IS NULL2008/03/04(火) 22:44:35ID:???
>>306
そんな怖くないだろ
0309NAME IS NULL2008/03/04(火) 23:52:04ID:???
>>306
俺はchangelogを読まずに酷い目に遭ったぜ・・・orz
0310NAME IS NULL2008/03/05(水) 12:00:43ID:???
>>308
どの言語出身かで分かれるだろうなw
0311NAME IS NULL2008/03/05(水) 19:44:44ID:???
もともと date_column = 2008-03-01 っていうミスをしたという話があって、
date_column::text = (2008-03-01)::text = 2004::text
と解釈されるのはまずいとして、暗黙の型変換は削られたらしい。

ミスらないためには悪くは無いと思うけどね。
必要なら自分でキャスト追加すればいいだけだし。
0312NAME IS NULL2008/03/05(水) 23:06:59ID:???
質問させてください。

pg_dumpall でデータベース全体をバックアップした後、
このデータを元に、部分的な復旧を行う事は可能ですか?

手元に pg_dumpall で取ったデータしかなくて、
それを別サーバに復元したいのですが、
全部ではなく一部分だけ復元したいです。

調べた所、丸々復元する方法は見つけたのですが、
部分的な復元方法を見つける事が出来なかったので
よろしくお願いします。
0313NAME IS NULL2008/03/06(木) 02:54:14ID:???
部分的な具体例を示した方がいいと思います。

テーブル単位なのかレコード単位なのか、
カラムや部分文字列なのか。
0314NAME IS NULL2008/03/06(木) 03:00:03ID:???
>>312
バックアップ時のオプションにもよるだろうけど
バックアップされたファイルは基本的にテキストファイルだから
必要な部分だけに加工してrestoreするか
一時的にどこかに全てrestoreして、必要な部分だけ
個別にpg_dumpし直すか、だね。
0315NAME IS NULL2008/03/06(木) 10:20:23ID:???
なんかCLUSTER発行しても並べかえてくれない気がするんだが…
バージョンは8.2.6で
0316NAME IS NULL2008/03/06(木) 16:33:27ID:???
ローカルでpgsql立てて全部入れてから改めて必要な部分を戻せばよいのでは
0317NAME IS NULL2008/03/06(木) 23:29:33ID:???
質問です。

カラムの並び順を変えるには、この方法しかないのでしょうか?

テーブル Fruit = カラム名 [orange(int),apple(int),banana(int)]

BEGIN;
ALTER TABLE fruits RENAME apple TO apple_old;
ALTER TABLE fruits ADD COLUMN apple text;
UPDATE fruits SET apple = CAST(apple_old AS text);
ALTER TABLE fruits DROP COLUMN apple_old;
COMMIT;
などを複数回発行して、カラムを追加、削除により並べ替える。

MySQLには、指定したカラムとカラムの間にカラムの挿入などができたと思うのですが、
ポスグレでは、そのような機能はないのでしょうか?

よろしくお願いします。
0318NAME IS NULL2008/03/07(金) 00:41:47ID:???
無いんじゃないかなあ
そういう時はテーブル丸々コピーして、新しい並びで空のテーブル作って
select insertで一括挿入っていうのをよくやるけど
0319NAME IS NULL2008/03/07(金) 08:09:12ID:???
VIEW 使えば? そもそもRDBMSでカラム順に依存したSQLを書くのが間違い。
0320NAME IS NULL2008/03/07(金) 10:36:16ID:???
うん、俺もVIEW使うのが正解だとオモ。
>>319の言うことは正論。
0321NAME IS NULL2008/03/07(金) 10:51:18ID:???
>>317
純粋に、なぜ列の並び替えが必要になるのか知りたい。
0322NAME IS NULL2008/03/07(金) 11:07:36ID:???
select * from tabの結果が気持ち悪いからじゃないの?
俺も後からカラムを追加するときに、一番最後じゃ気持ち悪いときが結構ある。
0323NAME IS NULL2008/03/07(金) 11:33:34ID:???
>>322
気持ち悪いのは人だけでしょ。
プログラムを実行するコンピュータには何の関係もない。
0324NAME IS NULL2008/03/07(金) 14:16:29ID:???
>>322
つか*で取るからそういうことになる。
列指定汁www
0325NAME IS NULL2008/03/07(金) 14:46:23ID:???
>>323 実行する人の精神衛生状態は作業効率に直結する
0326NAME IS NULL2008/03/07(金) 14:48:26ID:???
>>325
なんて言っている人の作業効率なんてたかが知れている
0327NAME IS NULL2008/03/07(金) 14:52:24ID:???
すんません、vacuumに関して教えてくださいな。

vacuum -a -f -zは毎日夜中に一度やるとして・・・

・オンライン中にvacuumしていいのですか?
(極端に遅くなるとか、壊れる等はありますか?って意味が一番強い)
・いいのであれば、vacuumのオプションは何が最適かしら?

土日は更新メイン。平日は参照メインなシステムです。
バージョンは、8.2.6です。
よろしくお願いします。
0328NAME IS NULL2008/03/07(金) 14:57:09ID:???
MyISAM の ORDER BY 無しのデフォルトの並び順での取り出しは、
確かに挿入順であって結構速い気がする。
この動作に依存して組む人たちもいるんじゃないだろうか。
0329NAME IS NULL2008/03/07(金) 15:02:16ID:???
>>328
それ行の話でしょ? いま問題になっているのは列の並び
0330NAME IS NULL2008/03/07(金) 18:19:48ID:???
vacuumは遅くなるから夜中にやってるなら
それで良いと思うけど。

うちは随時更新、参照入るシステムだけど、
処理重い時間にvacuumやると結構やばい。

vacuum1回で足りないと感じるのは何故だろう?
メモリが十分にあるならチューニングしたらどう?
ttp://www.thinkit.co.jp/free/marugoto/2/1/11/

autovacuumはどうなのか知らん
0331NAME IS NULL2008/03/07(金) 19:56:07ID:???
世の中にはソースのないプログラムとかもあるからなぁ。
データベースの列の並びがちがうだけで動かなくなる糞プログラムなんかに限ってソースが無かったりする。
俺は今またそれに引っかかったよ。   orz
0332NAME IS NULL2008/03/07(金) 23:47:46ID:???
そんなプログラムにこそ、カラムの挿入なんてやったらダメなんでは。
0333NAME IS NULL2008/03/08(土) 09:12:47ID:???
>>327
vacuum -a -z だけで十分。
VACUUM FULL は必要ないよ。

オンライン中の VACUUM で DB が壊れることはないし、
極端に遅くなることもないけど、負荷が気になるなら
vacuum_cost_delay とか VACUUM のコストを弄ってやればいい。
0334NAME IS NULL2008/03/09(日) 01:19:17ID:???
create table hoge( foo integer not null );
create table fuga( bar integer not null check( bar < foo ) ) inherits( hoge );

こんな感じに継承元と先とでの数値の検査制約って出来ないんだっけ?
0335NAME IS NULL2008/03/10(月) 23:45:35ID:???
>>334 まったく問題なくできるようだが。
03363272008/03/11(火) 14:16:00ID:???
>>330,333
ありがとう。

>vacuum1回で足りないと感じるのは何故だろう?
うーん、一個件数の多いテーブル(100万件ぐらい)があって、
そこが土日の更新の対象で且つ、結構他のテーブルとjoinしてるんですよ。
一応、explainで見て、indexの見直しと対象SQLのチューニングをして、
大分早くなったんだけど、1年で100万件程度増えるので、
いつかはまた遅くなるんだろうと感じてます。
なので、手軽?に早くする手法はないかと調べていた訳です。

オンラインのVACUUMで壊れないのであれば、
一度負荷と相談して試して見ます。
ありがとさんでした。

ところで、V8.x系のメモリチューニングで、1GB以上共有メモリを取っても、
メモリマネージメントの都合で逆に遅くなるってあるんだけど、
やっぱりそういう物なんですかね?
サーバー4GBにしたのに無駄?
0337NAME IS NULL2008/03/12(水) 00:35:41ID:???
>>336
パーティショニングすれば?

> サーバー4GBにしたのに無駄?
共有メモリ以外はOSキャッシュとして使われるから、
まったく無駄にならん。
0338NAME IS NULL2008/03/12(水) 19:51:58ID:???
>>337
レスありがとう。

パーティショニングを今度試してみるダス。
日々の売り上げデータに近い構造なので、
効果は大きそうな気がします。
大抵の集計自体も長くて3ヶ月ぐらいだし。

ありがとうございました。
0339NAME IS NULL2008/03/13(木) 00:47:20ID:???
共有メモリ1G以上だと遅くなるのってどっかに書いてある?

0340NAME IS NULL2008/03/13(木) 08:07:54ID:???
> 共有メモリ1G以上だと遅くなる
というよりは、単に増やせば増やすほど速くなるわけではないってこと。
DB/OS 2層でキャッシュするよう設計されているから。
他のデータベースでも似たようなことはよくある。
0341NAME IS NULL2008/03/13(木) 19:38:18ID:RTgKtkUI
>>339

8.1のチューニングのページに書いてあった気がします。自分の8.1
での経験ですが、20Gとか指定すると、小さなテーブルのdrop table すら
1秒くらいかかった記憶が、、、。


>>338

おなじく8.1での話ですが、パーティショニングしたテーブルをjoinす
ると、selectがシーケンシャルになって激遅になるケースがありました。
同じ構造で同じSQLでも8.3はインデックスを使ってくれるんですけどね
0342NAME IS NULL2008/03/13(木) 20:43:28ID:???
>>341 たしかに drop table は遅くなるかも。メモリ全部舐めるから。
drop table を高速化する目的でチューニングすべきかは疑問だが。
0343NAME IS NULL2008/03/14(金) 00:29:37ID:???
temp tableしまくるなら効果ありそうだなw
0344NAME IS NULL2008/03/14(金) 01:03:30ID:???
>>341
> 20Gとか指定すると、

実メモリはいくら積んでたの?
0345NAME IS NULL2008/03/14(金) 01:19:18ID:???
>>343 temp table はローカルバッファなので関係なかったりする。
0346NAME IS NULL2008/03/14(金) 09:25:11ID:???
>>339
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050402/158372/?P=2

ここ以外にも、具体的な数値を上げて書いてあったところが
あったと思うけど、おもいだせませんでした。
0347NAME IS NULL2008/03/14(金) 23:16:26ID:gKUPvhD2
drop table だけじゃなくて、delete して insert する処理も、もっさり感が
ありました。0コンマ何秒の処理だったけど、共有メモリ1.5G設定時の
2倍くらいの所要時間だったイメージ。DB全体のサイズは6G程度です。

>>344

会社のサーバなので、たしか30G台でした。
0348NAME IS NULL2008/03/15(土) 07:58:18ID:???
>>347 そんな豪勢な環境はめずらしいからなぁ。
共有メモリ20GBなんて大きな設定は、テストが足りてないのかも。
4GBを超えるとちょっと心配だな。
あまらせてもOSがキャッシュとして使うから、無駄にはならないし。
0349NAME IS NULL2008/03/16(日) 01:45:48ID:???
>>313>>314>>316
亀レスすいません。
>>316の方法で行く事にします。
どうもありがとうございます。
0350NAME IS NULL2008/03/17(月) 21:50:44ID:???
数百万件以上など、どんどん増えていくテーブルに対して遅くなっていく場合の対処ですが、
日付で管理できるテーブルなら、
例えば、
今月とそれ以前のテーブルに分割してみるとかは?
バッチでレコードの移行を行う必要が出たり、
プログラムの変更が必要になりますが。

その場合、veiwで対応ということが考えられますが、
例えば、レコードが少ないテーブルAとレコードが多いテーブルBの連結を記述しているveiwの場合、
テーブルAにINSERTなど変更が加わる際、
veiwのレコードが多いテーブルBの影響を受けて、多少遅くなるということはあるのでしょうか?
あったとしても、気になる程度じゃないのかな?
0351NAME IS NULL2008/03/17(月) 21:53:17ID:???
veiw
0352NAME IS NULL2008/03/17(月) 22:03:59ID:???
失礼。よく間違えるんですよ。(^^;
0353NAME IS NULL2008/03/17(月) 22:18:35ID:???
>>350
千万件ぐらいならclusterかければ直ぐに結果返ってくるよ
一億件は試した事ないから判らんw
0354NAME IS NULL2008/03/17(月) 22:30:52ID:???
>>353
ありがとうございます。
やったことはないので、試してみます。

現在、Group by など複数のSQLを一度に発行しているので、
それが完了するのに、20〜30秒くらいかかっています。
さらに早くなるとストレスなくなるなぁ。
0355NAME IS NULL2008/03/17(月) 22:32:28ID:???
view って、select など、参照する時だけにしか使用されずってことで、
insert や update には、全く影響はないのかな?
0356NAME IS NULL2008/03/17(月) 22:34:53ID:???
あ、view って、insert 時など、キーの重複などの整合性をチェックしてたっけ?(^^;
なんか、そんなことがあったような。。。
0357NAME IS NULL2008/03/18(火) 18:30:33ID:cmzwaPqX
pgpool3.2のバグで、FreeBSD4.11上でmakeできないらしいので
3.1.2を入れようと思うのですがどこかでげとできますか?
bugfixした3.4.1をmakeることも考えたのですが、稼動中のサーバに
突っ込むので開発版は避けたいところです。
0358NAME IS NULL2008/03/18(火) 19:18:39ID:1so+byeI
8.3.1 & 8.2.7
0359NAME IS NULL2008/03/19(水) 04:27:00ID:???
>>350
適切なindexを介してアクセスする場合は対数オーダーだから、それが可能ならば
1テーブルで済ませる方が絶対有利。
どうしてもfull scanが必要となる処理ではテーブル分割も考えられるが、
union viewを使う場合、ちゃんとプランナがそれを認識してあらかじめ不要な
テーブルを実行計画から除外することが出来ないとかえって遅くなる。
0360NAME IS NULL2008/03/19(水) 08:04:05ID:???
>>359
削除のことも考えた方がいい。
テーブルを分割する最大のメリットは、古いデータの一括削除だから。
絶対に削除しないならば、確かに分割する利点は薄い。
0361NAME IS NULL2008/03/21(金) 02:39:37ID:bZgunjjY
www.postgresql.jp 繋がらない(´・ω・`)
0362NAME IS NULL2008/03/21(金) 02:53:43ID:???
>>361
未確認情報だけど、またクラックされたから復旧中らしいよ。
0363NAME IS NULL2008/03/21(金) 05:06:01ID:???
>>362
その話がMLに流れたって、スラドのアレたまで見たよ。
0364NAME IS NULL2008/03/21(金) 16:07:05ID:???
>>359-360

どうも。
1テーブルだと、どんどん増えて数百万レコード件以上になり、
1画面の表示に20〜40秒はかかってしまいます。
分割すると、数千レコードなので、1〜2秒以内で終わります。
将来は数千万レコードにもなり、もっとかかってしまいます。

ひとつのSQLで済むまない10以上のSQLの処理を行っている情報てんこ盛り画面なので。。。
0365NAME IS NULL2008/03/21(金) 20:59:17ID:3PY9kdIC
>>364

数千レコードで1〜2秒の処理って、、、どんなSQLなんでしょう?
処理範囲分のデータを一時テーブルに取り出して使えば、それで
速くなったりはしないですか?
0366NAME IS NULL2008/03/22(土) 15:18:52ID:???
>>364
正規化されていないってオチじゃないよね?
複雑なデータ取得でカーソルすら使ってないとかだったら
単純に技量不足だと思うよ
0367NAME IS NULL2008/03/23(日) 01:51:18ID:???
>>365-366
どうもありがとうございます。

>>365
合計で1〜2秒ですから、
ひとつのSQLで、0.1秒〜0.2秒以下ということですが、それでも遅いですかね?
ほとんど全部が、Group by 使用のSQLです。

一時テーブルへ抽出ですか。
普通のテーブルへInsertでしょうか?
その方法はメモリなど特殊な方法でしょうか?
一時テーブルへ抽出しても、複数同時アクセスが頻繁にあるので、
同じテーブル利用にならないよう個別利用になるよう考慮する必要があります。
同じテーブル利用で重複しても数万レコードですから、
Delete & Insert が早ければ、効果あるかもしれません。
しかし、頻繁に画面更新を行うので、Insertが多くなり、意味があるかどうか。
頻繁にバキュームしないといけなくなるのかな?

>>366
カーソルは使っていません。
カーソル利用とSQLでどのくらいの差があるのか知りませんが、
10倍以上と劇的に早くなるようでしたら、今後検討してみますが、
はっきり言って、管理と工数のことを考えると面倒ですね。
ただ、カーソル制御はわかりますが、
SQLをどう、カーソル使用で置き換えて利用するのか、勉強不足で、わかりません。

正規化とは、どの意味で、言われているかわかりませんが、
PostgreSQL固有で言われるものでしたら、正規化はしていません。
もちろん、冗長データはありません。
0368NAME IS NULL2008/03/23(日) 03:00:03ID:???
>>365-366
次に、ひとつのSQLを紹介します。(改行が多いので)
テーブル名やカラム名は、変えていますが、
生のSQLです。
まだ未熟なので、SQL自体を見直す点もあるとは思います。
テーブル詳細を紹介できないので、わかりづらいと思いますが、
table001が100万レコード以上で、
約、1.2秒〜2.0秒かかります。
数千レコードでしたら、
0.2秒前後です。

このようなSQLが1画面に10以上あると合計、20〜40秒以上になってしまうので、
よく使う該当レコードをテーブルを分割して数千レコードにすると、合計1〜2秒で収まります。
テーブル設計自体やインデックスの見直し、チューニング次第でまだ高速になるのは間違いないと思いますが、
将来的に、数百万、数千万レコード以上になる前提では、
テーブル分割で1〜2秒の現在と同様に早くなるとは思えないので、検討もしていない現状です。
0369NAME IS NULL2008/03/23(日) 03:01:30ID:???
(改行が多いので続き)
------------------------
select
case
when ee.kbn001='' then ''
when ee.kbn001='1' then '区分1'
when ee.kbn001='2' then '区分2'
when ee.kbn001='3' then '区分3'
when ee.kbn001='4' then '区分4'
when ee.kbn001='5' then '区分5'
else null
end as kbn001,
case
when ee.kbn001='2' then ee.kbn002
else 'kbn002'
end as kbn002,
aa.name as 名称,
aa.kana as カナ,
aa.tel,
case
when cc.flg001=1 then 'フラグ1'
when cc.flg001=2 then 'フラグ2'
when cc.flg001=3 then 'フラグ3'
when cc.flg001=4 then 'フラグ4'
when cc.flg001=5 then 'フラグ5'
else null
end as flg001,
case
when aa.kbn003='0' then '区分30'
when aa.kbn003='1' then '区分31'
when aa.kbn003='2' then '区分32'
else null
end as kbn003,
'' as dummy,
dd.sum_kei as 計,
translate(aa.biko,'
',' ') as 備考,
bb.jun as 順番,
bb.code01 as コード
0370NAME IS NULL2008/03/23(日) 03:02:06ID:???
(改行が多いので続き)
------------------------
from
(
select
min(jun) as jun,
code01
from table001
where
code002 =6
and translate(to_date(data001,'yyyy/mm/dd'),'-','/')='2008/03/21'
group by
code01
) bb
left join data002 aa
on (aa.code01=bb.code01
)
left join data003 cc
on aa.code01=cc.code01 and cc.code002 =6
and translate(to_date(cc.data001,'yyyy/mm/dd'),'-','/')='2008/03/21'
left join
(
select
code01,
coalesce(sum(kingaku001),0) + coalesce(sum(kingaku002),0) as sum_kingaku001
from table001 aaa
where
aaa.code002 =6
and translate(to_date(aaa.data001,'yyyy/mm/dd'),'-','/')='2008/03/21'
group by
code01
) dd
on aa.code01=dd.code01
left join table003 ee
on (aa.code01=ee.code01 and ee.code002=6)
order by bb.jun
------------------------
0371NAME IS NULL2008/03/23(日) 08:41:01ID:???
>>369-370
これじゃ遅いだろうね。
code002のカーディナリティが低くてdata001に関数インデックスも
設定していないなら、そのクエリは table001 の seq scan が発生
するというのはわかるかな?
検討する気もないんだったらどうでもいいが。
0372NAME IS NULL2008/03/23(日) 09:38:31ID:???
> translate(to_date(data001,'yyyy/mm/dd'),'-','/')='2008/03/21'
「関数(列) = 定数」の書き方ではインデックスが使われない。
data001列をdate型に置き換えて date001 = '2008/03/21' か、
timestamp型なら '2008/03/21' <= date001 AND date001 < '2008/03/22' にするか。

一般的な方針としては、文字列型を減らす(意味にあう他の型を使う)のが良い。
0373NAME IS NULL2008/03/23(日) 10:16:54ID:YDmnE8vH
>>367

一時テーブルですが、

create template(?) table *** as select * from table001 where ***

とかで、必要な範囲のtable001のデータを持った一時テーブルをメモリ上に
つくれます。他の接続とは干渉しないので、複数処理とかは気にせず
でOK。delete も必要ないです。pgpoolとか使ってるなら、使用後に dropが必要。
んで、一時テーブルを使って処理すれば、とりあえず簡単に速く
なると思うけど

0374NAME IS NULL2008/03/23(日) 11:35:59ID:???
>>371-372
ありがとうございます。
文字列だと遅くなるのは、認識していますが、
「関数(列) = 定数」だと、インデックスが使用されませんか。
考えてみると、そうですよね。致命的欠陥ですね。
date001 = '2008/03/21'
の書き方にすると、4倍ほど早くなり、1.2秒が、0.3秒ほどになりました。
まずは、データの統一整備をして、
translate(to_date(data001,'yyyy/mm/dd'),'-','/')='2008/03/21'の記述をやめ、
date001 = '2008/03/21'の記述にしようと思います。
データ型の変更は、時期を見て検討しようと思います。

>>373
ありがとうございます。
簡単にメモリ上にできるのでしたら、時期をみて試してみようと思います。
pgpoolは使用していません。今のところも予定はありません。
0375NAME IS NULL2008/03/23(日) 13:50:33ID:???
>>374 の補記
>致命的欠陥ですね。

は、私の設計、SQLが欠陥という意味です。念のため。
0376NAME IS NULL2008/03/24(月) 12:50:57ID:???
>>375
大丈夫。その意味が分かる人間ならクエリを見た時点で分かっていると思うぞ。
まあ何だ。頑張れ。
0377NAME IS NULL2008/03/26(水) 20:53:54ID:HwJR8fjT
LEFT JOINでの結合に関する質問です。

頭の中でごちゃごちゃやる分には、
結合の順番によって内部処理のコストが大分変わりそうですが、
PostgreSQLの実際の作業としては、
SQL最適化した上で実行されるから関係ないのでしょうか?

(実際はもっと複雑ですが)
例えば以下のようなSQLでtable_a、table_b共に数百万件あったとします。
数百万件を結合した上で、table_bで絞り込むより、
table_bで絞り込んだ後にtable_aを結合した方がコストがかからないような場合です。

SELECT *
FROM table_a
LEFT JOIN table_b
WHERE
table_b.id=1;
0378NAME IS NULL2008/03/26(水) 21:07:32ID:???
>>377

explain してみるといいのでは。
0379NAME IS NULL2008/03/27(木) 10:42:10ID:???
360万件のテーブルAをselect count(1) するのに
85秒もかかっていて悩んでいます。別の730万件のテーブルBは11秒でした。
テーブルAデータ量は1GBは超えていると思います。テーブルBは数十MBくらい。

環境:
OS:Linux(FC7)
PostgreSQL8.3
Core [email protected]
Mem:4GB (認識は3.6GB)
設定
shared_buffer 1500MB
work_mem 256MB

shared_bufferは大きくしすぎても遅くなるとかの情報があったのですが、
なんか速くする設定とかありますか?
03803772008/03/27(木) 16:11:25ID:tPBRhLWv
>>378
explainの結果をどう見たらよいのか良く分からなかったのです(DB毎に違い過ぎますよね)。
検索していたらよさげな情報を見つけたので、explainしてみます。ありがとうございます。
SQLiteやMySQLのexplainよりも実用的なようですね。

>>379
primary key をはっていないのでは??
0381NAME IS NULL2008/03/27(木) 22:12:57ID:???
>>379
単にテーブルサイズが大きくて、ディスク読み込みが大量に発生しているからでは?
キャッシュに乗った後の速度で良ければ、synchronize_seqscans = off を試してみると良いかも。
他に、更新を繰り返したせいでテーブルが太っているならば、
いったんCLUSTERなりVACUUM FULLなりをかけてみるとか。

>>380
何の効果も無いぞ > primary key
0382NAME IS NULL2008/03/27(木) 23:54:21ID:???
すいません8.2.5でした
>>381
synchronize_seqscans = offは試してみます。と思ったけど8.3からなのかな。
ディスク読込のせいなのはほぼまちがい無いんだけど、shared_buffers割り当てを
増やしてもほとんど解決しなかった。もしかしてpostgresのキャッシュって、
queryでoidを読み出して、そのoidに対応するデータがキャッシュされてれば
キャッシュを見るだけなんじゃないのかなあと思ったんだけど、それで合ってる?
そう考えるとメモリはOSのディスクキャッシュに回した方がいいんじゃないかなとも
思ったんだけど。

vacuum fullは一回途中までかけたんだけど、20分くらい返ってこないのでやめた。
365d24hサービス中なので厳しい。vacuum analyzeは毎日かけるようにしたけど。

0383NAME IS NULL2008/03/28(金) 01:14:47ID:???
365日24時間稼動しているなら、
まずは、テストできる予備機は必要ですね。

あとはサーバーの再起動とか。。。
365日24時間稼動で、それも不可能ならメンテ期間しか無理ということになりますね。
0384NAME IS NULL2008/03/28(金) 08:18:06ID:???
>>382
ぜんぜんちゃう。oidなど使わない。

テーブルBの「数十MBに11秒」でもものすごく遅いので、環境がおかしい気がする。
100MBで10秒ならば、1GBで100秒かかるのも仕方ないでしょ?

あと、VACUUM FULLはアホのように遅いので、やるならCLUSTER。
0385NAME IS NULL2008/03/28(金) 17:00:26ID:???
>>383
予備機はあるけどスペックが違うので大分遅いんです。
本番データは2GB強あるのでインポートするのも一苦労だし

>>384
そうなんだ。じゃあshared_buffersを全データが載るくらい増やせば
劇的に速くなると思うんだけど、postgresql8でも1GBくらいに性能ピークが
あるっていうのはなんでなの?

>100MBで10秒ならば、1GBで100秒かかるのも仕方ないでしょ?

select * じゃなくて select count(1)だから容量では単純比較できないと思う。
730万件が11秒ってなかなか優秀だと思ってたんだけどものすごく
遅いん?うーん。このスペックなら何秒くらいが妥当だと思う?
数十万件のテーブルから複雑な検索条件で検索かけるのとかは
軒並み1秒以内で終わるし、テスト環境(これもLinux)にくらべたら大分速いから、
環境のせいじゃないと思ってたんだけどなあ。
0386NAME IS NULL2008/03/28(金) 21:02:35ID:???
見当外れなこと書いてたらスマソだが、
select count(*)にはできないのかな?
Postgreは知らんけどOracle8iではえらい差がでるよ。
count(1)ではDistinctのカウントになるので重複値の検出でえらい時間がかかる。
全件count(1)なんてやっちゃうと全件の中間テーブルを作ろうとしたりして。
0387NAME IS NULL2008/03/28(金) 21:08:15ID:???
>>385 730万件が11秒
手元の環境だと、2秒未満。一昔前のデスクトップ機。
730万件だと最低250MB以上にはなるはずだし、なにか勘違いしてないか?

=# select pg_size_pretty(pg_relation_size('test'));
pg_size_pretty
----------------
252 MB
(1 row)

=# select count(1) FROM test;
count
---------
7300000
(1 row)

Time: 1876.152 ms
0388NAME IS NULL2008/03/28(金) 21:09:22ID:???
>>386 残念だが見当外れ。
count(*)とcount(1)はまったく同じ動作です。
0389NAME IS NULL2008/03/28(金) 22:28:14ID:???
>>388
あれ?同じ動作だったんだっけ?
昔なにかでcount(*)よりcount(1)の方が良いって記事をどこかで見た気がするんだが・・・。
勘違いか?
0390NAME IS NULL2008/03/28(金) 22:51:29ID:???
>>387
ごめんそのpg_size_prettyを知らなくて、データのバイト数(1レコード36バイト)に
730万をかけて20〜30MBかなあと思ったんだけど、一桁間違えてた。
それやってみたら485Mだったよ。

360万件の方は3587MB
トータルのデータ領域が広すぎて遅くなってんのかな。
shared_buffersも1.5GBじゃ全然収まってないってことだね。
サービスインからしばらくVACUUMかけてなかったので、一回くらいは
VACUUM FULLかけたいんだけどね。

CLUSTERは調べたらテーブルロックしちゃうんだね。
夜中やってみるかな
0391NAME IS NULL2008/03/28(金) 23:06:44ID:???
>>389
ユニークインデックスを持った列名の方がいいという記述なら見つけた

http://www.geocities.jp/mickindex/database/db_optimize.html#LocalLink6
http://oracle.se-free.com/tuning/B1_wild.html

でもって今日は325万件なんだけどやってみた
1. count(key) 76秒
2. count(1) 65秒
3. もう一回count(key) 63秒
4. selct count(*)が83秒

1の実行でキャッシュに載ったのかな。アクセスが割とある時間帯なので、
別要因で変動しているかも知れないけど
0392NAME IS NULL2008/03/28(金) 23:45:45ID:???
>>389
他のDBMSだと効果があるのかもしれないけど、PostgreSQLに関しては関係ないのですよ。
あんまり鵜呑みにしないほうが良いのですよ。
0393NAME IS NULL2008/03/29(土) 20:05:32ID:???
見当違いかもしれないが、HDD壊れてると遅くなったりしないか?
0394NAME IS NULL2008/03/30(日) 09:29:37ID:7s6ei0XY
>>391

マシンの物理メモリ量と、DB全体のサイズの問題なのでは?メモリを
8Gくらいにすれば、あんましHDDにアクセスせずに済んで早くなると
思います
0395NAME IS NULL2008/03/30(日) 09:56:52ID:???
>>391

オススメとしては、
・OSをCENTOS、x86_64にしてメモリを8Gくらいは積む。
・shared_buffersは1.5GのままでOK
・HDDを高速なものに交換する。

24時間365日について
・VACUUM FULLはロック掛かると思いますので、運用中は難しいかと。
・バージョンによっては、VACUUMがらみでバグがあったと思うので、
 結構不安。
 8.2系統だと、8.2.7のリリースノートに
 Repair potential deadlock between concurrent VACUUM FULL operations
on different system catalogs (Tom)
 って載ってるし、バージョンアップをすすめます。

 参考
 ttp://www.postgresql.org/docs/8.2/static/release-8-2-7.html

・OS再起動も、1ヶ月に1回くらいしたほうが良いのでは?
0396NAME IS NULL2008/03/30(日) 12:38:56ID:???
ソフトやハードで力技で解決するよりは、
 ・VACUUMをちゃんとする運用にかえる
 ・count()を多用しない設計にする
ほうが重要だと思うのだが・・・
0397NAME IS NULL2008/03/30(日) 15:59:36ID:???
8.3にしてVACUUMの必要性をなるべく減らすという手もある。
んまぁ、>>396の言うとおり、時間がかかるからVACUUMはしないというのは
腐った運用としかいいようがないけどね。
0398NAME IS NULL2008/03/31(月) 11:57:27ID:NLL0Kbcv
テーブルは以下のようになっています。

TableName(
id serial,
up_id integer,
data text,
updatetime timestamp
);

このとき、up_id毎にupdatetimeが最新のものをリストしたいのですが、
どのようなSQL文を書いたらいいのでしょうか?
up_id 指定で1件取り出すだけなら以下のSQL文でいいのはわかるのですが
SELECT * FROM TableName WHERE up_id=? ORDER BY updatetime DESC LIMIT 1;
03993912008/03/31(月) 12:10:22ID:???
みんなありがじゅー。
VACUUM ANALYZEは毎日やってる。最初AUTOにしてたんだけど、
毎日10万レコードくらい追加/削除するのでデイリーでやるようにした。
count()するのは、一覧表示の時にまず全件カウントしてページング処理を
したいから避けられない。
HDDが遅いのはアレだと思ってたので、次のシステムではRAID0+1を提案した。

で、>>395の
・メモリを8Gくらいは積む。
・shared_buffersは1.5GのままでOK

っていうのは、残りの6GBはOSのディスクキャッシュにおまかせするってこと?
0400NAME IS NULL2008/03/31(月) 12:29:58ID:???
>>398
idとup_idの関係がイマイチ分からんのでkwsk
0401NAME IS NULL2008/03/31(月) 12:43:44ID:???
>>398
てきとーに、
select up_id, max(updatetime) where tablename
gourp by up_id
と書いてみるテスト
0402NAME IS NULL2008/03/31(月) 12:44:24ID:???
あ、whereじゃなくて、fromだorz
0403NAME IS NULL2008/03/31(月) 12:44:57ID:???
あ、gourpじゃなくて、groupだ。
てきとーすぎるorz
04043982008/03/31(月) 13:08:16ID:???
ありがとうございます

>>401
idは主キーで、特に今回は使わないです(すみません)
up_idは他のテーブルと結合するためのidです(他のテーブルの主キーつまり一対多のテーブル)。
up_idはユニークではないので、up_id毎に複数レコードが存在します。

>>401
そのSQLでup_idとupdatetimeのリストは作れるのですが、
dataのカラムが取れないので、困ってしまうのです。
他のDBだと(本当は文法違反であるものの)、
取得カラムにdataを追加するだけで欲しいものが取得できたりするのですが、
PostgreSQLだとgroup byにもdataを追加しなければいけないので、
dataまで同一じゃないとうまくグループ化されません。
0405NAME IS NULL2008/03/31(月) 13:23:51ID:???
>>404
up_id別の最新updatetimeを取得できるなら、
そのSQL(をVIEWにするなりして)と
元テーブルのJOINを取ればいいだろ。
04064012008/03/31(月) 13:37:12ID:???
まぁ、そういうことだな。
0407NAME IS NULL2008/03/31(月) 13:59:28ID:???
>>404
何に困ってるんだ?
select tablename.*
from tablename
join (
select up_id,max(updatetime) as updatetime from tablename group by up_id
) tmp using(up_id,updatetime);
04083982008/03/31(月) 14:03:41ID:???
>>401,405
ありがとうございます。

ということは、自分のテーブルに自分のテーブルを
up_idとupdatetimeで結合する感じですよね。

なんか、こう珍しくなさそうな検索条件なので、
もっと単純な解決方法があるのかと思いまして。
04093982008/03/31(月) 14:10:55ID:???
>>407
ありがとうございます(すれ違いました)。
>>408の通りですが、usingという書き方は知りませんでした。
勉強不足ですね…。
0410NAME IS NULL2008/03/31(月) 15:14:44ID:???
>>399
全件カウントなら・・・別テーブルでカウントしておいた方がよくないか・・・・?
引いてくる条件のバリエーションが多いと結局面倒になるだけだけど。
0411NAME IS NULL2008/03/31(月) 15:24:33ID:cYc2EXId
PostgreSQL初心者です。
idを主キーにして、データはidの昇順に登録しておきました。
WindowsなのでpgAdminIIIのデータビューで見るとidの昇順にデータが見えます。
一方
SELECT id from table
とするとid昇順になっていないところがありました。
order byを使えばいいことは分かったので問題はないのですが、こういうことは十分起こりうることなのでしょうか?
0412NAME IS NULL2008/03/31(月) 15:28:25ID:???
>>411
PostgreSQLに限らず一般的にそう。
0413NAME IS NULL2008/03/31(月) 15:28:39ID:???
>>411

レコードの順序は保証されない。順序が重要ならば必ず ORDER BY すべし。


04144112008/03/31(月) 15:35:57ID:???
>>412,>>413
わかりました。どうもありがとうございます。
0415NAME IS NULL2008/03/31(月) 16:05:11ID:???
>>410
結局はよく使う検索条件だけに絞って一瞬で検索できるようにしたんだけど、
それとは別に勉強のために数GBのデータを早くする方法無いのかなと
思ってさ。Oracleなら全部キャッシュにいれてしまえばいいんだろうけど、
PostgreSQLはキャッシュサイズ800MBにピークがあるって事だったので、
どうしたらいいかなと。

元々は操作する人が任意の検索条件を指定できるようになっていたので
レコード数を別テーブルで管理は無理だった。

0416NAME IS NULL2008/03/31(月) 21:03:41ID:???
>>415
PostgresとOSでキャッシュ管理がダブるので、中途半端にメモリの半分とかしないほうがいい。
少なめにしておくか、むしろ限界まで割り当てるか、どっちか。
0417NAME IS NULL2008/03/31(月) 22:35:44ID:???
pbbenchとか使って、テストをして決めればいいと思うが...
0418NAME IS NULL2008/03/31(月) 23:35:10ID:???
>>399

>っていうのは、残りの6GBはOSのディスクキャッシュにおまかせするってこと?

そのとおりです。HDDから読むから遅いのであって、メモリからなら
OSキャッシュからでも、postgreSQLのメモリからでも大差ないと思います。
0419NAME IS NULL2008/04/01(火) 07:35:04ID:???
>>417
テストをして決めるときの、パラメータ値の探索範囲の話をしているんだと思うよ。
0420NAME IS NULL2008/04/02(水) 09:25:18ID:???
4GBのテーブルの全件カウントを速くしたいのでpgbenchは意味無いんです。
ベンチテストという意味ではそのselect count()の結果自体がテスト
なんだけど、本番稼働中にDB止めながらパラメータ変えつつ
テストするわけにもいかないし、とりあえずメモリ増設と設定パラメータ変更
(バッファ1.5GBとか)はやってみたので、みなさんの知恵を借りに来ました、
という感じです。
0421NAME IS NULL2008/04/02(水) 09:35:36ID:???
もしかして「キャッシュサイズ800MBにピーク」っていうのも
テーブルサイズとか無視した単なる指標に過ぎなくて
環境によっては大きく変わるのかなあ。
例えば今回の場合だったら4GBキャッシュに割り当てた方がいいとか

参考にしたのはここ
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050402/158372/?P=2
0422NAME IS NULL2008/04/02(水) 10:20:27ID:???
>>420
全部SSDにつっこめ。
0423NAME IS NULL2008/04/02(水) 10:50:22ID:???
ネタにマジレスするのはなんだけど
業務用のシリコンディスクっつーのもあるよね
http://www.newtech.co.jp/products/silicon_s/ramsan/index.html

16GBで570万て
0424NAME IS NULL2008/04/02(水) 11:51:17ID:???
>>421
全件カウントじゃ4GBがテーブル全部がキャッシュに乗っからないと劇的な変化はなさそうだし、
shared_buffersを4GB強にして試してみるのは悪くないと思う。

>>422
ランダムアクセス性能が非常に重要になるので、ランダムアクセスでは速いSSDは確かに
面白そうではあるけど、あっという間に寿命がくる罠…
0425NAME IS NULL2008/04/02(水) 15:03:01ID:???
pgperlのソースを探してるのですが
フォーラムにも見当たりません。。
どなたかご存知ないでしょうか?
0426NAME IS NULL2008/04/02(水) 18:09:27ID:???
4GBのテーブルってデータ保存期間が14日間だったんだけど、
30日に延長されたよ。今後はこのテーブルだけで8GBになる。
ちなみにデータ領域をdfでみると今10GBくらい。
0427NAME IS NULL2008/04/03(木) 11:29:13ID:???
>>426
だからSSDに配置汁。
0428NAME IS NULL2008/04/03(木) 14:30:26ID:???
トリガで常に件数どっかに置いておく、とか
0429NAME IS NULL2008/04/03(木) 22:18:13ID:???
SSD買う金があったら、その金でメモリ買ったほうが良くね?
0430NAME IS NULL2008/04/04(金) 13:53:48ID:???
>>429
でも、8GB以上メモリを積めるマシンはそれなりの価格になるぞ。
0431NAME IS NULL2008/04/04(金) 15:29:07ID:???
SSD載せれるサーバもそれなりな価格になりそうだが^^;

最近とったメモリ大目の見積もりだと
クアッドコアのSMPでメモリ16GでSASの73GB(15000回転)でRAID10で
(保守とかその他オプションつけて)だいたい100万〜150万くらいだったかな
0432NAME IS NULL2008/04/04(金) 18:59:30ID:???
結局のところ、426がどれだけ予算をかけられるのかによるからなぁ。
0433NAME IS NULL2008/04/08(火) 17:59:30ID:JAlLqxhR
telnetでつないでpsqlでselect文だして、ちょっとした確認をすることが結構あります。
で、結果をマウスで選択、コピーして、使ったりしてるのですが、結果が多い時コピペが大変です。

そんな時、コマンドの>みたいにテキストに書き出すことはできないでしょうか?
0434NAME IS NULL2008/04/08(火) 18:19:36ID:???
例えばtest.sqlというファイルにSQLを書いておいて

psql -U postgres test < test.sql > test.result

こうすればtest.resultに結果が書かれると思うんだけど
これじゃだめ?
0435NAME IS NULL2008/04/08(火) 18:24:54ID:???
>>433
psql を -o オプション付きで起動するか
psql で \g ファイル名とするか。

こういう時は psql --help するか
psql で \? すれば大概分かるかと。
0436NAME IS NULL2008/04/08(火) 18:29:32ID:???
\o
0437NAME IS NULL2008/04/09(水) 03:58:11ID:???
teratermかpoderosaで繋いでログファイル指定しとく、とか
Windowsじゃなかったらアレか
04384332008/04/09(水) 13:44:15ID:vjpBiAeV
>>434
>>435
>>436
>>437
レスありがとうございます。

おっしゃる通り、ヘルプの存在をすっかり忘れてました。
失礼。

ログっていうのも手軽でいいですね。
0439NAME IS NULL2008/04/10(木) 00:56:47ID:???
手がかかる方法としてはsshでつないでport forwardしてPgAdminつかうという手も
0440NAME IS NULL2008/04/16(水) 12:46:24ID:xMO3l+R5
80万レコードほどあるテーブルの集計をとっているのですが
かなりコストがかかってしまい、15分ほどかかってしまっています。
単純なテーブル+単純なクエリなんですが、どこか改善できるポイントは
あるのでしょうか?
count_table
id|user_id|date

select user_id, count(*) AS Num from count_table
where date between '2008-01-01 00:00:00' and '2008-02-01 00:00:00'
group by user_id
order by Num desc
0441NAME IS NULL2008/04/16(水) 13:01:41ID:???
>>440

date列にindexを張るとか?
0442NAME IS NULL2008/04/16(水) 19:52:51ID:???
久しぶりに来たら進んでる・・・
>>306
そんなのSQLサーバ側で変わったら使えないと思ったんだが、
見た目文字列リテラルなのか、日付リテラルなのかは、コンテキスト次第だ
った・・

>>440
やっぱり、dateにINDEX張ってないと遅くなるね。って441と同じ意見であった。
データが膨らむからその時点でディスク容量が増えているか・・・。

INSERT系なら、
ttp://www.postgresql.jp/document/pg831doc/html/using-explain.html
で、幾分か速くなった。


04434422008/04/16(水) 19:55:44ID:???
補足: INSERT構文を最適化するのはこっちだった。。。
ttp://www.postgresql.jp/document/pg831doc/html/sql-prepare.html
0444NAME IS NULL2008/04/16(水) 22:27:02ID:???
>>442
他には月ごとにパーティショニングしてみるとか。
0445NAME IS NULL2008/04/17(木) 16:28:11ID:???
引っかき回すようで申し訳ないんですが
>>369-370
のような場合って、
on aa.code01=cc.code01 and cc.code002 =6
を
on aa.code01=cc.code01 and bb.code002 = cc.code002
という感じに変えて、最後にWHERE句でbb.code002 = 6
とやるのよりはやいの?

状況によりけりとは思うんだけど、どちらのほうがより安定しているのかな、とおもって。
04464402008/04/17(木) 18:38:38ID:???
>>441-442
アドバイスありがとうございます。
date にインデックスをはったら大分早くなりました。
というかめちゃくちゃ早くなりました。
0447NAME IS NULL2008/04/17(木) 22:19:51ID:???
失礼します。
pg_dumpallから生成されたファイルから、ある一つのDBだけリストアしたい
場合、コマンドとしてどのように実行すればよいでしょうか?
テンパってます。。。
0448NAME IS NULL2008/04/17(木) 23:03:32ID:???
-d オプションで指定してもだめでしたっけ?
最悪、ダンプファイルを開いて必要なとこだけ残してリストアする?

あまりお力になれず申し訳ない。
0449NAME IS NULL2008/04/17(木) 23:17:08ID:???
>>448
ありがとう、試してみます。
04504482008/04/17(木) 23:29:49ID:???
いい案が思い浮かばないままですが、

postmasterのインスタンスをもう一個起動して、そっちに放り込んだあと
必要なDBだけのダンプファイルを作成するのはどうでしょう?

ダンプファイルを直接編集するよりは楽かもしれません。。。
0451NAME IS NULL2008/04/17(木) 23:38:56ID:???
>>450
ありがとう、私もそれしか思い浮かびませんでした。
いったん別マシンのpostgresにフルで戻した後、必要なdbだけをdb_dumpして、
それを戻すようにしました。手間ですが、何とかなりました。
0452NAME IS NULL2008/04/18(金) 00:15:32ID:???
>>451
何とかなったようでよかったです。
おつかれさま。
0453NAME IS NULL2008/04/18(金) 10:11:21ID:TLsFyIeR
テーブルの主キーを変えるのってできませんか?

主キーを削除できればできそうですけど・・

お願いします。
0454NAME IS NULL2008/04/18(金) 10:56:55ID:???
616 名前:NAME IS NULL[sage] 投稿日:2008/04/18(金) 03:12:10 ID:???
MySQL、新機能追加は有償版の「MySQL Enterprise」だけを対象に
http://www.technobahn.com/news/2008/200804172000.html

Linuxを代表するオープンソースベースのリレーショナルデータベース管理システムのMySQL
が近くソースコードの公開を停止する方向で準備を進めていることが16日、米カリフォル
ニア州サンタクララで開催中のMySQLコンファレンスの席上で明らかとなった。
0455NAME IS NULL2008/04/18(金) 11:06:32ID:???
>>454
スレ違い

MySQL vs PostgreSQL Part2
http://pc11.2ch.net/test/read.cgi/db/1123011800/
こちらへどうぞ
0456NAME IS NULL2008/04/18(金) 11:14:49ID:???
嫌気がさした人はこっちに来そうですねw
0457NAME IS NULL2008/04/18(金) 22:09:27ID:???
ライセンスの問題からしてもこっちに移住する人は多いだろう
0458NAME IS NULL2008/04/18(金) 22:56:43ID:???
呼び込み運動をさりげなくしましょうw

『なんか大変ですね。よかったらこっちも試してみませんか。』
0459NAME IS NULL2008/04/18(金) 23:01:55ID:???
PostgreSQLの方がシンプルで好きなんだが・・・。
XOOPSが動けば、PostgreSQLに乗り換えたい。
0460NAME IS NULL2008/04/18(金) 23:13:45ID:???
>>457
つーか、ライセンスのこと気にする人は最初からこっちにいるでしょ。

>>459
へ? 動かないの? XOOPS コミュニティってそんな低レベルな世界だったんだ。
0461NAME IS NULL2008/04/18(金) 23:19:07ID:???
>460
PostgreSQLで動かしたことがあるのか?
推奨環境には、MySQLしかないようだが。
0462NAME IS NULL2008/04/18(金) 23:25:42ID:???
>>461
何言ってるの?
XOOPS って MySQL に依存しまくりのコーディングしてるの?
なんという前時代的な。

にしたって、それくらい改造出来るだろって話。
実際やってる例もあるみたいだし。
0463NAME IS NULL2008/04/18(金) 23:29:47ID:???
既知外ってなんでイキナリ喧嘩腰なんだろう。
0464NAME IS NULL2008/04/19(土) 01:18:47ID:???
共有ロック/排他ロックってどうやんの?
0465NAME IS NULL2008/04/19(土) 06:28:53ID:???
ロックなぞわざわざ「やる」ものではない。
0466NAME IS NULL2008/04/19(土) 09:32:09ID:???
>>464
行ロックなら SELECT ... FOR SHARE/UPDATE
表ロックなら LOCK tbl IN SHARE/EXCLUSIVE MODE
>>465
MVCCあるからあんまり必要ないのは同意。
でも SELECT FOR UPDATE くらいは使わないといけないこともよくある。
0467NAME IS NULL2008/04/19(土) 12:14:16ID:???
>>466
というより、SELECT FOR UPDATEはOracleやPostgresのように直接RRレベルを
サポートしないDBMSでRRが必要な場合に使うものと考えた方が良い。
下手にロックとか考えると、同期制御とごっちゃに理解して後々困ることになるからね。
OracleのRead Commitedは間違ってる、とかw
0468NAME IS NULL2008/04/19(土) 15:14:52ID:???
RRって何?
0469NAME IS NULL2008/04/19(土) 15:17:10ID:???
たぶん REPEATABLE READ
0470NAME IS NULL2008/04/20(日) 07:02:44ID:???
>>425
>pgperlを使う方式(旧称 pgsql_perl5)
>1995年のpostgres95の時代からPostgreSQL7.2.3まで PostgreSQLのソースの含まれていた Perlインタフェースで,
>libpqに似せたシンプルなインタフェースデザインとなっています.
>libpqライブラリが必要です.
0471NAME IS NULL2008/04/22(火) 13:52:15ID:qNcJmW6i
FETCHコマンドで
FETCH [ direction { FROM | IN } ] cursorname
とありますがFROMとINの違いってなんですか?

「INを使用するオプションはPostgreSQLの拡張です。 」としか書いてないし
実際に使ってみても同じ結果しか得られないし・・・
0472NAME IS NULL2008/04/22(火) 14:18:56ID:???
>>471
FROMが標準語で、INはPostgreSQLの方言ってだけかと
0473NAME IS NULL2008/04/22(火) 17:12:16ID:???
webページの言語をutf-8で作成してる場合は
PostgreSQLでもutf-8を使ったほうがいいんですか?
utf-8にしたことにより発生するエラーというものも有るんでしょうか?
0474NAME IS NULL2008/04/22(火) 23:14:06ID:???
今は外字も入るし、utf-8にしてもデメリットないんじゃないかな。
基本的にはドライバが吸収するから、webサイトとDBの言語は
別々に考えていいよ。そして、どっちもutf-8にすべき。
諸事情でwebをSJISにする場合でもDBはutf-8で
いいんじゃないかな
0475NAME IS NULL2008/04/23(水) 00:32:56ID:???
>>474
ありがとうございます!
統一できると、ローカル作業で言語切替の事を気にしなくていいのでよかったです
0476NAME IS NULL2008/04/23(水) 01:40:14ID:???
DBのエンコードがなんだろうがクライアントと関係ないんじゃ?
0477NAME IS NULL2008/04/23(水) 10:52:33ID:???
そうだな
まあ日本語以外のマルチバイト文字も考えなきゃならんときはUTF-8はありがたい
0478NAME IS NULL2008/04/23(水) 11:00:32ID:???
思いつきだけど UTF-8 とそれ以外じゃソートしたときに結果違わね?
0479NAME IS NULL2008/04/23(水) 11:17:38ID:???
ひらがなさえ同じならいいけどな
個別にソート用に表持たせることもあるかな
0480NAME IS NULL2008/04/23(水) 19:00:39ID:???
将来、PostgreSQL のバージョンアップで、
int 型を検索するときに
c = 1 ではなく、' で括った
c = '1' がエラーになる可能性はありますか?

PostgreSQL 8.3 にしたところ、text 型のカラムを検索する場合

where foo = 1;

ではエラーになりました。

int 型は括っても括らなくても使えているのですが、
SQL の標準とか、将来的にどうなのかな、と疑問に思って。
ご存じの方、よろしくお願いいたします。
0481NAME IS NULL2008/04/23(水) 19:28:27ID:???
>>480
↓が参考になるかも?
http://www.postgresql.jp/document/current/html/typeconv.html

個人的には
bigintとintとかtextとcharみたいにサイズが違う同じ型ならDBにまかせるけど
intとtextみたいに別物は明示的にキャストしてあげたほうがいいと思う。
0482NAME IS NULL2008/04/23(水) 19:45:46ID:???
>>480
その書き方で大丈夫。
クォートされていると型の決定は文脈依存で、適当に変換される。

ちなみに、若干似てるけど、
Java で PreparedStatement#setInt() の代わりに setString() するのはダメよ。
04834802008/04/23(水) 21:26:43ID:mDsa5IzI
>>481-482
ありがとうございます。

create table test(
text text,
int int
);

というテーブルにおいて、
8.2 までは select * from test where text = 1 は問題なく、
8.3 からエラーになるようになりました。

int 型のカラムは 8.3 でも
select * from test where int = 1; -- (1)
select * from test where int = '1'; -- (2)
のどちらも問題ありませんが、
8.4 や 9.0 になって (2) がエラーになることはありますか。
0484NAME IS NULL2008/04/23(水) 23:01:02ID:???
>>483
エラーにはならない。安心して (2) を使って大丈夫。
0485NAME IS NULL2008/04/24(木) 05:05:18ID:???
>>8.2 までは select * from test where text = 1 は問題なく、

これが、問題なく使えていたのを初めて知った。
気になったので確認したら、数字だと通ってたんだな。
0486NAME IS NULL2008/04/24(木) 08:04:22ID:???
>>485
正確には、型の不一致があったとき、両辺を勝手に text にキャストして比較していた。
where timestamp = 数字 とかも通っちゃってた。

いろいろと危険なので、変更されてよかったと思う。
0487NAME IS NULL2008/04/24(木) 13:49:37ID:LtHVlG1o
>>484
数字は 1 でも '1' でも危険はないから
今後とも大丈夫、ということなのでしょうか?
0488NAME IS NULL2008/04/24(木) 22:01:50ID:???
将来のことなので誰もなんとも言えないと思うけど、
可能性の話をするならエラーになる可能性はあるんじゃない?
もしくはエラーにはならなくてもtextで検索しにいくので
条件にマッチしない可能性とか
04894872008/04/24(木) 22:40:07ID:v9wdKkgn
確かに将来は分かりませんよね。
ありがとうございます。

SQL:1999 や SQL:2003 などの
SQL 標準的にはどうかご存知の方は
いらっしゃいませんか。
0490NAME IS NULL2008/04/24(木) 23:52:03ID:???
それを知ってどうするつもりなんだろ。
ちゃんと型あわせるようにしておけば大丈夫なだけじゃん。

どんな言語でも「やっぱ暗黙のキャストやーめた」となる可能性は
0じゃないよ
0491NAME IS NULL2008/04/25(金) 00:02:58ID:???
実行計画とると、解析後のSQL見られるけど
内部的にはかなりキャストしてるのが分かる

たいしたことは無いんだろうけど、表の結合条件でキャストが多いと
性能が落ちるかもしれんね
0492NAME IS NULL2008/04/25(金) 07:50:04ID:???
>>491
リテラルなら、SQLパースのあと1回だけキャストされて、処理中はすでにキャスト後になっている。
性能を心配する必要は無いよ。

そもそも「数字」といったって、int2/4/8, float4/8, numeric と
いろいろあるんだから、'' で括らなくても何かしらの変換が挿入される可能性はある。
0493NAME IS NULL2008/05/04(日) 14:06:49ID:???
8.3系で運用してる人いる?
過去バージョンと比較して使用感はどんなもんでしょうか
0494NAME IS NULL2008/05/07(水) 10:21:33ID:AHN5+Ycn
ユーザ会からpostgresをダウンロードしようとすると

Internet Explorer ではこのページは表示できません

になってしまいますが、サーバがこけてますか
0495NAME IS NULL2008/05/07(水) 10:40:52ID:???
他のミラーから取ってきたら?

ftp://ring.ocn.ad.jp/pub/misc/db/postgresql/
0496NAME IS NULL2008/05/07(水) 11:25:58ID:???
>>495
いけました。ありがとう。
0497NAME IS NULL2008/05/07(水) 14:23:09ID:???
>>493
8.2でパフォーマンスが凄く悪かったサーバが見違えるようによくなった。
他のサーバもそこそこ改善してるし今のところ人為的なのを除きトラブルはない。
無茶といわれてた大量UPDATEに耐えられるかな?
できるならそういうコードも書きたいのだが・・・
0498NAME IS NULL2008/05/07(水) 14:46:10ID:???
>>497
是非試していただければと思います。
0499NAME IS NULL2008/05/07(水) 17:10:05ID:???
Windows版のPostgreSQLを自動インストールする方法はありますか?
Windowsの他のプログラムから、インストーラを起動して自動的にイン
ストールできるようだといいのですが。

0500NAME IS NULL2008/05/07(水) 17:38:32ID:???
>>499
http://pginstaller.projects.postgresql.org/silent.html
0501NAME IS NULL2008/05/07(水) 18:30:16ID:???
>>497

具体的に8.2ではいけなかった処理ってなんとなく尻尾つかめてたりするのでしょうか・・?
0502NAME IS NULL2008/05/07(水) 21:34:20ID:Lqr18+2G
postgresql8.2のSQLで質問があります。

lent /*貸し出し管理*/
+id
+bookid 書籍ID
+lentdate 貸し出し日

book /*書籍*/
+id
+name 書籍名
+fromdate 有効期間(開始日)
+todate 有効期間(終了日)

select lent.lentdate, lent.bookid, min(book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    union
    select lent.id, lent.bookid, ... from lent. ... where 条件2
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

本当は、グルーピングしたlent.lentdateの最小値の日付でbook.nameを取得したいのですがやり方がわかりません。
仕方なく、下記のようにbook.fromdate || book.nameで取得して、フェッチ後にbook.nameだけ切り出そうと考えました。
select lent.lentdate, lent.bookid, min(book.fromdate || book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    union
    select lent.id, lent.bookid, ... from lent. ... where 条件2
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

しかしmin(book.fromdate || book.name)でグルーピング単位の最小値の値が返ってきません。ちょっと考えられない結果です。
試しにインラインビューの中のunionをやめてみたら、期待した値が返ってきました。
select lent.lentdate, lent.bookid, min(book.fromdate || book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

unionがいけないのか特定したくて、うまくいった条件1の方のSQLをunionで2本繋いでみるとNG(minの結果が変)になりました。
select lent.lentdate, lent.bookid, min(book.fromdate || book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    union
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

・インラインビューの実体がunionで繋がれた複数SQLであること
・そのインラインビューでグルーピングすること
・そのインラインビューに外部結合した値をmin()関数で取得すること

この辺でpostgresqlの制限に引っかかっているようなことがありませんでしょうか?
05034992008/05/07(水) 23:29:35ID:???
>>500さま
英語の方に解説があったのですね。
もう少しぐぐり方を工夫する事を覚えようと思います。
ありがとうございました。
0504NAME IS NULL2008/05/08(木) 09:31:00ID:???
>>502
min(book.fromdate || book.name) の部分で、日付が yyyymmdd に変換されると
期待してそうだけど、ちゃんと動作している?
単に、group by に book.name を含めるべきなのでは?

> minの結果が変
「変」とか「おかしい」とか言われても、助けられない。
具体的にどうなったのか、説明して欲しい。
0505NAME IS NULL2008/05/08(木) 12:59:40ID:???
>>504
レスどうもです。book.fromdatはchar(8)でYYYYMMDDの文字列が入っています。
>単に、group by に book.name を含めるべきなのでは?
book.nameは集約したグループの中でmin()を使って取得したいのでgroup byには含めないと思います。

「minの結果が変=グルーピング単位の最小値の値が返ってきません。」です。すみません。
「book.fromdate || book.name」の値が下記のような場合、
20080501書籍01
20080502書籍02
min()で"20080501書籍01"が取得されることを期待しましたが、"20080502書籍02"が返ってきています。
ちなみにmax()にすると"20080502書籍02"が返ってきます。(;・∀・)

インラインビューの中身を切り出して単独で実行してみると
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    union
    select lent.id, lent.bookid, ... from lent, ... where 条件1
必要なデータは取得されていることを確認しました。

group byを外して、全件そのまま出力させてみたら
20080501書籍01
20080502書籍02
の両方のレコードが取得されていることも確認できました。
あとはmin()で"20080501書籍01"が返ってくれさえすればOKなのですが。。
0506NAME IS NULL2008/05/08(木) 13:15:26ID:???
>>505
unionとか関係無しに単純に文字列のminとmaxをやったらどうなるの?
encodingは?
0507NAME IS NULL2008/05/08(木) 13:55:21ID:???
>>506
min(book.fromdate)とmin(book.name)を追加して実行すると
select lent.lentdate, lent.bookid, min(book.fromdate), min(book.name), min(book.fromdate || book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    union
    select lent.id, lent.bookid, ... from lent. ... where 条件2
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

min(book.fromdate) min(book.name) min(book.fromdate || book.name)
20080501 書籍02 20080502書籍02
というおかしな結果になります。min(book.fromdate)だけは正しい結果が返ってきてますね。

DBのエンコーディングはEUC_JPです。
0508NAME IS NULL2008/05/08(木) 13:57:57ID:???
すみません。>>505に誤りがありました。
誤:ちなみにmax()にすると"20080502書籍02"が返ってきます。
正:ちなみにmax()にすると"20080501書籍01"が返ってきます。
05095072008/05/08(木) 14:03:26ID:???
進展がありました。book.nameの値から全角文字を除去してみたところ
書籍01→01
書籍02→02

min(book.fromdate) min(book.name) min(book.fromdate || book.name)
20080501 01 2008050101

正しく集計されました。
もしかしてmin()関数の引数に全角文字が含まれるとおかしな動きをする、とかありますか?

0510NAME IS NULL2008/05/08(木) 14:06:09ID:???
book.fromdate || book.name
20080501書籍01
20080502書籍02

min(book.fromdate || book.name)
この場合、先頭の8文字で大小比較が完了するので、全角文字までの評価は行われないだろうと期待していましたが、
>>509の結果を見ると、そうでもなさそうですね?
0511NAME IS NULL2008/05/08(木) 14:53:27ID:???
>>509
どんな漢字が含まれるとmin()の動作に影響を与えるのか調べてみました。
「総合」が含まれていると×なようです。
どうも>>502の長いSQLは関係なかったようで、試しにbookテーブル単体で
select id, name from book
01, 総合20080501
01, 総合20080502

select id, min(name)
from book
group by id
01, 総合20080502 が返って来ました。ガーン。postgresqlのmin()関数が全角文字をサポートしていない?
>>502の代替手段がなくて困っています。
0512NAME IS NULL2008/05/08(木) 15:02:03ID:???
DBのEncodingはどうなってるの?
0513NAME IS NULL2008/05/08(木) 15:10:32ID:???
>>512
>>507
0514NAME IS NULL2008/05/08(木) 15:27:32ID:???
--no-locale付けた?
0515NAME IS NULL2008/05/08(木) 15:42:59ID:???
>>514
分かりません。Windows版なんですけど、付けたかどうかを確認する方法ってありますか?
でも、なんかビンゴっぽいですね。
0516NAME IS NULL2008/05/08(木) 16:02:08ID:???
>>515
Windowsかあ。createdbはどうしたの?インストール時ならチェックする項目あったかなー。

SELECT name,setting FROM pg_settings WHERE name ~ '^lc';
とかどう?
0517NAME IS NULL2008/05/08(木) 16:04:40ID:???
>>516
name setting
"lc_collate" "Japanese_Japan.932"
"lc_ctype" "Japanese_Japan.932"
"lc_messages" "Japanese_Japan.932"
"lc_monetary" "Japanese_Japan.932"
"lc_numeric" "Japanese_Japan.932"
"lc_time" "Japanese_Japan.932"
でした。ダメ?
0518NAME IS NULL2008/05/08(木) 16:05:54ID:???
あとは、pg_controldata コマンドでもいい。
0519NAME IS NULL2008/05/08(木) 16:06:32ID:???
>>517
noにすれば、そこは C になるはず。
noにしないとソート順狂うから、それだろうね。
0520NAME IS NULL2008/05/08(木) 16:15:06ID:???
>>519
ありがとうございます!
ちなみにinitdbからやり直さないとダメなんですよね。キッツイなぁ。createdb毎に指定できないものか。。
0521NAME IS NULL2008/05/08(木) 16:28:19ID:???
pg_dumpall ですぐだべ
0522NAME IS NULL2008/05/08(木) 17:01:28ID:???
>>521
やってみます!
0523NAME IS NULL2008/05/08(木) 17:24:44ID:???
ロカールの話で盛り上がっているようですが、
そもそもそれに依存しない抽出方法があるような気がします。

それぞれの本ごとに、一番古い貸し出し日および冊数を出したいのですよね?
0524NAME IS NULL2008/05/08(木) 17:28:36ID:???
切れてしまいました。

以下のような頻出事例と似てるような気がします。
http://pc11.2ch.net/test/read.cgi/db/1193486961/35-36
0525NAME IS NULL2008/05/08(木) 17:30:31ID:???
>>521
C:\>pg_dumpall -U postgres > pg_dumpall-20080508.dmp
postgresサービス停止
C:\>cd \postgres
C:\>mv data data-old
C:\>initdb --encoding=EUC_JP --no-locale -D C:\postgres\data
postgresサービス起動
C:\>psql -f pg_dumpall-20080508.dmp postgres
psql: could not connect to server: Connection refused (0x0000274D/10061)
Is the server running on host "???" and accepting
TCP/IP connections on port 5432?
C:\>netstat -a | grep 5432
postgresサービスが立ち上がらなくなってしまった!?
0526NAME IS NULL2008/05/08(木) 17:35:10ID:???
>>523
>それぞれの本ごとに、一番古い貸し出し日および冊数を出したいのですよね?
一番古い貸し出し日は抽出対象ではないのですが、
bookテーブルが世代管理されているので(同一idでfromdateとtodateで管理)
一番古い貸し出し日の時のbook.nameを世代を見て抽出したいのです。
0527NAME IS NULL2008/05/08(木) 17:43:12ID:???
>>525
postgresql.conf を data-old から data にコピーすればいいと思う。
0528NAME IS NULL2008/05/08(木) 17:43:40ID:???
>>525
そういうときは、ログとpostgresql.confをよく嫁
0529NAME IS NULL2008/05/08(木) 18:58:28ID:???
>>527 >>528
お騒がせしました。パニクって再インストールしてしまいましたw そしてその再インストールでも小一時間ハマってました。

ロケールをCにして再度SQLを実行したら期待通りの結果が返ってきました!!アドバイスをくれた皆さん本当にありがとうございました。
0530NAME IS NULL2008/05/08(木) 22:31:42ID:???
合わない locale と encoding を使ってしまうのは、頻出ミスだった。
v8.3 からは適合しない組み合わせはエラーが出力されるようになったので、
うっかりミスも減らせるはず。
0531NAME IS NULL2008/05/08(木) 23:12:35ID:???
ついに対策されたんだw
石井さん乙?
0532NAME IS NULL2008/05/08(木) 23:25:38ID:???
8.3リリースノートより:
> サーバのロケール設定と矛盾するデータベース符号化方式を不許可としました。(Tom)
0533NAME IS NULL2008/05/09(金) 00:38:51ID:???
テーブルの中の特定カラムを、AESとか、desとかで、暗号化する事って出来るんでしょうか?
プログラムで行えば出来るのは解っているのですが、
一部一致検索で、ひっかからなくなって困ってしまいました。
そこで、PostgreSQL自体で暗号化する方法があれば、部分一致検索も
正しく動作するのか?と考えました。
だれか、こんな事をやった事ないですか?
0534NAME IS NULL2008/05/09(金) 00:45:42ID:???
これ?
ttp://osb.sraoss.co.jp/PostgreSQL/Manual/PostgreSQL-8.0-ja/encryption-options.html

特定の列に関する暗号化

/contrib関数ライブラリ pgcryptoにより、あるフィールドを暗号化して保存することができます。データの一部が極秘データであるような場合に有用です。クライアントが提供した複合化用のキーで、サーバ上のデータを複合化し、クライアントに返されます。

複合化されたデータと復号化用のキーは、復号処理中およびクライアントサーバ間の通信中サーバ上に存在します。このため、データベースサーバへの全てのアクセス権限を持つユーザ(例えばシステム管理者)によって、データとキーが盗まれる瞬間があります。
0535NAME IS NULL2008/05/09(金) 01:53:57ID:???
>>532
トム。。。
0536NAME IS NULL2008/05/09(金) 07:54:44ID:???
>>533
部分一致検索したいのなら、ファイルシステムレベルで暗号化しないとだめ。
ただ、SELECT * で普通に元の値を取得できてしまうのが難点かも。

pgcryptoのような方式で、部分一致検索できるようにしてしまうと、
暗号化の強度としてはゼロに等しい。難読化くらいの価値しかない。
大小の順序を保つ必要があるので、二分検索で簡単に特定されちゃう。
0537NAME IS NULL2008/05/09(金) 08:42:47ID:???
>>536>>534

こういう話出す人はもう少し暗号の勉強をして、表現力を養ったほうがイイよね。
権限を持つ者がデータを持っていけるのは、暗号とは相関性が無いんだよ。
無駄に暗号強度とか持ってくるから、「説得力があると騙される無知な人も居る」と覚えておこう。
0538NAME IS NULL2008/05/09(金) 16:32:04ID:???
create table members (
id integer primary key auto_increment,
name varchar(256) not null,
birth date,
gender char(1) not null
)

というテーブルがあって、birth と gender でグループ分けしたいとき、どうしたらいいですか。
select birth, gender from members group by birth, gender だと id が分からず、
select id, birth, gender from members group by birth, gender だと エラーだし、
どうしたらいいんでしょう?

0539NAME IS NULL2008/05/09(金) 17:20:05ID:???
何がしたいのかによる。
birthとgenderでグループ化したらそのグループに複数のidが含まれる可能性があるから
そのまま出すのは無理。
最大値 max(id) とか、一つに特定できるのならばそれが使えるけど。
0540NAME IS NULL2008/05/09(金) 18:00:55ID:???
>>539
ですよねー
やりたいのは、まさにグルーピングであり、複数のidをグループごとにとりだしたいんです。
でもSQLではなんかうまくできなくて...すごく不自由しています。
こんなとき、みなさんどうしてますか。やっぱりPL/SQLとか使わないといけないんですかね。
0541NAME IS NULL2008/05/09(金) 18:13:23ID:???
複数idが必要ならグループにする理由がないのでは?
具体的に、どんなデータからどんなデータを抽出したいのか書いてくれればわかるかもしれん
0542NAME IS NULL2008/05/09(金) 18:51:20ID:???
select id, birth, gender from members order by birth, gender
とか?
0543NAME IS NULL2008/05/09(金) 19:17:14ID:???
元のデータ
 id | name |  birth  | gender
------------------------------
1 | test1 | 2008-05-09 | M
2 | test2 | 2008-05-10 | F

抽出結果
 ?? | ?? | ?? 
--------------
x | xxxx | xx
x | xxxx | xx

こんな感じに
0544NAME IS NULL2008/05/09(金) 20:39:07ID:???
>>537
で、あなたはいったいなんの役に立っているの?
0545NAME IS NULL2008/05/10(土) 02:51:14ID:???
>>543
抽出結果が伏せ字だらけ、、、はっ!これが暗号ってやつDESか?
0546NAME IS NULL2008/05/10(土) 08:50:59ID:???
>>538
idを配列として取り出してみては?
http://www.postgresql.jp/document/current/html/xaggr.html
のarray_accumを参考に。
0547NAME IS NULL2008/05/10(土) 13:49:28ID:???
>>537

>>534はドキュメントのコピペですよ。

どの経路をどういう目的で暗号化したいかによって全然変わってくると思う。
>>533の文面から察するに、ディスク上のデータを暗号化したいだけで、サーバ上のメモリとか通信路の上では暗号化されなくてもいいみたいだし。
0548NAME IS NULL2008/05/10(土) 23:13:17ID:???
>>547

> >>534はドキュメントのコピペですよ。
それは見れば解る。

> どの経路をどういう目的で暗号化したいかによって全然変わってくると思う。
> >>533の文面から察するに、ディスク上のデータを暗号化したいだけで、
> サーバ上のメモリとか通信路の上では暗号化されなくてもいいみたいだし。

キミに知識があるのは理解したけど、
具体的な部分を引用で誤魔化しただけじゃ意味が無い。

>>533みたいな質問を恥ずかしくなくできる程度だと、
その引用が役立つとは思えない。
暗号の基礎を学ぶ方が先決と感じるけどね。
0549NAME IS NULL2008/05/10(土) 23:41:57ID:???
>>547

部分一致検索が出来る方法を探していたので、
メモリー上や通信経路上での暗号は別問題って事で。

534や536のpgcryptoを試してみます。
0550NAME IS NULL2008/05/11(日) 16:40:36ID:nKIrUfLq
postgresqlをlinuxにインストールしてみましたが、
jdbcがありませんでした。
jdbcのみインストールできるサイトはありませんか?

よろしくお願いいたします。
0551NAME IS NULL2008/05/11(日) 18:12:16ID:hAgtRqsE
>>550
本家->downloadでDLのページいってみては?
0552NAME IS NULL2008/05/11(日) 18:44:24ID:???
複数のサーバに分散させてたアクセスログテーブルを一サーバにまとめる
作業をしてるのだけど、IDカラムをPRIMARY KEYにするために
数字を重ならないように振り直す良い方法ない?

連番である必要はないのだけど、
UPDATE id = nextval('foobar_id_seq');
だとトランザクションが完了までにストレージの容量不足であぼ〜ん。

データベースが500Gでストレージ容量が800Gな感じ。
行数はpgAdminの概算で10億のオーダー(実際にもたぶんそんなもん)。
Intel 8コア2Ghz、メモリ6Gで丸一日動かすぐらい以下で終わるとうれしい。
0553NAME IS NULL2008/05/11(日) 19:33:49ID:???
>>548
暗号の基礎というのが想像つかないけど、公開鍵暗号とか、ハッシュ関数?AliceとかBobがいて、…みたいなことかな。
よかったらポインタとかキーワードください。

部分一致検索「できない」ところに暗号化する意味があるといえばあると思うんだけど、暗号化されたままのデータに対するプログラムによる処理、という研究領域もあったような。
まだ実用段階ではないはず。
0554NAME IS NULL2008/05/11(日) 20:59:34ID:???
>>552
250GBぶん処理 → VACUUM → 残りの250GBを処理
で、750GBぎりぎりに収められるような気はするけど、効率的では無いね。

オリジナルの各サーバからデータをダンプすると思うのだけれど、
そのときについでにIDを再割り振りしてはいかがでしょ?
COPY (SELECT ID + <サーバごとのオフセット>, <ID以外の属性> FROM tbl) TO ...
みたいな。
0555NAME IS NULL2008/05/11(日) 21:49:59ID:???
>>554
レスどうもです。
すでにpg_dumpでテーブルを圧縮ダンプしてオリジナルを消してしまって
いるのですが、書き戻しつつまったりやってみます。

スタンドアロンで起動してチョメチョメするとUPDATEがトランザクションを
作らずできるとかあると良かったのですが。
0556NAME IS NULL2008/05/11(日) 22:49:47ID:nKIrUfLq
>>551
このやり方だとすべてをインストールしなければならないですよね?
jarファイルだけほしいんですが・・
0557NAME IS NULL2008/05/11(日) 23:05:40ID:???
>>556
つ 本家 [ttp://jdbc.postgresql.org/]
0558NAME IS NULL2008/05/12(月) 00:19:43ID:???
新しい列を追加してサーバID+IDカラムを主キーにすれば?
0559NAME IS NULL2008/05/12(月) 02:57:40ID:???
>>548

>>534はpostgres標準でカラムごとに暗号化する方法が用意されてるよ
というポインタを出しただけだろう。なんでそんな喧嘩腰なん?


0560NAME IS NULL2008/05/12(月) 13:03:06ID:???
>>543
せめてどの列に何のデータが欲しいかくらい書いて下さい。
0561NAME IS NULL2008/05/12(月) 14:25:10ID:???
>>560
>>543は質問者への例だよ。
質問者が>>542みたいなこと書くからさ。
0562NAME IS NULL2008/05/12(月) 16:11:58ID:???
>>561
ごめんよ('A`)
0563NAME IS NULL2008/05/12(月) 19:38:57ID:???
wal_sync_methodをfsync,open_sync,fdatasyncの3つで試したのですが
以下の通りほぼ同じ数字なのですがこの場合どれを使えばいいのでしょうか?

■fsync
tps = 1027.689818 (including connections establishing)
tps = 1209.468247 (excluding connections establishing)

tps = 1034.481365 (including connections establishing)
tps = 1216.056506 (excluding connections establishing)

tps = 752.244097 (including connections establishing)
tps = 845.057033 (excluding connections establishing)

■open_sync
tps = 1052.034042 (including connections establishing)
tps = 1242.544732 (excluding connections establishing)

tps = 1028.417258 (including connections establishing)
tps = 1211.121120 (excluding connections establishing)

tps = 1019.530379 (including connections establishing)
tps = 1204.729693 (excluding connections establishing)

■fdatasync
tps = 775.081298 (including connections establishing)
tps = 873.168620 (excluding connections establishing)

tps = 1016.433399 (including connections establishing)
tps = 1197.497231 (excluding connections establishing)

tps = 1022.273040 (including connections establishing)
tps = 1208.232215 (excluding connections establishing)
0564NAME IS NULL2008/05/13(火) 23:21:07ID:???
Direct I/Oが効くからopen_syncでいいんじゃね?
たまにバグ持ちのOSもいるけど。
0565NAME IS NULL2008/05/14(水) 16:50:51ID:???
VACUUM FULLをやるとすごい時間かかると聞いていたけど、3分くらいで終わってしまった。
テーブルは200個くらいで、多いテーブルでもレコード数は20,30万レコードくらい、大半は数千、数万程度
これってだいぶ少ない感じだからかな?それともdumpを戻してからあまりデータが更新されてないから
汚れてないってことで早かったんですかね?
後、VACUUM FULL テーブル名って感じでテーブルのみ指定できるけど、これを
全テーブルやれば、VACUUM FULLやったときと変わらないのでしょうか?
0566NAME IS NULL2008/05/14(水) 19:31:16ID:???
>>565
>dumpを戻してからあまりデータが更新されてないから
> 汚れてないってことで早かったんですかね?

> これを全テーブルやれば、VACUUM FULLやったときと変わらないのでしょうか?

いちいちその通りでなにも返す言葉がない
0567NAME IS NULL2008/05/16(金) 22:29:54ID:???
sequenceの値を自分で設定することは出来ますか。
今は 1 から始まっているのをたとえば10000から始めたいんですが。
0568NAME IS NULL2008/05/16(金) 22:51:10ID:???
ttp://ash.jp/db/pg_use.htm
答えを知らない俺がググって10秒で分かる内容を質問する勇気に感心した。
05695672008/05/16(金) 22:57:55ID:???
自己レスです。setval()関数でできるようです。
05705672008/05/16(金) 22:58:21ID:???
>>568
すみません
0571NAME IS NULL2008/05/17(土) 00:28:43ID:???
使用環境はXPなんですが
COPYでテーブルのデータを全てCSVに落としたいのですが
文字列が2重引用符で囲まれなくて困っています。

COPYの説明読む限り、デフォルトは2重引用符となっています。
QUOTEで直接指定しても変わりありません。
0572NAME IS NULL2008/05/17(土) 09:40:53ID:???
>>571
FORCE QUOTE
0573NAME IS NULL2008/05/17(土) 13:30:17ID:???
FORCE QUOTEってカラム指定しないと駄目ですよね?
文字列だけ指定した引用符で囲いたいんですが
単純にQUOTEだとNULL文字だけしか引用符で囲ってくれないんです。
0574NAME IS NULL2008/05/17(土) 13:54:31ID:???
文字列型のカラムを全部指定すればいいじゃん。
0575NAME IS NULL2008/05/17(土) 17:56:34ID:???
集約関数のパラメータとなるような複数行のデータを表現する式というのはありますか?

こういう感じのことをしたいのですが

SELECT * FROM TABLE1 ORDER BY MAX(COL1,COL2,COL3); // COL1〜3のなかで最大の値を取りたい

0576NAME IS NULL2008/05/17(土) 17:57:02ID:UrIKqt4y
しまった。
習慣でsageてしまった・・・
0577NAME IS NULL2008/05/17(土) 18:58:10ID:???
>>575
greatest() かな。max(greatest(col1, col2, col3))
0578NAME IS NULL2008/05/19(月) 20:51:28ID:KbQaa3g3
2chのような掲示板を作ろうと、以下のテーブル構成を考えています。
この場合、連番はどうやって取るのがスマートでしょうか?

板(板No、・・・)
スレッド(板No、スレッドNo、・・・)
レス(板No、スレッドNo、レスNo、・・・)

板Noはシーケンスでいいとして、スレッドNoとレスNoの取り方で迷っています。
Max(レスNo) + 1で取るのがいいか、発番テーブルを作るのがいいか。
あるいはもっとスマートなやり方があるのでしょうか。

アドバイスお願いします。
0579NAME IS NULL2008/05/19(月) 22:29:57ID:???
スレッドも(big)serial型でいいんじゃ?規則正しく連続してる必要ないよね?
insert 〜 select 〜でいいんじゃない?
発番号テーブルとか作ってわざわざ整合とりにくくする必要性無いと思う
0580NAME IS NULL2008/05/20(火) 01:06:45ID:yIeco2cc
あいうえお<br><h1>かきくけこ</h1>

というデータが入っていたとしまして、SQLでこのタグ(<>で囲まれている文字列)を省き、

あいうえおかきくけこ

として検索できるようにする方法はありますでしょうか。
もしありましたらご教示いただけますと幸いです。

宜しくお願いします。
0581NAME IS NULL2008/05/20(火) 02:47:41ID:???
>>580
> SQLでこのタグ(<>で囲まれている文字列)を省き、

regexp_replace(データ,'<.*?>','','g')
0582NAME IS NULL2008/05/20(火) 09:41:17ID:???
取り出してからの切った貼ったですかね。
0583NAME IS NULL2008/05/21(水) 09:35:37ID:LdhCgnd0
よろしくお願いします。

金額を入れるカラムは、精度の高いnumericを使用した方がよいと聞いたのですが、
マニュアル等で調べたところ、そのカラムに整数しか入らない場合はinteger等で十分のような気がするのですが
この考え方で合っていますでしょうか?
0584NAME IS NULL2008/05/21(水) 09:58:22ID:???
10/3*3とか?
05855832008/05/21(水) 11:52:47ID:???
>>584
確かにその場合は小数点があるのでnumericが必要ですよね。
必ず整数しか入らない前提の場合はintegerでも良いと思ってよいでしょうか。

「精度」の意味がよく分かっていないかもしれませんが、
整数しか格納しないのであれば、numericもintegerでも計算で誤差は生まれないと
思っているのですが。。
0586NAME IS NULL2008/05/21(水) 13:33:19ID:???
SQLで計算はしないのか?
05875832008/05/21(水) 17:20:11ID:???
>>586
SQLで計算はしないOR計算しても小数点が出ないという前提です。
0588NAME IS NULL2008/05/21(水) 20:30:49ID:???
>>583
numericが「何と較べて」精度が高いのか聞かなかった?

真数値: numeric integer
概数値: real float

あと、「精度」といっているのが誤差の少なさなのか
有効数字のことなのか。

「金額〜」という文脈で精度のことを言うときは、上記の
真数値である(誤差がない)ことを言う場合が多い。
0589NAME IS NULL2008/05/22(木) 07:29:35ID:???
そもそも、通貨って円だけじゃないし
日本でも銭まで必要なこともあるし

そういうのを踏まえて必要かそうでないか判断しては
05905832008/05/22(木) 10:19:23ID:???
>>588,589
レスありがとうございます。

元々、素人DB設計者がnumeric(10,0)としていたので
突っ込んでやりたいなと思って質問しました。

>numericが「何と較べて」精度が高いのか聞かなかった?
金額の計算をする時、integer等と比較しての話として精度が高いと聞きました。

なので、「精度」は
>真数値である(誤差がない)ことを言う場合が多い。
こっちのことだと思います。

>日本でも銭まで必要なこともあるし
情報小出しですいません。
私も、numericを使うことに異論は無いのですが、
もともとのカラムがnumeric(10,0)だったんです。。

「精度が高い」と人から聞いただけで、「精度」の意味も考えずに
numeric型を採用しているDB設計者に対して
「小数以下格納しないならintegerでいいじゃないですか」という理由が欲しかった次第です。

低レベルな話ですごく申し訳ないです。。
0591NAME IS NULL2008/05/22(木) 10:48:29ID:???
整数としてしか扱わない、というのなら整数でもいいんじゃない?
金額を扱う場合はnumericと決めている、のならnumericでもいいし。
0592NAME IS NULL2008/05/22(木) 12:10:45ID:???
numericだのintegerだの云々言いたい583は、当然
ttp://ja.wikipedia.org/wiki/%E4%BA%8C%E9%80%B2%E5%8C%96%E5%8D%81%E9%80%B2%E8%A1%A8%E7%8F%BE
あたりの知識はあるんだよな?

まあ、ヲレはPostgreSQLでnumericがどう実装されているか知らないけどさ。
0593NAME IS NULL2008/05/22(木) 21:03:28ID:???
整数を扱うとき、numeric型とinteger 型と選ぶ基準は
扱う桁数でいいだろ。
お金だと桁数10桁で足りない事もあるし、そういうときはnumericでいいんじゃね?

俺は、Java上で金額計算するから格納時には桁数roundしてるから
入れ物さえあれば問題ない。

>>590
逆になんでnumericなのか聞けば?
俺は桁数が分かるという利点でnumericにしてるんだと思うがね。
DBのポータビリティを考えて、もう1層上でテーブル設計してるんじゃないか?
0594NAME IS NULL2008/05/22(木) 21:10:58ID:???
>>590

うちも同じようなテーブル設計があったので、直せるところはintにしま
した。物の個数ですらnumericでやってあったから、さらに低レベルかも。
intかbigintの方がコンパクトで高速と思ってます。
05955902008/05/23(金) 12:41:48ID:???
>>591-594
レスありがとうございます。

とりあえず、DB設計者になぜnumericなのか聞いてみた結果
→「これがいいって聞いたから」

あとは愚痴スレ行きます。。

>俺は、Java上で金額計算するから格納時には桁数roundしてるから
>入れ物さえあれば問題ない。
私も同じようにしようと思います。

ご助言いただき、ありがとうございました。
0596NAME IS NULL2008/05/24(土) 07:11:45ID:???
>>565
ごめん嘘書いちゃった
テーブル指定無しで実行しないとシステムカタログがvacuumされないらしい
http://www.thinkit.co.jp/cert/marugoto/2/1/13/2.htm
0597NAME IS NULL2008/05/25(日) 19:07:27ID:???
>>596
いや、システムカタログ名を指定すればできるだろう。
 VACUUM pg_class;
とか。面倒だから普通は autovacuum に任せるけど。
0598NAME IS NULL2008/05/27(火) 14:05:46ID:ZU6uB09A
結合条件にLIKEなどを使って
あるカラムが別テーブルのカラムを含んでいる行と外部結合ってできないでしょうか?

SELECT o.foo, u.bar FROM hoge o LEFT OUTER JOIN huga u ON o.foo LIKE '%'||u.bar||'%';

じゃだめでした。
なんかうまい方法ないでしょうか?
0599NAME IS NULL2008/05/27(火) 14:38:11ID:???
ONのあとは結合条件、o.foo LIKE '%'||u.bar||'%'はWHERE句に
06005982008/05/27(火) 14:43:16ID:ZU6uB09A
すいません。
↑のでできてました。

結合するテーブルにINSERTするデータが間違ってるだけでした。
お騒がせしました。
0601NAME IS NULL2008/05/29(木) 01:30:00ID:+Ml1/7K+
日本語データをinsertし、その後格納データ確認のためselectしてみたところ、
以下のようになってしまっておりました。

<BD><BE><CD><E8><CA><FC><C1><F7><A4><B5><A4><EC><A4><BF>
<C8><D6><C1><C8><C5><F9><A4><CF><A1><A2><A5><C6><A1><BC>
<A5><D7><C7><DE><C2><CE><A4><C7><CA><DD><C2><B8><A4><B5>
<A4><EC><A4><C6><A4><A4><A4><BF><A1><A3><A4><DE><A4><BF><A1><A2>

しかしながら、プログラムから同様のSQL文でデータを出力してみたところ、
正常に日本語が表示されました。

本現象に関して何かアドバイス等ございましたらいただけますと幸いです。
宜しくお願いします。
0602NAME IS NULL2008/05/29(木) 05:49:30ID:???
select文を発行したときと
プログラムからのselect時との
client_encodingの違いを意識してるか?

0603NAME IS NULL2008/05/29(木) 10:42:05ID:???
>>601
その<BD><BE><CD>・・・を出力してるのはページャー(more とか lessとか)
そのページャーがその文字コードに対応していない。
ページャーを何とかするか、ページャーにあわせてクライアントエンコードを変更する。
0604NAME IS NULL2008/05/29(木) 21:28:20ID:???
どこかにWinでpgAdminからSlony-Iの使い方解説したサイトはないものか
0605NAME IS NULL2008/05/30(金) 10:10:15ID:???
HELPでいいやん
0606NAME IS NULL2008/06/02(月) 17:13:40ID:???
>>597
いやできない。試しにやってみるとこうなる。
WARNING: skipping "pg_user" --- cannot vacuum indexes, views, or special system tables


autovacuumまかせにできるのは小規模だけだろ。
数GB程度のデータ規模でも、アクセスが少ない時間をねらって
毎日vacuumしないとvacuum時間が長くなって大変。
0607NAME IS NULL2008/06/02(月) 17:30:20ID:???
autovacuumを頻繁に行い、一回あたりの時間を短くする
0608NAME IS NULL2008/06/02(月) 17:51:00ID:???
>>606
pg_userはVIEWですよ。VACUUMできるわけが無いし、する必要も無い。

あと、最近のバージョンだと、vacuum_cost_delayを調整して
vacuum時間を「長くする」側にチューニングしたほうがよい。
レスポンスに影響が無いなら、時間が延びてもデメリットは無い。

「毎日vacuumしないと」も間違い。テーブルによっては、それこそ数分間隔で
VACUUMが必要な場合もあるし、年単位で十分なテーブルもある。
手作業でチューニングするくらいならば、autovacuumのほうが楽だし効率も良い。

VACUUMの運用法は、ここ数年で大きく変わってきているので、
あまり古い考えにこだわり過ぎないことをお勧めする。
0609NAME IS NULL2008/06/02(月) 18:21:54ID:???
特に8.3ではHOTのおかげでvacuumする必要性がだいぶ低くなってきたからねぇ。
0610NAME IS NULL2008/06/02(月) 19:24:19ID:???
8.3て、致命的問題なく動いてる?
0611NAME IS NULL2008/06/02(月) 20:04:27ID:???
>>608
そっか。確かにpg_typeならvacuumできたわ。

>>607
autovacuumって頻度指定できんの?
0612NAME IS NULL2008/06/02(月) 20:13:45ID:???
8.2でautovacuumだけで運用してたらあんまりvacuumされなくて
手動でやるようにしたんだけど。
一日数万件のinsert/deleteがあるのに何日間かvacuumされて
なかったんだよ。んでpgAdminで繋いだらautovacuum設定しろしろうるさい。
してあるのに。

バッチで実行すれば「アクセスが少ない時間帯にvacuumが完了」するように
指定できるし、vacuum実行時間のログもシステム側に残る。

autovacuumが効率よくvacuumかけてくれる事を説明してるURLある?
0613NAME IS NULL2008/06/02(月) 21:07:26ID:???
>>611
autovacuum_naptimeで最小間隔の指定は出来るし、
autovacuum_vacuum_thresholdやらautovacuum_analyze_thresholdやら
いろいろ設定可能

>>612
stats_row_level = onにはなっているよね?
0614NAME IS NULL2008/06/02(月) 22:55:08ID:???
>>612
そのテーブルだけ pg_autovacuum.vac_base_thresh で設定すると良いかも。
別に、バッチVACUUMとautovacuumは排他じゃないから、
むしろ両方とも設定した方が問題が少ないことが多いかな。
0615NAME IS NULL2008/06/03(火) 02:16:34ID:???
今は両方セットしてあるんだけど、とあるテーブルだけ8GBくらいあって
日中にvacuum走ると使い物にならなくなってしまうので、
autovacuumは切ろうかと思ってる。
てか毎日vacuumしてて空き領域が良好な状態だったら
autovacuumは走らないものなの?
0616NAME IS NULL2008/06/03(火) 02:59:46ID:???
>>615
とりあえず、autovacuumが行われるタイミングに関しては
ttp://search.net-newbie.com/pgsql/routine-vacuuming.html
参照。
0617NAME IS NULL2008/06/03(火) 04:26:12ID:???
サンクス
閾値を超えなきゃvacuumされないのね。
とりあえず数万件の削除は日毎バッチで行われていて、
手動バキュームはその直後に行うようになってるから、
よりベターなタイミングっていうのは無いと思うのよ。
とりあえずこのまま行く
0618NAME IS NULL2008/06/03(火) 16:19:23ID:???
クライアントからODBCを使ってサーバのデータベースに繋ごうと思って
ttp://www.advancesoft.co.jp/wiki/?PostgreSQL%B3%B0%C9%F4%C0%DC%C2%B3%CA%FD%CB%A1
のサイトに記載してある通り、pg_hba.confとpostgresql.confを編集して接続を試しても、
Could not connect to the server.
No connection could be made because the target machine activety refused if.
とエラーが出てしまい繋げません。
サーバのlocalhostでの接続は可能でした。

何か原因わかる方いませんでしょうか?
ちなみに環境は
サーバ Windows 2000 Server SP4
クライアント Windows XP SP2
です。
0619NAME IS NULL2008/06/03(火) 16:22:44ID:???
>>618
せめてnetstatの結果ぐらい確認しろよ
0620NAME IS NULL2008/06/03(火) 16:53:16ID:???
>>619
調べてみたら5432のポートが開いてない感じがしたのですが、
その場合どういった対策をすればいいのでしょうか?
postgresql側での設定が必要なのでしょうか?
宜しくお願い致します。
0621NAME IS NULL2008/06/03(火) 17:13:06ID:???
>>620
感じがした、って…オマ…
火壁とかどうなってんの? Windows知らんから、これ以降は誰か頼む。
0622NAME IS NULL2008/06/03(火) 17:32:40ID:???
まず、pgAdminIIIで接続できるか確認してごらん。
つながるならODBCの設定があやしいし、
つながらないならpingとかでネットワークで到達できるかからやってごらん。
0623NAME IS NULL2008/06/03(火) 17:34:24ID:???
>>622
そんなことせんでも telnet で 5432 に繋げればすぐ分かる。
0624NAME IS NULL2008/06/03(火) 17:58:57ID:???
pgAdminIII使ったほうがあとあと役に立つと思ったんだけどな。
0625NAME IS NULL2008/06/03(火) 18:57:11ID:???
>>621-624
ありがとうございます。
pingは無事に到達します。
Windows 2000 Serverにファイアーウォールはないと思うんで特に設定はしていません。
とりあえず今は触れる環境にないので、明日もう少し試してみます。
0626NAME IS NULL2008/06/03(火) 19:04:03ID:???
>>625
お前が"postgresql ポート 設定"でぐぐることすらできないのと、
telnet foobar 5432すらできない知能なのは良くわかったから、
きちんとお勉強してくるまで出入り禁止。
0627NAME IS NULL2008/06/03(火) 20:19:57ID:???
netstatで調べたら5432が開いてないとなったんでしょ?
なのに火壁が!pingが!とか言ってるのはナニ?

pg_hba.confの、この部分もコピペしたとかじゃなくて?
# ローカルのみの設定
host all all 192.168.1.0/24 trust

LANの設定にあわせて記述してますか?
192.168.0.0/24 とか。
0628NAME IS NULL2008/06/03(火) 20:26:08ID:???
>>627
開いてない感じがしただけで
開いてないとは誰も言っていない罠www


>>625
ま、実際にLISTENポートとしてリストされなかったなら、
設定が悪いだけだから、見直して再設定すればいい。
0629NAME IS NULL2008/06/03(火) 20:28:37ID:???
馬鹿は放置しとけよ…
0630NAME IS NULL2008/06/03(火) 20:46:21ID:???
feelingで話を進めた段階でアウトです。

分からない事は分からない。
それを素直に出せないのは、
眼鏡をかけた新人の女の子までしか許されません。
0631NAME IS NULL2008/06/03(火) 21:05:04ID:???
postgres.confのlistenだろ
0632NAME IS NULL2008/06/03(火) 21:14:53ID:???
>>628
しまった!><
0633NAME IS NULL2008/06/03(火) 21:21:02ID:???
>>631
別のポート番号にしたいとき、そこ変えて、service postgresql startとやっても
反映されなくてハマったよー
0634NAME IS NULL2008/06/04(水) 03:02:48ID:???
>>615
>>612の通りだ。
pg_autovacuumテーブルでそのテーブだけ除外してやんな。
で、夜間にvacuumすればよろし。
0635NAME IS NULL2008/06/04(水) 03:04:30ID:???
>>634

ミスったw
>>615 → >>614

吊ってくる
0636NAME IS NULL2008/06/04(水) 11:58:40ID:???
ちょっと質問させてください。
インデックスを複数同時に張るのって、1つ張り×複数とは別のときに効果を発揮する……のでしょうか?
前任者が張りまくっていたものを整理しているのですが、どうなんだろうと思いまして。

1.id, name, dateが指定されたインデックス
2.nameのみが指定されたインデックス
3.nameがインデックス指定+where id=10 と記述

が存在。
1は、その3つを同時にwhere使用する場合にしか使われない? それともidだけをwhere指定する場合でも使ってくれるのでしょうか?
教えて頂ければありがたいです。
0637NAME IS NULL2008/06/04(水) 12:02:19ID:???
aというカラムに「テスト1 テスト2 テスト3」や「テスト1 テスト3」、「テスト2 テスト3」といったようにスペース区切りでキーワードが入っていたとして、条件をテスト1もしくはテスト3に設定し、各種レコードでヒット数を表示するようなことは不可能でしょうか。
本条件の場合、はじめのレコードはヒット数2、2番目は2、3番目は1となれば期待通りとなります。

不可能かとは思いますが、もしもやり方がありましたらご教示いただけますと幸いです。
宜しくお願いいたします。
0638NAME IS NULL2008/06/04(水) 13:37:07ID:???
>>636
8.1だか8,2だかあたりから個別にidだけ使用しても
見るようになった。8からかもしれん。
8のリリースノート見てみて。

一般的にはインデックスを貼った順序通りにWHRE句に書かないと
使ってくれない。その組み合わせでハッシュコード生成するから。
貼ったインデックスより長い条件なら見てくれるけど。

カラムA,B,Cがあって、(A,B)にインデックスが貼ってあったらこうなる。
○WHERE A=x AND B=y
×WHERE B=y AND A=x
○WHERE A=x AND B=y AND C=z

で、新しいバージョンなら個別に貼ってあっても(効率は落ちるだろうけど)
インデックスを見るようになった
0639NAME IS NULL2008/06/04(水) 13:44:28ID:???
>>637
postgresの質問じゃねーけど。
こんな感じでできないかなあ。

SELECT A.ID,
(CASE B.ID WHEN NULL THEN 1 + CASE C.ID WHEN NULL THEN 1)
FROM
テーブル A
LEFT OUTER JOIN テーブル B ON B.ID = A.ID AND B.カラム LIKE '%テスト1%'
LEFT OUTER JOIN テーブル C ON C.ID = A.ID AND C.カラム LIKE '%テスト3%'

SELECTのところはこれじゃ動かないかもだから工夫してみて。
できたらここで報告よろ
0640NAME IS NULL2008/06/04(水) 13:54:58ID:???
ん?
カラムA,B,Cがあって、(A,B)にインデックスが貼ってあったら
○WHERE A=x AND B=y
○WHERE B=y AND A=x
○WHERE A=x AND B=y AND C=z
×WHERE B=y
じゃない?

で、最近は最後のパターンもOKになったんじゃ?



0641NAME IS NULL2008/06/04(水) 14:08:09ID:???
>>637
スペース区切りでキーワード入れちゃってる時点でrdbmsとして終わった感が・・・

create temp table test(id int primary key,a text);
insert into test values(1,'テスト1 テスト2 テスト3');
insert into test values(2,'テスト1 テスト3');
insert into test values(3,'テスト2 テスト3');

select id,count(a)
from (
select id,a from test where a like '%テスト1%'
union all select id,a from test where a like '%テスト3%'
) as test
group by id order by id
0642NAME IS NULL2008/06/04(水) 16:22:48ID:???
>>639-641

ご教示感謝です。

641さんのSQLでうまくいきましたので、こちらを使用させていただきました。

本当にありがとうござした。
0643NAME IS NULL2008/06/04(水) 16:56:29ID:???
分離した上で正規化したほうがいいと思うけど
0644NAME IS NULL2008/06/04(水) 17:25:55ID:???
実際はキーワード羅列なんじゃなくて商品説明文とかなんじゃないの?
0645sage2008/06/04(水) 22:28:25ID:???
>>610

8.3.1、キャスト問題でなかなか8.1からバージョンアップに踏み切れない
状態です。うち、意外に日付や数値の自動キャストに頼ってる場所があった。

もう8.3運用してる人って居るのかなあ?
0646NAME IS NULL2008/06/05(木) 03:18:56ID:???
してるよ
というかDBは8.2だったんだけどjdbcドライバで8.3を
使っちゃって自動キャストで引っかかった。
日付で検索したときに条件に引っかからないだけだったから
大して実害なかったけど。
0647NAME IS NULL2008/06/05(木) 08:20:32ID:???
>> 645
数値はともかく、日付の自動キャストって怖くない?
日付のフォーマット書式って、環境依存だったような。

うちはPreparedStatementを使ってた関係で、
既に型チェックが厳密だったので、特に問題なく8.3に移行できました。
0648NAME IS NULL2008/06/05(木) 10:42:17ID:???
>>636>>640
ご教示ありがとうございました、理解出来ました。
ざっと見8.1からっぽかったですが(これは『個別に貼ってあっても見る』の方かも?)、
ちょっと詳しく調べる時間が無くて提示出来ずに申し訳ないです。

複数インデックスが多い割には何も考えてないSQL文だらけだったので、ちょっと書き換えてきます……。
本当にありがとうございました。
0649NAME IS NULL2008/06/05(木) 19:03:47ID:???
うちもPreparedStatement限定だけど
日付をsetString()してた
0650NAME IS NULL2008/06/05(木) 19:07:56ID:???
>>640
2番目は駄目だと思うな。複数のカラムを組み合わせてハッシュコードを
作るわけだから、順序入れ替えをOKにしたら偉い数のインデックスを
つくらにゃいけなくなる。少なくともOracleは駄目だ。
だからApache TorqueみたいにWHERE句の順序を入れ替えられない
ORMが嫌われてたんだし。
0651NAME IS NULL2008/06/05(木) 19:29:59ID:???
>>650
8.1.11でexplainで確認したら
>>640のパターンは最後のも含めて
全部インデックススキャンになったよ。
06526402008/06/05(木) 19:55:18ID:???
>>650
手元にある一番古い環境(7.4.19)で試してきた。

create temp table test(a int,b int,c int);
create index i_text_1 on test(a,b,c);
#適当にinsert
SET enable_seqscan TO 'off'

・indexスキャンになる。(INDEX COND: a = 1 and b = 1)
explain select * from test where a = 1 and b = 1;
explain select * from test where b = 1 and a = 1;

・indexスキャンになる。(INDEX COND: a = 1 Filter: C = 1)
・INDEX COND + Filterになる
explain select * from test where c = 1 and a = 1;
explain select * from test where a = 1 and c = 1;

・seq scanになる(Filter: b = 1 and c = 1)
explain select * from test where b = 1 and c = 1;
explain select * from test where c = 1 and b = 1;
0653NAME IS NULL2008/06/05(木) 23:26:11ID:???
>>650
芸術的な妄想しったかw
0654NAME IS NULL2008/06/06(金) 05:33:11ID:???
>>653
昔のOracleがそうだったいうだけで今は違うみたいだね
ここには順序も入れ替えるなと書いてある
ttp://oracle.se-free.com/tuning/B1_index2.html

torqueでwhere句入れ替えられない事に対する文句は昔MLかなんかで見た。
0655NAME IS NULL2008/06/06(金) 07:17:44ID:???
>>654
いやいやいや、そんなこと書いてないw
0656NAME IS NULL2008/06/06(金) 07:25:56ID:???
インデックスを「使うこと」はできたとしても、
その「効率」がだいぶ違うことには注意が必要ですよ。

なんにせよ、Bitmap Index Scan は結構なアドバンテージだと思われ。
0657NAME IS NULL2008/06/06(金) 07:54:24ID:???
>>655
突っかかりたいだけで日本語も読めないのか
「● 複合INDEXは先頭列から指定しないと、INDEXが使用されない」

ttp://www.geocities.jp/mickindex/database/db_optimize.html#LocalLink9
--8.複合インデックスの場合に、列の順粕ヤを間違えている
 col_1, col_2, col_3 に対して複合インデックスが張られているとします。
 その場合、条件指定の順番が重要です。

まあpostgresには関係無い話みたいだし悪かったな
0658NAME IS NULL2008/06/06(金) 11:49:08ID:???
pgpoolを止めずにpgpoolの設定ファイルの値を変更することってできますか?
知っている方いれば、コマンド教えてください!
06596522008/06/06(金) 14:39:23ID:???
出力される実行計画も同じですし、実行時間もほぼ同じですので
使う事ができるのではなく、オプティマイザが等しく扱ってるように見えます。
(3回ずつ実行してみました)
・explain analyze select * from test where a = 1 and b = 1;
 0.075 ms/0.074 ms/0.074 ms
・explain analyze select * from test where b = 1 and a = 1;
 0.074 ms/0.073 ms/0.073 ms

8.2で652と同じテストを試してきましたが
どの場合もindex ScanになりFilterは発生しませんでした。
また順序を変えたパターンでは実行計画、実行時間に変化はみられませんでした。

oracleはよく分かってないのですが・・・見よう見まねで10gで同様のテストをしましたが
a = 1 and b = 1もb=1 and a=1も同じ実行計画になってるように見えます。
(oracleスレではないので気になるようでしたらそちらで検証してください)
0660NAME IS NULL2008/06/06(金) 17:29:56ID:???
>>658
設定の項目によるんじゃない?
項目によっては要pgpool再起動
0661NAME IS NULL2008/06/06(金) 18:23:18ID:???
indexの順序が関係あるのはOracleのルールベースで
インデックス貼ってた時までだよ。10gでも設定することは
できるけどもうサポートされてない

http://www.shift-the-oracle.com/inside/optimizer.html
0662NAME IS NULL2008/06/06(金) 18:30:27ID:LCupMW8E
どなたか教えてください
トリガで特定のカラムの値が任意の条件を満たす場合のみトリガを発動って出来ますか?
例えば、
status というカラムが 0 という値にupdateされた場合のみトリガ発動 
みたいなことをしたいんです 
可能なら具体的な設定方法をご教授下さい
0663NAME IS NULL2008/06/06(金) 18:31:47ID:???
教授 じゃなく 教示でした。。
0664NAME IS NULL2008/06/06(金) 19:04:55ID:???
>>662
0という値以外にアップデートされたときは何もせずに終わったらよくない?
トリガが実行されることのコストを気にしてるのかな。
0665NAME IS NULL2008/06/06(金) 19:54:05ID:???
>>647

たしかにまずいですよね。substr(日付)とやってる処理があって、いま
手直ししてます。ぜんぜん意識してなかったです。。
0666NAME IS NULL2008/06/07(土) 02:50:25ID:???
>>659
その程度の最適化は今時どんなDBMSでもやってくれるよ。
同じで当然。
0667NAME IS NULL2008/06/07(土) 03:15:17ID:???
>>666
流れが読めない人だなあ
0668NAME IS NULL2008/06/11(水) 15:56:27ID:???
select 文を書く時みなさんはどちらを使いますか?
またその理由を教えてもらえると助かります。
ちなみに自分は�@派です。

�@select column from table where integer = 1;
�Aselect column from table where integer = '1';
0669NAME IS NULL2008/06/11(水) 16:45:08ID:???
スクリプトの人はわからんが、Cやってる人なら文字列と数値を
ごっちゃにするのは嫌うんじゃ
0670NAME IS NULL2008/06/11(水) 17:02:46ID:???
>>668
明確に違うものをなぜ同一視する。
文字列である数字と、数値を表す数字では、意味が違う。
0671NAME IS NULL2008/06/11(水) 18:10:46ID:???
>>668
�A 昔はこれしかなかった。
0672NAME IS NULL2008/06/11(水) 19:21:42ID:???
そういえば、7.4 の時代には、�@で int8 を検索してインデックスが使われない〜
ってのは頻出だったな。今は大丈夫だが。

ちなみに '1' だけでは、まだ文字列ではない (unknown) 。
何かしらの型への変換が要求された時点でパースされる。

=# select foo(1);
ERROR: function foo(integer) does not exist
=# select foo('1');
ERROR: function foo(unknown) does not exist
06736682008/06/11(水) 22:59:50ID:???
いろいろレスありがとうございます。
自分は>>669さんと同意見なんですが、
絶対 '1' にしろという人が身近に入るもので気になりました。

あと>>671さんの意見でなんとなく理由がわかりました。
0674NAME IS NULL2008/06/12(木) 06:06:46ID:???
暗黙の型変換が行われると速度が遅くなるから
元のカラムの型がintなら1を使うべきだと思ってたんだけど
そう単純な話でもないんだな
0675NAME IS NULL2008/06/12(木) 07:01:53ID:???
リテラルであれば別に型変換があっても実行速度は変わらんしな。
0676NAME IS NULL2008/06/12(木) 07:56:21ID:???
>>671
私はORACLEのバージョン3から使ってますが、当時から
数値はシングルクォーツなしで参照できたが・・・
0677NAME IS NULL2008/06/12(木) 10:15:58ID:???
>>676
私もその少し前からだと思う。マニュアルでは
WHERE DEPTNO = 30  であるのに 処理系では
WHERE DEPNTO = '30' でないとエラーになった記憶がある。
それで '30' とする習慣になってしまった。
もしかして、私の勘違いだったのかな。
0678NAME IS NULL2008/06/12(木) 13:21:33ID:dWhU52qw
PostgreSQL 8.3.3, 8.2.9, 8.1.13, 8.0.17, 7.4.21
0679NAME IS NULL2008/06/12(木) 15:23:39ID:eu0D2QJA
DB2台で冗長構成にしたいのだが、
pg_poolはシーケンスの整合性を取る場合にはテーブルロックが必要なのね。
テーブルロックしない方法は何か無いかしら?
Slony-IIとかpgClusterも同じでしょうか?

難しいなら障害時にDB1からDB2に自動的に切り替わらるといった障害耐性が
無くてもよいかな。単純にレプリケーションが取れていれば。
0680NAME IS NULL2008/06/12(木) 19:17:16ID:???
>>677
そのカラムがvarcharで定義されてたんじゃなくて?
0681NAME IS NULL2008/06/12(木) 21:59:56ID:???
>>679
drbdとか使ってミラーリングしとくとか
自動で切り替わらなくていいならPITRでリモートにバックアップとか

0682NAME IS NULL2008/06/13(金) 05:58:44ID:???
>>679
Slony-I ならテーブルロックしない。(-IIはリリースされてないよ)
pgCluster は、そもそも更新性能が 1/10 になるという噂もあるので微妙。
冗長化だけで良いなら、>>681のとおり、warm-standbyかDRBDが良いかも。
0683NAME IS NULL2008/06/13(金) 15:17:28ID:???
ここで愚痴ってもしょうがないけど・・・

signed/unsigned修飾子とtinyint型がほしいorz

今時誤差の範囲かもしれないけど貧乏症なので
smallintだと入らないけどunsigned smallintなら入りきる時とか
tinyintで十分な時とか悔しくてしょうがないんだ
0684NAME IS NULL2008/06/13(金) 18:17:27ID:???
>>683
DBの実装はよくわからないけどC言語の時は、
shortで宣言してもCPU内ではintで確保して半分未使用になるだけなので
実は速度はintの方が早いっていうのがあったよ。

大量のデータを構造体にしてネットワークでやりとりするときは
packed宣言すればデータ量を節約することはできたけど。
構造体へのポインタ(アドレス)からsizeof(構造体)分をbyte[]にキャスト
して使うような太古の作り方の話だけどね。
0685NAME IS NULL2008/06/13(金) 19:27:54ID:???
今でも一番パフォーマンスが出るのはintだと書かれているよ
0686NAME IS NULL2008/06/13(金) 19:30:08ID:???
http://www.postgresql.jp/document/pg831doc/html/datatype-numeric.html#DATATYPE-INT
参考までに。
0687NAME IS NULL2008/06/13(金) 19:39:55ID:???
>>684
C言語は、intがその処理系で一番パフォーマンスが出るように、と選ばれます
なのでintが速いのは当然です。
0688NAME IS NULL2008/06/13(金) 20:11:32ID:???
>>683
さぁ、ユーザ定義型を自作するんだ!
0689NAME IS NULL2008/06/13(金) 23:15:36ID:???
>>684
DBはそのネットワークと似たようなもんだよ。結局ディスクIOが最大のネックだから。
何億レコードにもなるようなテーブルは1byteでも減らしたくなるのが人情。
0690NAME IS NULL2008/06/14(土) 00:11:27ID:???
>>686
サイズと性能の釣り合いがとれてる(=コストパフォーマンスがいい?)のはintだと
書かれているけど、小さいサイズで構わないときにsmallintよりintの方が
速いとはかかれてないね。

>>689
ごもっともで
0691NAME IS NULL2008/06/14(土) 00:18:06ID:???
みんなポスグレのレプリケーション何使ってる?
0692NAME IS NULL2008/06/14(土) 00:49:03ID:???
レプリケが必要なプロジェクトではポスグレなんか使わない。
1日1,2回のpg_dump
0693NAME IS NULL2008/06/14(土) 20:34:22ID:???
普通はSlony、同期が必要ならpgpool、
バックアップ用ならwarm-standbyで鉄板じゃないの。
0694NAME IS NULL2008/06/15(日) 00:45:18ID:???
>>690
なるほどなるほど。確かに。
では、たとえばsmallintのほうがintよりも速い場合、以下のような記述をするでしょうか?
> smallint型は一般的にディスク容量に制限が付いている場合にのみ使用します。
                                       ~~~~
どうせならこう書きそうじゃないですか?
> smallint型に収まるデータを扱う場合はsmallintを使用することを推奨します。
> なぜならずっと速いからです。

あえて先の記述をするということは対して速度に差がないのであろうと想像します。
実際に測定するのが手っ取り早いんですけど、ドキュメントから読み取れることも多いと思います。
0695NAME IS NULL2008/06/15(日) 01:13:31ID:???
キモイキモイナニモカモキモイ
0696NAME IS NULL2008/06/15(日) 01:48:21ID:???
>>694
状況によるだろ。
100GBのテーブルと200GBのテーブルのfull scanを比較したら小さい方が速いだろうし。
0697NAME IS NULL2008/06/15(日) 09:11:54ID:???
>>691

うちはpgpool II 使ってます。ハード障害対策で使ってるんだけど、
意外にハード障害が起こらなくて、今のトコ手間だけ2倍以上な印象。
2重化してるせいで、大量更新集中時の読み出し処理とかは、片側から
読むようにしたりとか、変なコツが必要だったりする。
0698NAME IS NULL2008/06/15(日) 13:40:18ID:???
>>693
>>697
やっぱりpgpoolが多いのですねぇ。。。うちはPGclusterのロードバランシング機能はずした状態で使ってんだけど
ほかにそういう人いないかな。選んだ理由はデータ復旧がコマンド一発で楽だからなんだけど。
0699NAME IS NULL2008/06/15(日) 23:02:13ID:???
今PC用でpostgresでデータベースのみ使っています。
今度携帯用データベース作ろうとしたとき
一緒にするか分けるかどっちがいいんですかね…?
mysqlとpostgresを併用するのは速度的にはどうなんでしょ?
0700NAME IS NULL2008/06/16(月) 02:08:25ID:UXZw8p6G
質問させてください

vistaにposgreをインストールできたのですが、postgresとつけたアカウントのパスワードで、データベースpostgresにアクセスしようとすると
フリーズしてしまいます。
どうすればvistaでフリーズしないで使えるようになるのでしょうか?
0701NAME IS NULL2008/06/16(月) 02:36:58ID:???
>>700
フリーズってPC(OS)丸ごと? クライアントアプリだけ?
アクセスしようとしたクライアントはナニ?
postgres以外のアカウントだとどぉう?

っていうか、posgreってなんだよ。
0702NAME IS NULL2008/06/16(月) 09:29:14ID:???
>>699
別にPostgreSQLで困りはしないだろ。
0703NAME IS NULL2008/06/16(月) 11:34:23ID:???
>>699
どっちでもいいので、DBは統一しておいた方が楽。
特にこだわりがなければPostgreSQLでいいでしょう。
0704NAME IS NULL2008/06/16(月) 15:32:22ID:???
http://www.postgresql.jp/落ちてる?
0705NAME IS NULL2008/06/16(月) 16:38:53ID:???
>>704
そうみたい
0706NAME IS NULL2008/06/16(月) 16:40:42ID:???
>>699
併用しても問題ないけど、管理の手間を考えたらposgres一本の方がいいよ。
キャッシュの割り当てとかも一括だし。運用に携わる人はpostgresもmysqlも
どっちもプロフェッショナルなの?両方混ぜると似たようなコマンドで混乱すると思うんだけど。

あとマスタとか共通利用できないの?できるんだったらマスタテーブル一個の方が
更新も楽だしいいと思うけど。ものすごい負荷の高いシステムで将来的に
DBをわける可能性が大きいなら、今からインスタンスを分けておく意味も
あるかもしれない。
0707NAME IS NULL2008/06/16(月) 23:12:40ID:???
もし分けるとしても同じDBMSのほうがよさげに思う。
同じシステムのPC版、携帯版という違いであれば同じDBMSにしといたほうがいいよ。
07087002008/06/16(月) 23:47:37ID:???
>>701
DOSからアクセスしたのですが、passを入力してenter押すとOSごとフリーズしてしまいます。
0709NAME IS NULL2008/06/16(月) 23:49:20ID:???
>>708
ローカルマシンのPostgreSQLインスタンスにpsqlで接続しようとしたらOSごとフリーズってことですか?
07106992008/06/16(月) 23:56:17ID:???
>>702、703、706、707
みなさん、ありがとうございます。
postgresで統一したいと思います。

PCと携帯で違うデータを見せたいのですが
マスタテーブルも一つにした方が良さそうですね・・・。
ありがとうございました。
0711NAME IS NULL2008/06/17(火) 10:26:27ID:???
統一にしても、DBクラスタを別にしてPostgreSQLを複数起動するとか、
DBを別にするとか、スキーマでわけるか、テーブルで分けるか、キーで分けるか、
07127002008/06/17(火) 17:27:59ID:???
>>709
そうです、ネットで調べた通りにやったのですが無理でした。
0713NAME IS NULL2008/06/17(火) 17:47:13ID:???
>>712
まずメモリをチェックしなさい。
次にHDDをチェックしなさい。

Linux(Unix)ならこんな事で落ちない。
うんともすんとも言わない。メッセージが出ない。
保護違反とかのエラーは全てメモリエラーと思っていい。
0714NAME IS NULL2008/06/17(火) 18:20:27ID:???
メモリエラーの結果、誤動作して保護違反ということはあるかもしれないが
保護違反とメモリエラーとは直接の関係は無い。
0715NAME IS NULL2008/06/17(火) 18:25:12ID:???
保護違反じゃなくて、理由のわからないフリーズはハードを疑ったほうがいいけどな。
フリーズってのが全体が止まるのならな。
0716NAME IS NULL2008/06/17(火) 19:18:07ID:???
ハードだろうね。
保護違反ならメッセージ出るか再起動するかする
07177002008/06/18(水) 00:44:28ID:???
ということは、自分のパソコンを修理に出すべきなんでしょうか?
普通に使っている分には、まずフリーズしないのですが・・・SP1入れようとするとフリーズしますが・・・。
0718NAME IS NULL2008/06/18(水) 01:32:15ID:???
ノートで熱暴走してるとか

ないか
0719NAME IS NULL2008/06/18(水) 04:34:25ID:???
>>717
だめじゃん
0720NAME IS NULL2008/06/18(水) 10:21:41ID:???
アンチウィルスソフトで引っかかってUAEの警告だそうとしてるだけとか

ないか

pgAdminではつなげないの?
0721NAME IS NULL2008/06/19(木) 00:15:18ID:???
sp1入れてフリーズって普通じゃないよな。
pc新規購入をお勧めする。
0722NAME IS NULL2008/06/19(木) 00:24:28ID:???
PC買い替える前にOS再インストールだな。
0723NAME IS NULL2008/06/19(木) 01:34:49ID:???
の前にH/Wいろいろチェック
0724NAME IS NULL2008/06/20(金) 11:25:00ID:???
Explaining Explain日本語版ドラフト ? NPO法人 日本PostgreSQLユーザ会
http://www.postgresql.jp/blog/56
にある Explaining Explain の日本語版読んでみたいんですが、
パーマリンクの変更があった影響なのか
単にもうファイルがないのか読めないでおります。
どなたかファイル持ってる方いらっしゃればどこかにあげていただけないでしょうか?
JPUG公式ぽいんですが、コメントのSPAM荒れっぷりを見てもメンテされてない可能性があるので
こちらにきてみました。

コリコリにDBチューニングしたいわけではなくて、SQLかく時にある
ちょっとした迷い(結果同じだけどどっちの書き方がいいかな?)
をクリアする助けになればなぁと思ってる感じです。
0725NAME IS NULL2008/06/20(金) 12:05:19ID:???
>>724
困った時の、Web Archive
http://web.archive.org/web/20060429195622/http://blog.postgresql.jp/images/Explaining_Explain_ja.pdf
07267242008/06/20(金) 12:59:02ID:???
ぐぁ・・・基本的なことが抜けておりました。
大感謝です!
0727NAME IS NULL2008/06/28(土) 23:16:56ID:???
すみません
質問させて下さい。

PostgreSQL Ver 8.3
WindowsServer2003
でDBを運用しているのですが、
現在dataフォルダが初期インストールパスのままになっております。
別ドライブにdataフォルダを移動しようと試みて、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pgsql-8.3\ImagePath
を変更してみたのですが、
変更先がCドライブ以下なら変更可
他のドライブは変更不可(サービスが起動しない)
となってしまいます。

この場合、dataフォルダを退避して、PostgreSQLの再インストール
しか方法は無いのでしょうか?
何とかdataフォルダの移動だけで済ませたいと考えております。

アドバイスを宜しくお願いします。
0728NAME IS NULL2008/06/28(土) 23:32:34ID:???
上げてみました
0729NAME IS NULL2008/06/28(土) 23:45:40ID:???
うちのWinXPでは実行ファイルはC:にインストールしてあって、
-Dで指定するデータ領域は別のドライブにしているけど、普通に動いてる。
0730NAME IS NULL2008/06/28(土) 23:55:33ID:???
>>729さん
ありがとうございます。

多分initdb.exeで -D 以降に移動させたいファイルパスを指定
してあげればいいのかなと思うのですが、initdb.exeの使い方が
いまいちわかりません・・・。

新規にデータ領域を作成して、そこに既存のdataフォルダをコピー
するような感じでいけるんでしょうか?

initdb.exeはコマンドプロンプトで実行するのでしょうか?

もしわかれば教えてください。
宜しくお願い致します。
0731NAME IS NULL2008/06/29(日) 00:06:36ID:???
既存のデータ領域があるなら丸ごとコピーして-Dでそっちを指すようにすれば動くんじゃないかな。
initdb はコマンドプロンプトで --help とかつけて動かせば説明が出るけど、
>>1のドキュメントを読んだ方が良いかも。
0732NAME IS NULL2008/06/29(日) 01:13:30ID:???
>>731
アドバイスありがとうございます。

取り合えず調べて、空の別ドライブのdataフォルダにinitdbの実行し
成功するまでは出来ました。

その後、新規dataフォルダを既存のdataフォルダに上書きして、
サービスの実行・・・・・・起動不可

再度、空のdataフォルダを作成して、initdbを実行。
今度はそのままサービスの起動・・・・・・起動不可

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pgsql-8.3\ImagePath
の値はinitdbの指定パスと同じにしているのですが、他に設定
が足らないのでしょうか?
0733NAME IS NULL2008/06/29(日) 01:34:59ID:???
>>732
コントロールパネル -> コンピュータの管理 -> サービス を開いて
PostgreSQLのプロパティを見て、[全般]タブの「実行ファイルパス」が
レジストリと同じ値になっているか確認して味噌。

っていうか、レジストリを直接弄るってはじめて知った。
scコマンドを使うものばかりだと...。
0734NAME IS NULL2008/06/29(日) 01:37:19ID:???
システムのログでも見れば。
0735NAME IS NULL2008/06/29(日) 02:05:45ID:Kc/12zlO
>>733
>>734
ありがとうございます。

>レジストリと同じ値になっているか確認して味噌。
ここは同じになっております。
多分、レジストリの値を参照して、ここに表示しているようですね。

>システムのログでも見れば。
今見てみました。
postgres cannot access the server configuration file "F:/data/postgresql.conf": No such file or directory

とのエラーメッセージを発見しましたが、該当の
F:\data\postgresql.confは存在します。

なぜでしょう?
0736NAME IS NULL2008/06/29(日) 02:28:40ID:???
>>735
元Unix系でWindowsに移植されると、あるのにNo such file... って出て悩ませるときがあるよねぇ。
ユーザpostgresに読み取りアクセス権限が設定されていないとか。
そんときゃpostgresql.confだけじゃなくて、/dateディレクトリ下の全てのファイルとディレクトリを
設定し直さなきゃだが?
0737NAME IS NULL2008/06/29(日) 11:49:56ID:???
psql (PostgreSQL) 8.2.4 を使ってますが、バックアップとリストアをしようとしています。
pg_dumpallでファイルにバックアップした後リストアすると文字化けが発生してしまいます。
登録データーがSJISなのですが、OSはUTF-8 CJKになってる為と思われますが文字化けを回避する方法はありますでしょうか。
また、上記状態でpg_dumpallしてあるファイルを文字化け無しにリストアする事は出来ないでしょうか。
宜しくおねがいします。
0738NAME IS NULL2008/06/29(日) 11:55:18ID:???
つ nkf

バックアップ前・後のDBの文字コードは同じ?
FTPとかを利用してファイル移動とかする際に
文字化けが入ってしまう可能性は無い?
使用しているOSは?

もうちょっと情報プリーズ
07397372008/06/29(日) 12:21:50ID:???
>>738

早速のご回答、ありがとうございます。
バックアップ前・後のDBの文字コードは同じです。
postgresはfedora上で動いており、XPからwinSCPとputtyを使ってアクセスしてますが
バックアップしておいた時点のDBを再現したいので最悪はputtyでログインして
fedoraのディスクにそのままバックアップとリストアが出来れば良いです。
出来ればwinscpでローカルのXPにバックアップ出来れば嬉しいですが…

nkf、ググって見ました。pg_dumpallしてしまったファイルに適用しても元に戻せるのでしょうか。ちょっとやってみます。
0740NAME IS NULL2008/06/29(日) 12:24:11ID:???
>>738
>FTPとかを利用してファイル移動とかする際に
>文字化けが入ってしまう可能性は無い?

記憶が曖昧なのですが、fedora上でputtyでログインし
バックアップとリストアしても文字化けした様に思います。
0741NAME IS NULL2008/06/29(日) 12:34:07ID:???
× 記憶が曖昧なのですが、fedora上でputtyでログインし
○ 記憶が曖昧なのですが、fedoraにputtyでログインし
0742NAME IS NULL2008/06/29(日) 13:06:59ID:???
>> 737
そもそもDB作るときに文字コード何にした?

$ psql -U postgres -l
List of databases
Name | Owner | Encoding
------------------+-----------+----------
***** | ******** | UTF8

この一番右のEncodingの値
0743NAME IS NULL2008/06/29(日) 13:21:10ID:???
>>742

-bash-3.2$ psql -U postgres -l
List of databases
Name | Owner | Encoding
-----------+----------+-----------
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
test | postgres | EUC_JP
test1 | postgres | SQL_ASCII
(5 rows)

となってます。test1が目的のDBなのでSQL_ASCIIで良いでしょうか。
0744NAME IS NULL2008/06/29(日) 13:42:39ID:???
>>743
テストしてみた

test1が元データだよな?

## 吸出し部分
# DB作成
createdb -U postgres -E SQL_ASCII test2

# test2にSJISデータを流し込む(手動)

# データ吸出し
pg_dump -U postgres test2 > test2.sql

# SJISからUTFに変更
cat test2.sql |nkf --ic=sjis -w > test2.sql.utf

# ここでFedora上で読めるようにUTFに変換されている
# winscpでwindowsに転送してみた
test2.sql => SJIS
test2.sql.utf => UTF8
の文字コードであることを確認

# 戻すテスト
createdb -U postgres -E SQL_ASCII test4
cat test2.sql.utf |nkf -s |psql -U postgres test4

これで無事に戻せた。

特に問題なさそうだが、何処でダメなんだ?
0745NAME IS NULL2008/06/29(日) 14:38:36ID:???
>>744
実験までして頂いてお手数掛けます。

>test1が元データだよな?
そうです。pg_dumpは部分的ににかバックアップしない様なので使ったことが無いのですが

pg_dumpall > backup.sql
とした時にbackup.sqlが既に壊れているのでは無いかと考えていて
今、実験中なのですが自信が無いです。

単純に
pg_dumpall > backup.sql
psql -f backup.sql
とした時に標準出力(linuxのUTF)で化ける事って無いのでしょうか。
backup.sqlはUTFに変換されてしまいますよね。
それとも、実験して頂いた手順に
># SJISからUTFに変更
とあるのでSJISのままなのでしょうか。
0746NAME IS NULL2008/06/29(日) 14:52:45ID:???
>>745
とりあえずbackup.sqlの文字コードを調べてみ。

こんなかんじで。

$ nkf --guess test2.sql
Shift_JIS
$ nkf --guess test2.sql.utf
UTF-8

ここまで書いて思ったんだが

test | postgres | EUC_JP
test1 | postgres | SQL_ASCII

ってことはEUC_JPのやつとSJISのデータを混ぜて出力してる?
0747NAME IS NULL2008/06/29(日) 16:55:09ID:???
>>746
やってみました

-bash-3.2$ nkf --guess backup.sql
BINARY

でした。

ちなみにbackup.sqlの先頭の方で

SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET escape_string_warning = 'off';
 | |
REVOKE ALL ON DATABASE template1 FROM PUBLIC;
REVOKE ALL ON DATABASE template1 FROM postgres;
GRANT ALL ON DATABASE template1 TO postgres;
DROP DATABASE test;
CREATE DATABASE test WITH TEMPLATE = template0 OWNER = postgres ENCODING = 'EUC_JP';
DROP DATABASE test1;
CREATE DATABASE test1 WITH TEMPLATE = template0 OWNER = postgres ENCODING = 'SQL_ASCII';

となっていてエラーも出ていない様なのですが、多種類の文字コードだと出力出来ないのでしょうか。



backup.sqlの容量が900Mバイトもある為かサーバの反応が遅すぎるので、テスト用のサーバーを買ってこようと思います。
0748NAME IS NULL2008/06/29(日) 17:45:07ID:???
>>747
>多種類の文字コードだと出力出来ないのでしょうか。
DBごとにdumpしてみたらどうなのさ? もうちょと自分で思考錯誤しる。
0749NAME IS NULL2008/06/29(日) 19:03:19ID:???
もしかして: 試行錯誤
07507372008/06/30(月) 07:50:38ID:???
>>748

DB毎にdumpしてみましたが文字化けが発生している様でした。
別サーバーを立てて文字化け部分を切り出そうとしている所ですが
昨日の初書き込みから、お蔭様でだいぶ進展した感じです。
暫く自分でやって見てまた判らない事がありましたら質問させて頂きます。
本当にありがとうございました。
0751NAME IS NULL2008/06/30(月) 16:37:15ID:???
環境変数のPGCLIENTENCODINGとか?
0752NAME IS NULL2008/06/30(月) 16:40:40ID:???
DB毎に文字化けってどういうこと?
例えばEUC_JPで出したものをEUC_JPとして見ようとしても化けてるの?

文字化けしてると勘違いしてるだけじゃね?
0753NAME IS NULL2008/06/30(月) 18:37:06ID:???
DBをASCIIでつくっちゃったんならクライアントの
文字列をそのままバイト配列として格納してくれるんだっけ?

新しいDBをUTFで作ってプログラム組んでSELECT->INSERTしたほうが
早そうだけなあ
0754NAME IS NULL2008/06/30(月) 23:38:49ID:???
現在レンタルサーバを借りているのですが、データベースのバックアップをしようと思い、pg_dumpをした所「WARNING: ignoring unconvertible UTF-8 character」と言ったメッセージが表示されました。
ただ一応ダンプデータは作られたので、そのデータを元に復旧を試みた所、一部データが欠落していました。

ググッてみて文字変換の問題のような気がしたのですが、ユーザーレベルで解決する方法が分かりませんでした。
ttp://www.google.com/search?num=50&hl=ja&lr=lang_ja&q=WARNING:+ignoring+unconvertible+UTF-8+character&revid=994610375&sa=X&oi=revisions_inline&resnum=0&ct=broad-revision&cd=1

その為何か良い手ががございましたら、アドバイスをいただければと思います。
よろしくお願いします。
0755NAME IS NULL2008/07/01(火) 02:01:50ID:???
>>754
DBがUTF-8でシェルのLANGがUTF-8じゃないとかじゃないの?
繰り返しになるけど、
環境変数のPGCLIENTENCODINGとか?
0756NAME IS NULL2008/07/01(火) 15:37:39ID:???
PostgreSQLって基幹業務でも安心して使えますか?
0757NAME IS NULL2008/07/01(火) 16:10:24ID:???
>>756
管理者が詳しければ安心
管理者が詳しくなければどのRDBMS使っても安心できない。
0758NAME IS NULL2008/07/01(火) 16:14:23ID:???
DB本体はともかく、基幹業務となるとバックアップとレプリケーションかなぁ。
一番の問題はPostgreSQLを扱えるSIの質と数だろうけど。
0759NAME IS NULL2008/07/01(火) 16:30:12ID:???
1万ユーザーで同時使用は1000人くらいですが
パフォーマンス的には問題ないでしょうか?
0760NAME IS NULL2008/07/01(火) 16:37:14ID:???
使用状況や環境にもよるでしょ。
0761NAME IS NULL2008/07/01(火) 16:43:03ID:???
具体的なトランザクション数とまでは言わないけれど、一口に同時使用が
1000人といっても、それはフロント部分の作りに大きく依存するでそ。
それだけじゃなんとも言えない罠。ただ、今現在そのシステムがOracle等で
動いているのなら、パフォーマンス的にはPostgreSQLでも動くはず
というのはいえる。
0762NAME IS NULL2008/07/01(火) 23:30:29ID:???
>>755
ありがとうございます。
確認した所下記のようになっておりましたorz。
LANG=ja_JP.eucJP
PGCLIENTENCODING=EUC_JP

現時点でレンタルサーバの設定は触れないので、
自分で似たような環境を作り試してみた所、
UTFからEUCに変換できない文字(?など)があると現象が発生するような感じでした。

多分データベースがUTF-8なのに対し、PGCLIENTENCODINGがEUC_JPの為、
pg_dump時にEUC_JPにコンバートしてしまい、EUCに変換できない箇所でWarningが出ているのかなと思いました。
なおLANGは無関係そうな感じでした。

その為、PGCLIENTENCODINGの設定を変更してもらう方向で検討してみたいと思います。
どうもありがとうございました。
0763NAME IS NULL2008/07/01(火) 23:34:10ID:???
>>762の上から8行目は文字コード0xE28094のUTFの文字を貼り付けたのですが、文字化けしてしまいました。
多分pg_dumpでも同じようなことがおきてWARNING表示になったのだと思います。
0764NAME IS NULL2008/07/01(火) 23:53:51ID:???
>>762
自分の環境変数は自分で変えられるよ
export PGCLIENTENCODING=UTF-8
ってやってからpg_dumpしよう
0765NAME IS NULL2008/07/01(火) 23:58:16ID:???
連投ごめんです。
記憶違いでなければ、PGCLIENTENCODINGが設定されていない場合はLANGが使用されたと思うよ。

んで、ダンプファイルを突っ込むときにエンコード周りのエラーが出た場合なんだけど、
ダンプファイルの中の set client_encoding という行がある場合はそれが
優先されているので、そこがおかしくないかチェックしてみるとよいです。
0766NAME IS NULL2008/07/02(水) 00:15:01ID:???
>>764
レスどうもです。
一応自分で構築したサーバーで>>764の記述と
export PGCLIENTENCODING=EUC_JP
でのpg_dumpの出力結果を元に>>762のような感じかなと推測しました。

実際に使用しているレンタルサーバーの方は、
自分の判断だけでは手がつけられないため、試してないですが。

>>765
私の構築したサーバーの設定は下記ですが、問題なかったのはLANGにUTF-8を指定してたからということですね。
LANG=ja_JP.UTF-8
PGCLIENTENCODINGはなし

危うく、PGCLIENTENCODINGの設定を無くすだけで終えるところでした。
データベースは複数ありますがどれもUTF-8なので、PGCLIENTENCODINGをUTF-8にする方向で対応したいと思います。

後、手元に問題のダンプデータがないので、明日Warningのでる場合と出ない場合のset client_encodingの記述をチェックしてみます。
どうもありがとうございました。
0767NAME IS NULL2008/07/02(水) 09:25:32ID:???
pg_dumpに-eって無かったっけ?
0768NAME IS NULL2008/07/02(水) 10:01:57ID:???
-E または, --encoding= でしょ、あるよ。
07697372008/07/02(水) 11:28:22ID:???
>>751
今回は関係なかった様です。ありがとうございました。

>>752
EUC_JPのDBは化けてませんでした。
と言うか、SQL_ASCIIのDBを削除する為に仮に作っただけだったので、データーが殆ど入ってなかったと言うのもありますが。


追伸
SJISの文字化けで質問していた者です。他の業務が入ってしまい追試が遅くなりました。
色々やってみましたが、DBから携帯からのメールのみ削除してバックアップした所文字化けがなくなりました。
携帯の特殊文字に関連しているのかも知れません。とりあえずプログラマにその旨を伝え、対応してもらう事になりました。
時間が取れたらこちらでも詳しく調べようと思います。
ご教示頂いた皆様、本当にありがとうございました。

追伸2
4GのメモリとQuadのマザー買っちゃいました。素人が試行錯誤するには反応が早くて良いですね。
0770NAME IS NULL2008/07/02(水) 21:56:28ID:???
>>765
set client_encodingチェックしました。
すべてのダンプがEUCでしたorz
どうもありがとうございました。

それと、私が試した限りではPGCLIENTENCODINGが設定されていない場合、
LANGではなく、データベースのEncodingが使用されているようでした。
その為、下記のaaaaというデータベースのダンプはEUC_JPで作られ、
bbbbというデータベースはUNICODEで作られていました。

 List of databases
Name|Owner|Encoding
-----+-----+--------
aaaa |ccccc |EUC_JP
bbbb |ddddd |UNICODE


>>767、>>768
使用しているバージョンが7.4.19なのですが、このバージョンでは-Eと--encoding=はないようです
(pg_dump --helpで調べましたが、そのオプションは存在せず、試してみてもエラーになりました)。
出来れば既存の環境には手を加えたくないので、PGCLIENTENCODINGには手をつけず、
pg_dump -Eで対応できれば良かったのですが。
何か良い案があるようでしたらアドバイスいただければと思います。
今はまだPGCLIENTENCODINGを変更すると、既存の環境に悪影響が出ないか検証できていない為、
変更できていないので。

なおpg_dumpのマニュアルは下記を参考にしました。
ttp://www.postgresql.jp/document/pg812doc/html/app-pgdump.html
ttp://www.postgresql.jp/document/pg746doc/html/app-pgdump.html
0771NAME IS NULL2008/07/02(水) 23:37:35ID:???
>>765
PGCLIENTENCODINGが設定されてない場合の補足ですが、
下記のサイトに以下の記載がありました。

> -E encoding
> --encoding=encoding
> 指定した文字セット符号化方式でダンプを作成します。デフォルトでは、ダンプはデータベースの符号化方式で作成されます
> (PGCLIENTENCODING環境変数を好みのダンプ時の符号化方式に設定することで、同じ結果を得ることができます)。
ttp://www.postgresql.jp/document/pg812doc/html/app-pgdump.html

この文章の「デフォルトでは、ダンプはデータベースの符号化方式で作成されます」というのが、
>>770のEncodingの部分を指していると思われます。
0772NAME IS NULL2008/07/03(木) 02:08:24ID:???
テーブルに登録している「folderpath」を
SQLのWHERE句にて
Like検索したいのですが、
以下結果となりました。


1. folderPath = "c:\\test" OK (データ取得成功)参考
2. folderPath like "c:%" OK
3. folderPath like "c:\%" OK
4. folderPath like "c:\\%" NG (取得データ0件)
5. folderPath like "c:\t%" NG
6. folderPath like "c:\\t%" NG


\が入っているフォルダパスを
検索する良い方法はないですか。

よろしくお願いします。
0773NAME IS NULL2008/07/03(木) 03:31:45ID:???
>>772
フロントエンド(psqlなりプログラミング言語なり)がエスケープする分とlikeがエスケープする分が必要。

folderPath like 'c:\\\\%'
0774NAME IS NULL2008/07/03(木) 09:53:15ID:???
c:\% がOKなのは、 c:\% → c:% → c:% だからだな。
0775NAME IS NULL2008/07/04(金) 14:49:20ID:gyCCSjbu
MYSQLからPostgreSQLに乗り換えたいと思いインストールしてみたんですが
phppgadminから起動が出来ません

環境は
apache2.2/PHP5/PostgreSQL8/WindowsXP
php.iniの php_pgsql.dllの部分の;は解除してますが
phpinfoにもPostgresが出てきません
インストールが失敗しているんでしょうか?
一応 ユーザーアカウントを新しくrootとして権限をかけて作りました
Linux環境のサイトが多くWindowsの情報が無く困ってます

Phppgadminのエラー詳細は
データベースをサポートするように
PHP のコンパイル・インストールがされていません。
configure の --with-pgsql
オプションを用いて PHP を再コンパイルする必要があります。
0776NAME IS NULL2008/07/04(金) 15:43:53ID:???
phpinfoに出てこないんじゃ、そもそも無理でしょ。
PostgreSQLが使えるようにビルドしなおすか、
ビルドしたバイナリ持ってくるしかない。
07777762008/07/04(金) 15:49:51ID:???
ちょっとググってみたけど、extension_dirは設定してる?
そして、extension_dir にちゃんと php_pgsql.dll は入ってる?
0778NAME IS NULL2008/07/04(金) 16:09:43ID:???
>>775
phpinfo();
でpgsqlのセクションが表示されなければ
たぶん、extensions_dirの設定ミス。

つか、Win32版のバイナリなら再コンパイルとか不要で、
ほとんどのオプションはphp.iniの設定変更のみで使用できる。
0779NAME IS NULL2008/07/04(金) 18:49:06ID:???
>>775
Bug #44905 PHP 5.2.6 fails to load PostgreSQL related libraries 
http://bugs.php.net/bug.php?id=44905

これかな?
0780NAME IS NULL2008/07/05(土) 20:29:39ID:???
>>775
Windowsなら大人しくxampp使っておけ
http://www.apachefriends.org/jp/xampp-windows.html
MySQLとかゴミが一緒に入るけど起動しなければ無害
そしてPostgreSQLは別途インストール
0781NAME IS NULL2008/07/09(水) 09:40:20ID:???
プライマリキーのフィールドってインデックス化されるんだったけ?
それとも別途CREATE INDEXしなくちゃいけないの?
他のDBとごっちゃになってきた
0782NAME IS NULL2008/07/09(水) 11:05:17ID:???
プライマリキーを設定するとユニークなインデックスを作成します。
つか設定したときメッセージ出るべ?
0783NAME IS NULL2008/07/09(水) 11:26:51ID:???
>>782
サンクス
メッセージはC#&Npgsqlで直接CREATE TABLE&CREATE INDEXしてたもので出なかったのよ
0784NAME IS NULL2008/07/09(水) 11:49:02ID:???
>>783
調べる基本はドキュメントでしょ。
http://www.postgresql.jp/document/pg833doc/html/sql-createtable.html
の「注釈」を読みましょう。
0785NAME IS NULL2008/07/09(水) 15:23:31ID:???
>>775
PATH設定してみては?
おれもそれっぽいのにぶつかったが、>>777の内容はクリアできてても
phpinfoでは出てこんかった。
とりあえず、PostgreSQLのbinにPATH通したら出てきたよ。

>>779の中にも同じような対処法も書いてある。
(PostgreSQLかPHPのインストーラーでうまくやれよ…と思うんだけど)
0786NAME IS NULL2008/07/09(水) 15:44:52ID:???
textのフィールドを範囲検索かつあいまい検索できるのでしょうか?

仮にtextのフィールド名をmojiretuとして
データが
AAA0001
AAA0002
AAA0003
BBB0001
BBB0002
BBB0003
とあった場合

あいまい検索は
select * from testTable where mojiretu like '%0001'

範囲検索は
select * from testTable where mojiretu >= 'AAA0001' and mojiretu <= 'AAA0002'

これで
AAA0001
AAA0002
BBB0001
BBB0002
だけを引っ張るにはどういうSQL文になるのでしょうか?
0787NAME IS NULL2008/07/09(水) 17:44:12ID:???
or 使えよ
0788NAME IS NULL2008/07/09(水) 18:16:49ID:???
正規表現で
SELECT * FROM testTable WHERE mojiretu ~ '.*000[1-2]'
とか。
0789NAME IS NULL2008/07/09(水) 21:11:13ID:???
LIKEを「あいまい検索」ってのは初めて聞いた。
0790NAME IS NULL2008/07/09(水) 23:22:13ID:???
俺の知り合いにも完全一致じゃないのを「あいまい検索」って言うのがいる。
面倒だからいちいち突っ込まない。
0791NAME IS NULL2008/07/09(水) 23:56:57ID:???
>>789
部分一致をあいまい検索と呼ぶのは、そう呼ぶ客が少なからずいるから、気持ちはわからんでもないのだけど、
>>786の例だと後方一致なんだよなw
0792NAME IS NULL2008/07/10(木) 02:02:04ID:???
テーブル内容が同一の2つのDBがあるのですが、SQLコマンド
一発でDB1のデータをDB2と同一にするような方法はあるもの
でしょうか。

ご教示いただけますと幸いです。
0793NAME IS NULL2008/07/10(木) 07:46:45ID:???
LIKE あいまい検索 の検索結果 約 6,370 件中 1 - 10 件目 (0.20 秒)
0794NAME IS NULL2008/07/10(木) 09:38:19ID:???
>>792
ありません。
レプリケーションの機能は現在のPostgreSQLの弱点の一つです。
0795NAME IS NULL2008/07/10(木) 09:38:50ID:???
って同じにするだけならdumpしてrestoreすればいいけどな
0796NAME IS NULL2008/07/10(木) 09:45:59ID:???
>>795
それだ!
0797NAME IS NULL2008/07/10(木) 10:03:10ID:???
>>788
postgres って正規表現一致使えたのか・・・
永らくそれっぽい検索とかに展開して激しく無駄なことしてたよ・・・
吊ってくる
0798NAME IS NULL2008/07/10(木) 14:16:46ID:???
>>787,788
試してみます、サンクス

>>789-791
お客さんには伝わりやすいのですが
このスレの先輩方のおかげで正式名称がわかりました
0799NAME IS NULL2008/07/10(木) 14:27:45ID:???
俺的にはあいまい検索って言ったら表記の揺れを考慮するやつ。
0800NAME IS NULL2008/07/10(木) 16:16:31ID:???
あいまい三センチ
0801NAME IS NULL2008/07/10(木) 16:30:22ID:???
ぜったい誰か書くと思った。
0802NAME IS NULL2008/07/10(木) 21:59:56ID:???
>>799
たしかに。soundexとかかと思ってしまう。
08037862008/07/11(金) 09:39:13ID:???
>>788
データが
AAA1999
AAA2000
AAA2001
BBB1999
BBB2000
BBB2001
とあった場合

AAA1999
AAA2000
BBB1999
BBB2000
だけを引っ張るには正規表現では無理なのでしょうか?
0804NAME IS NULL2008/07/11(金) 09:56:52ID:???
どうにでもできるだろ。
0805NAME IS NULL2008/07/11(金) 09:59:58ID:???
substrして数値に変換すれば?
0806NAME IS NULL2008/07/11(金) 12:39:25ID:OI85zmOh
>>803
SIMILAR TO '%(1999|2000)%'
+その他じゃ だめ?
ttp://www.postgresql.jp/document/pg833doc/html/functions-matching.html
0807NAME IS NULL2008/07/11(金) 12:46:55ID:???
そもそもナニを引っ張りたいのかがわからん。
0808NAME IS NULL2008/07/11(金) 13:11:48ID:???
ルールを日本語で表現してくれないと
0809NAME IS NULL2008/07/11(金) 13:15:57ID:???
>>806-807
データが固定的ですいません

文字列3桁 + 数値4桁

このフォーマットでtextフィールドに入れています。

文字列3桁の部分の文字列はlikeなどの一致検索?で
数値4桁の部分の文字列は>=や<=で範囲検索したいのです。

正規表現は一致検索?タイプなので範囲検索には使えないのかなぁ
と思った次第です。

文字列フィールドを>=や<=するのはよくない気がするのですが
実際範囲検索できるので・・・
0810NAME IS NULL2008/07/11(金) 13:22:54ID:???
>>805でいいんじゃないの?
別々の情報なら最初から同じ所に詰め込まない方が良い気もするけど。
0811NAME IS NULL2008/07/11(金) 13:37:35ID:???
>>810
> 別々の情報なら最初から同じ所に詰め込まない方が良い気もするけど

いえ別々のデータというよりは
本の後ろに書いてあるような
ISBN978のような書籍コード?なのです

substringを使用して実現可能なのでしょうか?
発想が貧困なためイメージがわきません・・・

このようなSQLを妄想していたのですが

select * from testTable where mojiretu >= '%0001' and mojiretu <= '%0002'
0812NAME IS NULL2008/07/11(金) 13:46:52ID:???
>>811
文字列3桁 + 数値4桁
を
substring
で分けて(ry
0813NAME IS NULL2008/07/11(金) 13:58:24ID:???
>>812
数値4桁の部分をsubstringして>=、<=するということですか?わかりません><

select * from testTable where substring(mojiretu, 4, 4) >= '0001' and substring(mojiretu, 4, 4)<= '0002'
0814NAME IS NULL2008/07/11(金) 14:04:29ID:???
例えば、、
substring(mojiretu,4,4) between '1999' and '2000'
0815NAME IS NULL2008/07/11(金) 14:12:20ID:???
まあ0パディング前提だから、数値に変換 (::INT や to_number)してもいい
0816NAME IS NULL2008/07/11(金) 14:17:14ID:???
>>814-815
試してみます!サンクス!
0817NAME IS NULL2008/07/11(金) 17:21:18ID:???
お前ら、優しいな。
0818NAME IS NULL2008/07/11(金) 19:21:52ID:m/805UHa
PostgreSQL 7.4.2 から8.3.3へのリストアでハマってます。

8.3.3ソースを展開>./configure && make
$ su pgsql
$ export LD_LIBRARY_PATH=/usr/local/src/postgresql-8.3.3/src/interfaces/libpq/
$ cd /usr/local/src/postgresql-8.3.3/src/bin/pg_dump/
として8.3.3のpg_dumpを使います。

試したダンプ方法
./pg_dump -F c database > out1.dump
./pg_dump -F p database > out2.dump
./pg_dump database > out3.dump

8.3.3がインスコされたマシンにてそれぞれのダンプファイルを
pg_restore -d database out.dump
としましたが、やたらと改行が入っていたり変な文字に化けたりで・・・

DBのエンコードはEUCです。createdb -E EUC_JPで作ったDBに
export PGCLIENTENCODING=EUC_JP してからリストアしました。

何がイカンのでしょうか?助けて・・・
0819NAME IS NULL2008/07/11(金) 20:22:35ID:???
pg_restore -E EUC_JPは?
0820sage2008/07/11(金) 20:28:02ID:m/805UHa
>>819
どもです。なんか8.3.3は-Eオプションは無いみたいです。
やってみると
pg_restore: invalid option -- E で pg_restore--helpにもありませんでした・・・

$ pg_restore --version は pg_restore (PostgreSQL) 8.3.3 です。
0821NAME IS NULL2008/07/11(金) 20:32:25ID:???
>>820
ダンプの時もEUC_JPにしてる?
08228202008/07/11(金) 20:53:13ID:???
名前がsageになってもーた・・・

>>820
pg_dumpの直前とpg_restoreの直前にそれぞれのマシン上で
export PGCLIENTENCODING=EUC_JP
として作業しましたところ、日本語が <A1><D6><A5><BF> みたいな
文字列になってしまいました。先ほどは日本語は正常で改行がやたらと
入っているだけだったのですが・・・

createdb時は前後のDB共に-E EUC_JPを作って作成しました。
pg_dumpやpg_restoreの前にpsql -lでEUC_JPになっていることも確認しています。
0823NAME IS NULL2008/07/11(金) 21:07:57ID:???
>日本語が <A1><D6><A5><BF> 
?
EUCじゃねーの?
0824NAME IS NULL2008/07/12(土) 02:13:54ID:???
単に、リストア後に確認している端末で、EUC_JPが表示できていないというオチでは。
0825NAME IS NULL2008/07/12(土) 04:27:04ID:????2BP(1)
>>816 うまくいったら関数indexはっとくといいよ
08268202008/07/12(土) 14:19:58ID:keLDNTOS
>>823-824
やはりうまく行っていませんでした。
念のため新旧両方のマシンで日本語の表示を確認しましたが
問題なく表示されます。
別のDB(EUC)をリストアしてみたのすが、これも表示がおかしい
のでやはり手順に問題があるのでしょうね。
何か考えられることありますでしょうか・・・?
0827NAME IS NULL2008/07/12(土) 15:50:50ID:???
ver7クライアント(psqlとか)と、ver8.3サーバの
プロトコル互換てありますでしょうか?
事例、調べ方とかでもOKです。

同じように、
ver7のlibpqを使っているPHPがあるのですが、
ver7のlibpqからver8.3サーバの互換についても
お願いします。

※sh、PHPにてver7、8を共存させたい
0828NAME IS NULL2008/07/13(日) 10:25:57ID:???
初心者レベルで申し訳ありませんがよろしくお願いします。


id | integer | not null default nextval('t_memo_id_seq'::regclass)

この値って、無条件にユニークな値を設定するのではないですかね?

insert で

ERROR: duplicate key violates unique constraint

がおきました。

初期 0レコードで
追加したり削除したりで

意識しないといけないのでしょうか?
0829NAME IS NULL2008/07/13(日) 10:42:19ID:???
>>828
自己レス

なんか、プライマリーキーがこわれて重複レコード(キー)が存在しているとう現象があったというURLを
みつけたので

そういうことにしようと思います。

当面、物理的な削除をやめてみます。
0830NAME IS NULL2008/07/13(日) 17:17:29ID:???
なんだかわからんが、max値とcurrent_valと比較してみては
0831NAME IS NULL2008/07/13(日) 17:32:59ID:???
そもそも default nextval() なフィールドは、デフォルト値が使われる
以外の操作で変更できてしまうからな。
勝手な値でinsertとかupdateされたんじゃないの?
0832NAME IS NULL2008/07/14(月) 00:36:41ID:???
テーブル容量計算したいんですけど、
どっかに良いテンプレート公開している所ありませんか?
0833NAME IS NULL2008/07/14(月) 06:06:42ID:???
>>830-831

レスありがと。

3回くらい、ERRORになったあと、追加できるようになりまして、テストのときから見なかった現象なので・・・。
再現したら、考えます。
0834NAME IS NULL2008/07/14(月) 12:20:06ID:???
>>832
今あるテーブルを計測するなら
>>387

レコードあたりのバイト数から算出するExcelとかが欲しいならしらにゃい
0835NAME IS NULL2008/07/14(月) 21:05:46ID:???
とりあえず1行INSERTしてみて、pgstatupleして、結果を想定行数倍したら?
0836NAME IS NULL2008/07/18(金) 04:13:24ID:trTm/p1R
SELECT文について教えて下さい。

これまでグループごとのデータ件数を次のようなSELECT文で取得していました。

SELECT group_id ,COUNT(id) as count
FROM mytbl
GROUP BY group_id
ORDER BY group_id;

各データには登録日という項目があるのですが、グループごとに、
登録から60日以内のデータ件数、登録から60日超のデータ件数を
1回のSELECT文で取得することは可能でしょうか?

perlからSELECT文を発行しているので、上記SELECT文の結果に対してループを使って

SELECT COUNT(id) as count
FROM mytbl
WHERE group_id='101' and age(date)<='60 days';

SELECT COUNT(id) as count
FROM mytbl
WHERE group_id='101' and age(date)>'60 days';

とすることで求めるデータは取得できるのですが、1回でできる方法があれば教えて
下さい。
0837NAME IS NULL2008/07/18(金) 04:53:33ID:???
>>836
SELECT group_id,
sum(CASE WHEN age(date) <= '60 days' THEN 1 ELSE 0 END) AS 60日以内,
sum(CASE WHEN age(date) <= '60 days' THEN 0 ELSE 1 END) AS 60日超
FROM mytbl GROUP BY group_id ORDER BY group_id;
08388362008/07/18(金) 13:50:35ID:Qo8rMDkV
>>837
ありがとう!やってみます。
0839NAME IS NULL2008/07/22(火) 01:25:40ID:???
>>818, 820

[ OLD SERVER ]
pg_dump -F p -s -v -i -f hoge-schema.sql hoge-db
pg_dump -F p -a -v -i -O -f hoge-data.sql hoge-db

スキーマ(テーブル定義)と中身(データ)を分けて出力

[ NEW SERVER ]
su - postgres
psql -l
# DBがあれば一旦DROPで
# dropdb hoge-db
$PG_HOME/bin/createuser foo
$PG_HOME/bin/createdb -O foo -E EUC_JP hoge-db

# 確認してrep_str.sh を実行(とりあえず改行取るだけ。CRLF -> LFに)
ls -l
./rep_str.sh

[ rep_str.sh 中身 ]
---
#!/bin/sh
sed -e 's/\\r\\n/\\n/g' hoge-data.sql > hoge-data2.sql
---

# スキーマは -U なし。データはDB接続アカウントの権限で実行
psql -d hoge-db -f hoge-schema.sql
psql -d hoge-db -U foo -f hoge-data2.sql

psql -d hoge-db -f alter-hoge.sql

wgetかなんかでOLDServerからDLした後、DB作成してコマンドとAlterのSQLをま
とめて実行かけて、適切なACLを設定。

[ alter-hoge.sql ]
----
ALTER TABLE bar OWNER TO foo;
REVOKE ALL ON TABLE bar FROM postgres;

PostgreSQLの管理アカウント名に注意してください。
かたや postgresql で かたや pgsql だとマズーなんで。

以上
0840NAME IS NULL2008/07/24(木) 14:01:20ID:???
なんか postmaster が8.2から廃止されているぽいんだが
ttp://www.postgresql.jp/document/pg820doc/html/app-postmaster.html
この辺の経緯の資料はないかな?

RHEL5 + PostgreSQL 8.3.1 の環境で

pg_ctl start
pg_ctl status

とやって動作確認したら
==============================
pg_ctl: server is running (PID: 8905)
/usr/bin/postgres
==============================
こんな感じになって、シングルユーザモード!?と最初焦ったんだ。
0841NAME IS NULL2008/07/24(木) 14:10:30ID:???
postmasterはかわってないよ。
pg_ctl の表示の仕方がかわっただけでしょう。

試しに同じDBで、8.31の環境で新しいpg_ctl使ったら server、8.2のpg_ctl使ったら postmaster と出ましたよ。
ps で見てみるのが確実かもね。
08428402008/07/24(木) 14:24:02ID:???
あれ?そうなんだ。8.2以降のpostmasterのドキュメント説明が
「postmasterはpostgresの廃止予定の別名です。」
に変わっていて、psで見ても postgres になっているからてっきり。

確認し直してみると、「postmaster」で直起動してpsすると
名前がpostmasterに、「pg_ctl start」で起動してpsすると名前が
postgresになる模様。

どちらの場合も「pg_ctl status」で様子を見ると
==============================
pg_ctl: server is running (PID: 8905)
/usr/bin/postgres
==============================
と出る。ううむ。
0843NAME IS NULL2008/07/24(木) 14:39:24ID:mBwHhXoV
本体はpostgresになって、postmasterはリンクになりましたよ、ってことでしょ。
pg_ctlなんかはそれに合わせて作り直されているけど、起動スクリプトなんかは
postmasterを呼び出すままになってるだけなんじゃ。

postmasterが廃止方向なのは、MTAがらみと混同してしまうからかな?
今更のような気もするけど。
0844NAME IS NULL2008/07/24(木) 15:11:53ID:???
でもそれ昔からだった気がするけど。
0845NAME IS NULL2008/07/24(木) 21:33:50ID:Z/swGqhj
8.3.3 からのXMLの機能ってこの本役に立つ>「標準講座 XQuery」
経験無いから、購入迷ってるんだけど
それとも、他にいい本ありそう?
0846NAME IS NULL2008/07/25(金) 00:53:18ID:???
>>843 MTAがらみと混同
それもあった。他に、シンボリックリンクをサポートしていない
Windows版で、インストーラのサイズを小さくするためもあったような。
postgres と postmaster の同一バイナリを2つ含んでいるのは無駄だったから。

0847NAME IS NULL2008/07/25(金) 02:10:54ID:???
インストーラがコピー作るようにすればサイズ変わらんと思うけど
0848NAME IS NULL2008/07/29(火) 22:09:41ID:???
これとオラクルの連携ってどんな感じ?
0849NAME IS NULL2008/07/29(火) 22:10:24ID:WgByyyeH
ついでにage
08508202008/07/30(水) 01:30:46ID:???
>>839
上手く行きましたああああああああああああ。
あざーーーーーーーーっす。
0851NAME IS NULL2008/08/01(金) 11:22:34ID:Vlj4h0JM
clusterしたら select文で

Relation "t_table" with OID 68308374 no longer exists

って出るようになっちっち。( TДT)
調べたらキャッシュのOIDと違うようなんだけど、どうすればキャッシュのクリア。
もしくは整合性をとれるようになりますか。
教えてエロい人。
0852NAME IS NULL2008/08/01(金) 13:15:46ID:???
>851
自己レスです。
エラー文出てたのは、clusterしたテーブルのviewテーブルをselectした時だったのですが
viewテーブルをDROPしてcreateしなおしたら、エラーでなくなりました。
すんません。
0853NAME IS NULL2008/08/01(金) 19:35:11ID:???
>>852
やけにバージョンが古くないか?
最近のならそれくらいではエラーにならないと思うんだけど。
0854NAME IS NULL2008/08/02(土) 15:35:04ID:IADhYOwn
ttp://erogamescape.ddo.jp/~ap2/ero/toukei_kaiseki/select.php
ここのSQLのCGIからデータを参照したいのですが・・・

テーブルリスト ttp://erogamescape.ddo.jp/~ap2/ero/toukei_kaiseki/tablelist.php

発売日・ゲーム名 だけをリストアップする場合は、
SELECT sellday, gamename FROM gamelist
で出来たんですが、テーブルをまたぐデータ参照のやりかたがわからないのです orz

発売日・ブランド名・ゲーム名 をリストアップする場合、どう書けばいいでしょうか?
gamelist.selldayが発売日。 gamelist.gamename がゲーム名。
gamelist.brandname と brandlist.id が対応するかたちで、
ブランド名は、brandlist.brandname にあります。
0855NAME IS NULL2008/08/02(土) 16:53:51ID:/jmwO2I5
>>854
SELECT * FROM gamelist JOIN brandlist ON gamelist.brandname=brandlist.id
0856NAME IS NULL2008/08/02(土) 18:27:26ID:???
>>855
ありがとうございます。
やっと思い通りにリストアップする事ができました。
0857NAME IS NULL2008/08/03(日) 19:00:59ID:et0fI5Cl
PostgreSQL 8.3.3をWindowsXPで使用しています。
鯖はutf-8で、client_encodingでSJISを指定しているのですが、
COPY時のパス、ファイル名に日本語が含まれていた場合、失敗します。
日本語のファイル名で読み込ませるにはどうすればいいか教えてください。

'e:/日本語/hoge.txt' ← could not open file "e:/日本語/hoge.txt" for reading: No such file or directory
'e:/hoge.txt' ← コピー成功
0858NAME IS NULL2008/08/04(月) 08:15:39ID:???
>>857
サーバエンコーディングとOSのエンコーディングを一致させている環境でないとダメ。
特に、鯖にSJISが使えないので、Windowsでは無理なのです。昔からある不具合。
0859NAME IS NULL2008/08/04(月) 09:55:32ID:???
PostgreSQLへVB.NETから接続したいのですが
一番メジャーな方法は何でしょうか?
0860NAME IS NULL2008/08/04(月) 09:56:54ID:Qg+jh4Ky
>>859
Npgsqlでいいんじゃね。
0861NAME IS NULL2008/08/04(月) 10:01:40ID:???
>>860
ありがとうございます。試してみます。
08628572008/08/04(月) 19:56:49ID:???
>>858
レスありがとうございました。
素直に英数字を使うことにします。
0863NAME IS NULL2008/08/07(木) 15:14:49ID:???
pgcluster-1.9系,1.7系,1.5系 それぞれの最新バージョンをテストしているのですが、pglbを通してdropdbすると、それ以降pglbが接続を受け付けない(psqlすると無反応)状態になってしまいます。
構成はINSTALL_PGCLUSTER通りの、LBx1,RPx1,CLx2で、OSはCetnOS4です。

debugログを見ると、dropdb時にpglbをHUPしているようなのですが、その後おかしくなっているみたいです。プロセスは残っていますが、pglbのpidファイルは削除されてます。

その状態でも、直接ClusterDBには正常に接続できますし、レプリケーションも機能します。

pgpool-3.4.1をpglbの元にしているバージョン以降での現象のようですが、同じ現象を経験された方や、解決方法をご存知の方いらっしゃいますか?
0864NAME IS NULL2008/08/09(土) 12:10:53ID:???
同じPCで、Windowsだとpgbenchで80tpsくらい、Linuxだと500tpsくらい出るんだけど、
なんでWindowsだとこんなに遅いの?
0865NAME IS NULL2008/08/09(土) 14:30:37ID:???
>>864
Windowsのほうが遅いのは確かだけど、それは差がつきすぎな気が。
チューニングしていないなら、WAL関係だけでもやってほうが良いかも。
(checkpoint_segments, wal_sync_method)

まぁ、性能が必要ならWindows版は避けたほうが無難。
ちょっと機能を試すだけならお手軽で良いんだけど。
0866NAME IS NULL2008/08/10(日) 23:13:39ID:???
textとcharacter varying(varchar)のデータ型の使い分けの
基本的な考え方を教えて下さい。
webで探すとtext型を推奨するような書き込みもありますが、
お互いで得手不得手な事があるのでしょうか?
0867NAME IS NULL2008/08/10(日) 23:46:39ID:???
>>866
DB側で文字数の制限およびチェックが必要かどうかだけ。
と思ってる。
0868NAME IS NULL2008/08/11(月) 04:43:15ID:???
>>867
それでOK。実装はまったく一緒だし。
管理ツールで表示が違う場合はあるかも。
varcharは1行テキストボックス、textは複数行テキストボックスとか。
0869NAME IS NULL2008/08/11(月) 11:05:33ID:JHhGIW9s
Macのヒラギノで表現できる文字(Adobe-Japan1-5 JIS X 0213? + Unicode?)を全て格納したいのですが、
DBの文字コードは何を指定したらいいのでしょうか。

http://www.apple.com/jp/pro/design/typography/05/index6.html
を読んでいると、全てを文字コードで格納するのは不可能とも読み取れますが・・
UTF-8にしておくのが一番いいのでしょうか?
08708662008/08/11(月) 13:45:48ID:???
>>867-868
なるほど、ありがとうございました。
0871NAME IS NULL2008/08/12(火) 07:29:17ID:???
ヒラギノのことはよく知らんけどUnicodeで表現できるならUTF-8でいいんじゃ?
表現できなきゃ、バイナリデータとして格納とか。
0872NAME IS NULL2008/08/16(土) 12:56:12ID:iPeeVtKy
〉863
それ、おれもなった。
結局解決つかなかったからpgpool使ったよ。
0873NAME IS NULL2008/08/18(月) 04:35:12ID:rrvhCdtj
VACUUMのためにDB鯖を2台用意し
1台を通常運用、ある一定時刻がきたらデータをすべて
2台目のDB鯖に写しアプリからもデータ更新不可・2台目の鯖接続というように処理させ
1台目のVACUUM処理終了後、通常運用に戻るというような
運用はありでしょうか?
何かネックになりそうなことはありますでしょうか?
0874NAME IS NULL2008/08/18(月) 06:17:41ID:???
2台目のサーバで行われた更新を
どうやって1台目に反映させるの?
0875NAME IS NULL2008/08/18(月) 06:48:38ID:???
ありがとうございます。
2台目の鯖運用時は参照のみに利用し、更新は行いません。
ということです。
0876NAME IS NULL2008/08/18(月) 08:11:16ID:???
>>875
特に問題はないと思う。2台目のデータは毎回捨てるってことだよね?
ただ、目的がVACUUM中の性能低下を回避するだけならば、
サーバ間のデータコピーが本当にVACUUMより軽いか調べたほうが良いかも。
0877NAME IS NULL2008/08/18(月) 08:50:25ID:???
pgpoolとかで同期させといて
バキュームしたい時、意図的に切断しとけば?
0878NAME IS NULL2008/08/18(月) 16:14:41ID:???
>>872
レスありがとうございます。そちらの環境でもなりましたか。
すぐ気付きそうな現象ですから、情報が出ていてもよさそうなもんですが、無いんですよね。

2008-03-09以降リリースのバージョンで、pglbのdropdb上手くいっている人いましたら、是非環境を伺いたく。
0879NAME IS NULL2008/08/19(火) 00:12:40ID:qDOKASZt
複合PKを持っている表を
ID+UNIQUE制約に変更したいときに、
既存データにID値を振りなおす(採番する)のって
serial型をADD COLUMNするだけで行けます?

日本語わかりにくかったらごめんなさい。
0880NAME IS NULL2008/08/19(火) 08:51:25ID:???
>>879
カラム追加だけだと中身がNULLじゃね?
0881NAME IS NULL2008/08/19(火) 10:02:35ID:???
連番振るだけなら一発でできるよ。
シリアル追加だけじゃ何も入らない。
0882NAME IS NULL2008/08/19(火) 10:21:33ID:???
>>879
実はその新規連番付与にも複雑な法則性が…
なんて後出しが来ないことを祈るwww
08838812008/08/19(火) 10:34:12ID:???
あれ?
今試したら、しっかり番号入ってる。

すみません、ALTER TABLE table ADD COLUMN no SERIAL;
だけで入ってました。8.1.4ですが
0884NAME IS NULL2008/08/20(水) 01:18:01ID:???
クラサバの接続とApache+PHPでの接続、利用はわかるのですが、
WebサーバーのPostgreSQL へVB.NET または、VB6での接続は可能でしょうか?
可能であれば、その方法をご存知の方いましたら、教えて下さい。
WebサーバーへのODBC接続は試みましたがうまくいきませんでした。
0885NAME IS NULL2008/08/20(水) 07:57:05ID:???
>>884
ODBCでも良いし、Npgsqlでも良いし、お好きな方法で。
事象の報告もなしに「うまくいきません」といわれても、これ以上のアドバイスは無理。
0886NAME IS NULL2008/08/20(水) 08:39:19ID:???
>>884
「WebサーバーへのODBC接続」
文脈から理解できるが言葉の意味をしっかり押さえるべき
0887NAME IS NULL2008/08/20(水) 09:52:09ID:???
PostgreSQLのODBCドライバがインストールされて無いんじゃないの?
まず、開発用PC(Win?)からWebサーバ上のPostgreSQLにODBC接続可能かどうか試しましょう。

OKならVB6ならADODB、VB.NETならADO.NETで接続可能なはず。
ADO.NETではODBC接続は速度的に使いものにならないからNpgsqlが無難だね。
0888NAME IS NULL2008/08/21(木) 00:13:36ID:???
884です。
みなさん、ご教授ありがとうございます。
できるようになりました。
ポートが空いていなかったのが原因でした。
できれば、必要なポートだけを開けたいのですが、
PostgreSQLで必要な5432など以外に何が必要なのでしょうか?
08898792008/08/21(木) 02:16:48ID:???
こんなに早く回答もらえると思ってなかったので遅くなりました
ありがとうございます。

実際に試せるのはもうちょっと先になるんですが
ハードが物理的におかしくなってそれどころじゃなくなって
泣きそうです ><
0890NAME IS NULL2008/08/21(木) 17:41:24ID:???
>>888
標準では5432tcpだけあけとけば問題ないよ
> PostgreSQLで必要な5432など以外に何が必要なのでしょうか?
これはPostgreSQL以外で必要となるポートと言ってますか?
0891NAME IS NULL2008/08/22(金) 18:49:17ID:???
>>890
888ですが、
5432だけで、いいのですか。
ありがとうございます。
今のところ、それだけでは、うまくいきませんが、試行錯誤してみます。
0892NAME IS NULL2008/08/22(金) 19:00:47ID:???
それだけでうまくいかないのは、別の原因か設定ミス
0893NAME IS NULL2008/08/23(土) 23:17:25ID:???
PostgreSQLの問い合わせの方法の中にビットマップスキャンというのが
ありますが,そもそもビットマップとは何なのでしょうか?
windowsのビットマップ画像でないと思うのですが,それではいったい何を示しているのか
わかりません
わかる方いたらお願いします
0894NAME IS NULL2008/08/24(日) 07:41:58ID:???
ググれ
0895NAME IS NULL2008/08/25(月) 12:46:22ID:???
http://xn--lckja1b6r.jp/%E3%83%93%E3%83%83%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3
0896NAME IS NULL2008/08/28(木) 19:53:10ID:???
debianにインストールしたのですが、ローカルでは問題なく動くのですが、
別マシンから接続すると、

psql: could not open certificate file "/home/orca/.postgresql/postgresql.crt": そのようなファイルやディレクトリはありません

となってしまいます。
このファイルは、どういうタイミングで作られるんでしょうか?
0897NAME IS NULL2008/08/28(木) 23:25:43ID:???
>>890
>>888でできるようになりました、と書いているが、>>890でうまいくいきませんと書いているわけで、
何ができて何ができていないのかが伝わってこないのが現状です。
よくわからんので、Webサーバの80tcpを開けてみたら?

>>896
SSL関連のように思うが、それは意図的にそういう接続を?
0898NAME IS NULL2008/08/29(金) 08:58:19ID:???
>>897
>SSL関連のように思う
とあるソフトのインストールを、手順書の(OSのインストール手順からある)通りにやっていたんですが、
SSLの設定の事は何処にも書いてないんで、Postgerの問題かと思ったのです。

SSLのセットアップから試してみます。
0899NAME IS NULL2008/08/29(金) 18:03:21ID:???
oracleにあるselct for update wait のような
行ロックを掛けつつタイムアウトを設定するには
どうすればいいでしょうか?
0900NAME IS NULL2008/08/30(土) 05:40:20ID:???
>>899
それ、タイムアウト設定じゃなくて
ロックされてたら待機するかエラー返すかのオプションだろwww
PostgreSQL8.1あたりからNO WAITが使えるようになった、
ってことは、これまでのはWAITだったってことだ。
0901NAME IS NULL2008/08/30(土) 09:41:07ID:???
>>900
すみません。ちょっと説明不足でした。
oracleはselect for update wait 10
とすると10秒待機してエラーになります。
このような設定はないでしょうか?
0902NAME IS NULL2008/08/30(土) 10:02:33ID:???
>>901
SQLだけでやりたいなら、statement_timeoutと組み合わせるのかな。
 BEGIN;
 SET LOCAL statement_timeout = '10s';
 SELECT ... FOR UPDATE;
0903NAME IS NULL2008/08/30(土) 10:17:50ID:???
>>902
おぉ!
さんくす。
0904NAME IS NULL2008/09/03(水) 17:54:16ID:???
age 関数が使えない(=結果が微妙な)んだけど、うちの環境だけ?

# select age(timestamp '2009-09-02', timestamp '2008-09-03');
 11 mons 29 days

期待しているのは、11 mons 30 days なんですがねぇ。

# select age(timestamp '2009-09-01', timestamp '2008-09-03');
 11 mons 28 days

# select age(timestamp '2009-08-31', timestamp '2008-09-03');
 11 mons 28 days

なんてなるし。環境は

# select version();
 PostgreSQL 8.1.13 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.3.1

です。
0905NAME IS NULL2008/09/03(水) 21:03:59ID:???
>>904
仕様だな。

# select age(timestamp '2009-09-02', timestamp '2008-09-03');
11 mons 29 days

# select age(timestamp '2009-08-02', timestamp '2008-08-03');
11 mons 30 days

# select age(timestamp '2009-02-02', timestamp '2008-02-03');
11 mons 28 days

# select age(timestamp '2010-02-02', timestamp '2009-02-03');
11 mons 27 days

# select version();
PostgreSQL 8.3.3 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
0906NAME IS NULL2008/09/03(水) 21:25:38ID:???
>>905
その結果だけを見ると、単に当日を含むか含まないかの問題のように見えますが
問題はそうじゃないんですよね。

# select age(timestamp '2009-09-03', timestamp '2008-09-03');
 1 year

ですし。問題は

1. 2008-09-03 → 2009-09-03 は 1 年(当日を含まないなら、ここが変わるはず)
2. 2008-09-03 → 2009-09-02 は 11 ヶ月 29 日(8 月は 31 日あるから 30 日を期待)
3. 2008-09-03 → 2009-09-01 は 11 ヶ月 28 日
4. 2008-09-03 → 2009-08-31 は 11 ヶ月 28 日(上の 09-01 と同じ結果)

という結果になることなんです。結果がこうなっている以上は仕様なんでしょうけど
これだと、異なる日との差分で同じ結果になることがある(3. と 4.)ので、
微妙に使えない(と私は思う)仕様ですね。
0907NAME IS NULL2008/09/03(水) 23:19:12ID:???
そこが問題になるなら普通に引き算して日にちを出せばいい
0908NAME IS NULL2008/09/03(水) 23:20:58ID:???
intervalを無理に年月日に振るからこうなる
0909NAME IS NULL2008/09/03(水) 23:29:13ID:???
>>907
日数を出すだけで良いなら、最初からそうしますって。
関数ないかなーって探して見つけたと思ったら、上記の
結果だったので、使えない関数だなぁと思って。
誰も問題視してないんでしょうかね。
少なくとも違う日で同じ差分が出るのは問題でしょ。
仕方ないので関数を自作します。

>>908
無理にっていっても、単なるキャストとかじゃなしに、
専用の関数ですよ。内部でどうにでもなるじゃないですか。
0910NAME IS NULL2008/09/03(水) 23:48:28ID:???
さすがウンコDB
09119052008/09/04(木) 01:10:58ID:???
>>906
あーなるほど、今まで気づかなかった。
マニュアルより
> 異なる月では日数が異なりますのでageで返されるmonthsにはあいまいさがあります。
> PostgreSQLのやり方は月にまたがる2つの日付の計算において、日付の早いほうの月を使用します。

今まで気づかなかったくらいだから、それほど困る場面に直面するわけでもなさそうだが、
頭の片隅においといた方が良さそうね。
0912NAME IS NULL2008/09/04(木) 02:27:58ID:???
>>911
なにー、マニュアルに書いてあったんですか。
http://www.postgresql.jp/document/pg833doc/html/functions-datetime.html
の 9.9.1 の直前ですね。age 関数の説明までしか見てませんでした。すみません。
それなら、完璧に仕様ですね。諦めて自作で進めます。
0913NAME IS NULL2008/09/04(木) 04:14:41ID:???
そもそも、日付の差を取ったときに、何月という情報は
論理的な意味を失うと思うんだが。
0914NAME IS NULL2008/09/04(木) 08:25:36ID:???
単に age() と operator - () の2つ選択肢があるってことじゃないの?
用途に応じて使い分ければ良いのでは。
確かに age のほうは使い道がビミョーだが。
0915NAME IS NULL2008/09/04(木) 12:04:55ID:???
どこかの国の法律か、どこかの業界の慣習(たとえば保険?)とかで、
このageみたいな定義で計算することになっているところがあるのかも。
0916NAME IS NULL2008/09/08(月) 21:48:18ID:hDzPVYxs
pgAdminIIIを開いて、画面左側のサーバー一覧からサーバーを選択して
「サービス開始」を実行するとエラーになります。

エラーが起こりました:
Failed to start server pgsql-8.0: Errcode=1069
Check event log for details.

のエラーメッセージが出ます。インストールしたフォルダ
D:\Program files\PostgreSQLやそのサブフォルダの中から該当するログファイルを探して
原因を調べようとしたけど、更新日付が今日のファイルが見つからないし、全くどうなって
るのかわかりません。

前はサービスが開始してて動いてたはずなのに、何でエラーになるんでしょうか。
0917NAME IS NULL2008/09/08(月) 22:41:10ID:???
>>916
event logはWindowsの機能。
コンパネ>管理ツール>イベント ビューア
で見てみて。
0918NAME IS NULL2008/09/12(金) 01:38:47ID:???
・standard_conforming_stringsがONのとき、
・非E''構文で、
DB内の改行文字(その他エスケープ構文)を検索することは出来ない、ですか?

「nonstandard use of escape in a string literal」の警告消したくて試してたら
こっちが気になりました。
(警告は消えたし改行文字を検索したい場面も
 無い気はしますが知識として気になったので)
0919NAME IS NULL2008/09/12(金) 02:33:30ID:???
>>918
\\nでは?
09209182008/09/12(金) 23:41:09ID:???
しょぼ……

自己解決しました。
エスケープ系は不可ですが、
改行文字自体を検索キーにすればヒットしますね。(当たり前w)

>>919
・standard_conforming_stringsがON
・非E''構文
だと、「\\n」は「\\n」という文字に対してのみマッチします。
(\が特殊な意味を持たなくなるので
 where hoge = '\' みたいな時にエラーにならない)

※他人に講釈するほど詳しくないので違ってたら指摘ヨロ
0921NAME IS NULL2008/09/20(土) 19:10:36ID:???
業務で使うとしたら、8.1〜8.3ではどれが一番安定してんのかなー
0922NAME IS NULL2008/09/21(日) 00:16:16ID:???
>>921
おまえの脳が一番の不安定要因だから心配するな
0923NAME IS NULL2008/09/21(日) 00:41:19ID:???
業務で使うのに休日に2chで質問するなよ
0924NAME IS NULL2008/09/21(日) 05:10:09ID:???
ですよね
0925NAME IS NULL2008/09/21(日) 09:53:04ID:???
自分で判断できないならば、とにかく一番新しいの使っておけばいいよ。
0926NAME IS NULL2008/09/21(日) 09:55:23ID:???
VACUUM少ない8.3にしろ。
0927NAME IS NULL2008/09/21(日) 11:41:06ID:???
8.3の最新版でも、データ飛ぶとかの致命的な問題はないんでしょ?
0928NAME IS NULL2008/09/21(日) 12:10:34ID:???
どのバージョンにデータ飛ぶとかの致命的な問題があるの?
0929NAME IS NULL2008/09/21(日) 12:26:29ID:???
8の最初の頃
0930NAME IS NULL2008/09/21(日) 23:01:14ID:???
データが飛ぶようなバグってほんとうにレアケースだから、
見つかるときは全バージョンで修正が入るような。
新しいからといって不安定なようには見えない。
0931NAME IS NULL2008/09/22(月) 01:33:55ID:???
8.2であったデータ飛ぶってのもvacuumしたときにごくまれな条件で飛ぶかもって程度だしな
0932NAME IS NULL2008/09/22(月) 16:18:02ID:???
業務で使うのに平日に2chで質問されてもいやじゃん。
0933NAME IS NULL2008/09/22(月) 22:27:49ID:???
どこの業者もそんなもんだから平日は我慢しろ
0934NAME IS NULL2008/09/24(水) 02:08:48ID:32cC4wGg
8.3.4 / 8.2.10 / 8.1.14 / 8.0.18 / 7.4.22 updated
けっこうバグが修正されてるぽ。
0935NAME IS NULL2008/09/24(水) 02:54:11ID:???
調整が終わって一昨日やっと本番環境8.3.3にウプデートした俺涙目
0936NAME IS NULL2008/09/24(水) 08:05:31ID:???
http://www.postgresql.org/docs/current/static/release-8-3-4.html
急いでバージョンアップしなくてもよさそうだけど
週末あたりにやるか。
0937NAME IS NULL2008/09/26(金) 05:32:04ID:J6N79vWq
sequenceとnextvalで連番を簡単に管理できるのですが、
レコード内の1フィールドにnextvalを適用する方法はないのでしょうか。

name, counter
yamada, 3
tanaka, 10
suzuki, 20

nameを指定してcounter部分をインクリメントさせたいのです。
0938NAME IS NULL2008/09/26(金) 07:11:05ID:???
>>937
ふつうにUPDATEしたら?
UPDATE tbl SET counter = counter + 1 WHERE name = 'yamada';
0939NAME IS NULL2008/09/26(金) 10:08:57ID:???
>>937
トリガーでnameに応じてシーケンスを使い分ける
0940NAME IS NULL2008/09/26(金) 16:42:46ID:UeZFxsYq
CentOS3.6のMySQL(3.23.58)でBDBテーブルを作りたいんですが
リコンパイルする必要があるのでしょうか?
或いはリコンパイルする必要があるか確認する方法はありますでしょうか?
リコンパイルする必要がないのでしたらどのようにしたら
BDBテーブルが作れるようになる設定や環境などあるのでしょうか?

現状create tableでTYPE=BDBを指定してもエラーにはならないのですが
出来上がったテーブルはMyISAMになってしまいます。
0941NAME IS NULL2008/09/26(金) 16:43:47ID:UeZFxsYq
↑誤爆してすいませんm(__)m
0942NAME IS NULL2008/10/02(木) 17:24:01ID:???
思わず茶を吹いてしまったwww
ttp://www.postgresql.org/about/news.1013
0943NAME IS NULL2008/10/02(木) 17:42:49ID:???
なんだこれ。おもしれーw
0944NAME IS NULL2008/10/03(金) 17:16:42ID:???
知ってる人居たら教えてください。

今CentOS+Postgres8.3+pgpool2.1を使ってレプリケーション構築してて、
障害時のオンラインリカバリのために事前準備してるんだけど、
pgpoolIIのREADMEにあるC言語関数のインストールで躓いた。
こんなエラーが吐かれる

/psql -f /usr/local/pgsql/share/contrib/pgpool-recovery.sql template1 ←これを実行

ERROR: incompatible library "/usr/local/pgsql/lib/pgpool-recovery.so": missing magic block
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
STATEMENT: CREATE OR REPLACE FUNCTION pgpool_recovery(text, text, text)
RETURNS bool
AS '$libdir/pgpool-recovery', 'pgpool_recovery'
LANGUAGE C STRICT;
psql:/usr/local/pgsql/share/contrib/pgpool-recovery.sql:4: ERROR: incompatible library "/usr/local/pgsql/lib/pgpool-recovery.so": missing magic block
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.

PG_MODULE_MAGIC入れろって事みたいなんだけどソース見たらちゃんとインクルードされてる・・・
ググってもドンピシャな内容がヒットしないんだけど俺だけ?
0945NAME IS NULL2008/10/03(金) 17:25:08ID:???
>>944
#include っつーか、ちゃんと #define される条件(#ifdef)になってるの?
0946NAME IS NULL2008/10/03(金) 17:37:47ID:???
>>945
レスありがとう。

ごめん、C言語はよく解らない・・・
コンパイルするソース(pgpool-recovery.c)には

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

っていう記述がある。

これでできた共有オブジェクトを各データベースノードに持っていってるんだけど・・・
0947NAME IS NULL2008/10/03(金) 17:49:17ID:???
それ、8.2.0より前の環境はじくのに使われてるけど、
/usr/local/pgsql/include/server/fmgr.h の中ではdefineされてる?
0948NAME IS NULL2008/10/03(金) 18:01:34ID:???
>>947
defineされてた!

今Postgresqlのインストールディレクトリが、/usr/local/postgres-8.3.3ってなってるから、includeディレクトリが見えてないのかな?
ちょっとコンパイルしなおしてみる!ありがとう!
09499462008/10/03(金) 18:33:51ID:???
>>947
解った!
コンパイル結果をよく見てみると

usr/include/pgsql/server -I/usr/include/pgsql/internal

っていうメッセージが出てる!
ここのヘッダファイルには全然PG_MODULE_MAGICが定義されてなかった!

何とかしてinclude先を変えられればうまく行きそう!
0950NAME IS NULL2008/10/03(金) 18:38:38ID:???
OSインストール時に一緒にインストールされたやつか。
頻繁にソースから入れる人には邪魔かもな。
0951NAME IS NULL2008/10/03(金) 19:00:25ID:???
元々入っていたPostgreSQLをアンインストールする方がいいような。
yum --remove postgresql-devel 的なかんじで。
09529462008/10/03(金) 20:07:49ID:???
>>946です

無事に解決できました!
皆さん本当にありがとうございました!

結果的に、コンパイル時にMakefileの中で発行されているpg_config --pgxsが、OSインストール時に
入っていた古いPostgreSQLのpg_configでした。

>>951のアンインストール(yum remove postgresql)を実施して、ちゃんとPostgreSQL8.3のpg_configに
パスを通す事でちゃんとC言語関数がインストールできました。

何か皆さんが的確に原因を指摘してきてくれた事に感動しました!
09539512008/10/03(金) 20:11:19ID:???
>>952
おめでとう!

けれど、アンインストールした状態で (一応/usr/include/pgsql がないことを確認して)
あらためてconfigure する方がいいよ
状態に応じて最適なMakefileを作ってくれるのがconfigureなので。
0954NAME IS NULL2008/10/04(土) 19:17:29ID:DCYl0+1j
すいません、質問です。
CentOS5.2にPostgreSQL8.4をインストールしたのですが、
pg_ctl start
しようとすると

> FATAL: database files are incompatible with server
> DETAIL: The data directory was initialized by PostgresSQL version 8.1, which is
> not compatible with this version 8.4devel.

と表示されてしまい起動できません。
確かに一度8.1をインストールしているのですが、こういう場合、
OSごとインストールしなおすしかないんでしょうか?
0955NAME IS NULL2008/10/04(土) 19:22:28ID:???
>>954
8.1 を使ったことがある(データがある)かないかにもよるけど?
0956NAME IS NULL2008/10/04(土) 20:23:23ID:???
initdb -D 新しいデータベースディレクトリ --pwprompt

で新しいスペースを確保して

pg_ctl -D その新しいディレクトリ start

で動作させてみては ?
0957NAME IS NULL2008/10/06(月) 11:26:00ID:???
>>954
>>956の通りなんだけど、
データベースの場所は、環境変数PG_DATAに設定されていて、
PG_DATAの場所に以前のdbが残ってるってこと。
いらないデータならいったん消してinitdbしなおせばいいし、
場所移したいなら>>956のように新たにinitdbすればい。

PG_DATAはデフォルトだと、、、PG_HOME/dataつまり /usr/local/pgsql/data のままなんじゃないかな?
0958NAME IS NULL2008/10/13(月) 23:51:37ID:fi3Aq2C+
どなたかいらっしゃいましたら
PostgreSQL 7.3について教えていただきたいことがあるのですが、
VACUUM FULLを行い、時間がかかりすぎているため、中断したいのですが
その場合やはり不具合などはおきてしまうのでしょうか?
明日の朝5:00までにシステムを稼動させないといけないため、
あせっております。。
詳しい方いらっしゃいましたら、お願いいたします。
0959NAME IS NULL2008/10/14(火) 00:04:45ID:???
明日の朝5時なら終わるだろ
0960NAME IS NULL2008/10/14(火) 00:05:05ID:???
業務の事を2chで質問とは・・・
せめてMLに投げろよ。
お金を払ってる会社が可哀想です。
0961NAME IS NULL2008/10/14(火) 00:07:14ID:???
しかし一度2chで質問してしまってる以上同じ質問をMLでするのは恥ずかしいな
0962NAME IS NULL2008/10/14(火) 00:12:11ID:???
なーに、PHP MLでは日常茶飯事さ。
あっちをみていて、こっちを見ている人も多いだろうから
まあそういうものと思って優しい人が出てきてくれるだろう。
0963NAME IS NULL2008/10/14(火) 00:23:58ID:???
2chなら一番優しくて>>959だと思うぞ
これ以上優しい回答は出てこんよ多分
0964NAME IS NULL2008/10/14(火) 00:47:09ID:7sacMnBx
958です。
vacuum処理がなんとか終了しました。
10時間以上かかっていたので、同様してしまいました。
お騒がせしまして申し訳ありません。
0965NAME IS NULL2008/10/14(火) 00:54:13ID:???
以下同様。
0966NAME IS NULL2008/10/14(火) 01:17:47ID:???
vacuumってそんなかかるのか
0967NAME IS NULL2008/10/14(火) 01:23:06ID:???
7てフルでレコード多くて相当久しぶりなら掛かる可能性はある
でも毎週やれば長くても数十分で終わるけどね
0968NAME IS NULL2008/10/14(火) 01:50:49ID:???
それにしても、いまさら7.3というのがアレだ。
業務システムだとそうそうバージョンアップできないのは確かだけどさ…
0969NAME IS NULL2008/10/14(火) 02:56:05ID:???
逆に7.3ってことは5年以上データを蓄積しているってことでもあるな
0970NAME IS NULL2008/10/14(火) 03:24:45ID:???
vacuumにそんなに時間がかかるのなら、いっそdumpして新規DBにrestoreしたほうが
早いんじゃないか? もちろん、ストレージが必要になるけど。
0971NAME IS NULL2008/10/14(火) 03:33:57ID:???
鯖立ててもお釣りがくるな。
フォーマットからした方が良いかも。
0972NAME IS NULL2008/10/14(火) 03:57:31ID:???
素直に8.2以上にしなよ
0973NAME IS NULL2008/10/14(火) 22:56:41ID:???
vacuumに10時間かかるDBってどれくらいの規模か
ちょっと知りたい気がする。
どれくらい放置してたのかも。
0974NAME IS NULL2008/10/14(火) 23:05:33ID:???
スペックがしょぼいんじゃないの?
さらにメモリ少なくてスワップしまくりとか。
0975NAME IS NULL2008/10/14(火) 23:26:02ID:???
なおかつ金ケチってIDEのFakeRAIDとかありそうw
0976NAME IS NULL2008/10/14(火) 23:37:13ID:???
vacuum full なら不思議じゃないな。
数百GB/十数億レコードのDBだけど、丸一日かかるよ。
0977NAME IS NULL2008/10/14(火) 23:47:59ID:???
レコードてんこもりだー
何管理してんだろう?postgresqlもがんばれるものだね。
0978NAME IS NULL2008/10/15(水) 01:22:01ID:???
7.4でやってたけど2000万レコードで速度が微妙になりすぎてOracleに変えた
0979NAME IS NULL2008/10/15(水) 09:54:05ID:???
うちはサーバ換えたわw
0980NAME IS NULL2008/10/15(水) 20:57:50ID:???
サーバ換えは簡単にパフォーマンスを上げれるからいいな
0981NAME IS NULL2008/10/15(水) 21:46:25ID:???
サーバスペック上げた方が安くて早いってのは
近年の技術者の技術力低下の原因でもあるんだよな
無駄が多くてもハードとミドルで吸収しちゃうから作るソフトがクソになりやすい
選択肢がSQLチューニングしかないという状況をクリアして経験値積まないといかんよね
0982NAME IS NULL2008/10/15(水) 21:59:36ID:???
同感。DBに限らず言えることだね。
0983NAME IS NULL2008/10/15(水) 22:03:43ID:???
いやぁ、能力の足りない環境で無理しても、テーブル分割、繰り返しフィールド、
事前集計、事前結合が脈絡なく多用される糞設計になるのがオチ。
0984NAME IS NULL2008/10/15(水) 22:22:23ID:HojZLdyd
railsでDBとしてPostgreSQL使っています。
Webアプリにカウンター機能を持たせているのですが、ちょっと疑問に思ったことが
あるので質問させてください。

/app/indexにアクセスがくるとcounter tableのカラムのtodayの値を1増加させるのです
が、増加させる度にHDDにアクセスしているのでしょうか?

頻繁に更新のあるテーブルでもテーブルのレコードの値を変更する度にHDDにアクセスす
るようだと無駄が大きい気がするのですが、PostgreSQLではどのタイミングでHDDにアク
セスするのかご存知の方はおられないでしょうか?

もしおられましたら参考サイト・書籍などを紹介していただけないでしょうか?
0985NAME IS NULL2008/10/15(水) 23:40:25ID:???
起動オプションで-Fをつける。
http://www.postgresql.jp/document/pg834doc/html/app-postgres.html

ただ、チューニングするときは基本実測して、どこがボトルネックなのかを調べてからがいいよ。
0986NAME IS NULL2008/10/16(木) 00:18:10ID:???
>>984
PostgreSQLに限らず、基本的にはDBMSがチェックポイントっていうのを勝手に発行した
タイミングだよ。
タイミングは各DBMSの各バージョンによってそれぞれ変わってくる。
プログラムからDBにINSERTした直後はまだメモリの中。チェックポイントが走って初めて
ディスクに書き込まれる。

ただ、カウンタぐらいならそんな意識しなくても問題ないはず。
0987NAME IS NULL2008/10/16(木) 01:41:11ID:???
ログはその都度書かれると思うぞ
0988NAME IS NULL2008/10/16(木) 01:56:32ID:???
http://www.postgresql.jp/document/pg834doc/html/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT
要求からするとトランザクション単位で設定できるこっちの方がいいか。

>>986
postgresqlのデフォルトはそうじゃない
0989NAME IS NULL2008/10/16(木) 03:52:07ID:???
fsync=onならとりあえずディスクにはかかれるんじゃない?
commit_delayとかもあったと思うけど
09909842008/10/16(木) 23:48:24ID:???
皆さんありがとうございます。

私も自分で調べていて、どのDBでも最初はメモリに更新内容を蓄えておいて
ある瞬間になったらディスクアクセスするというような記述がありました。

DBの内容を変更するために毎回HDDにアクセスするか、メモリに書き込んで
キャッシュしておくかは設定次第ということも分かりました。

さらにはメモリのキャッシュ量まで設定できると知って驚きました。

また何か疑問に思ったことがあれば聞きにきます。
0991NAME IS NULL2008/10/17(金) 02:56:29ID:???
>>990
> 私も自分で調べていて、どのDBでも最初はメモリに更新内容を蓄えておいて
> ある瞬間になったらディスクアクセスするというような記述がありました。

そんなはずは。突然マシンが死んでも、コミットが完了したものについては
ディスクに書き込まれている事を保証する、というのが昔のイメージだった。
だからpostgresqlだってデフォルトでfsyncがonなんだろうし。
0992NAME IS NULL2008/10/17(金) 03:46:58ID:???
レスの内容を読んでないことが丸わかりで困る。
マニュアルじゃなく、その辺のサイトに書いてたことを鵜呑みにするくらいなら
こんなとこに来なくていいのに。
0993NAME IS NULL2008/10/17(金) 04:33:41ID:???
>メモリのキャッシュ量まで設定できると知って驚きました。

驚くなよ
conf見りゃ解るだろ
0994NAME IS NULL2008/10/17(金) 17:09:42ID:???
>>992
2chのレスよりその辺のサイトに書いてあることを信用するというのは
正しい姿勢かもしんまいw
0995NAME IS NULL2008/10/18(土) 17:36:30ID:???
次スレを建てました。

PostgreSQL Part.6
http://pc11.2ch.net/test/read.cgi/db/1224318817/
0996NAME IS NULL2008/10/18(土) 17:44:19ID:???
おつぅめ
0997NAME IS NULL2008/10/18(土) 20:42:36ID:???
みんな1000には興味ないの
0998NAME IS NULL2008/10/18(土) 20:50:04ID:???
気にするスレじゃ無い気がするw
0999NAME IS NULL2008/10/18(土) 20:51:09ID:???
1000なら、8.4が今年中にリリース(`・ω・)
1000NAME IS NULL2008/10/18(土) 21:53:08ID:???
1000取っておこう
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。