トップページ⇒php
1001コメント345KB

PostgreSQL

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2001/05/09(水) 11:36ID:GHX.oCXo
PostgreSQLについて語りましょう。
関連アプリケーション特有の話題は、以下のスレッドへ。

☆関連スレッド
[PHP + PostgreSQL]
http://corn.2ch.net/test/read.cgi?bbs=php&key=983128806
[PHP以外+PostgreSQL]
http://corn.2ch.net/test/read.cgi?bbs=php&key=988929199
[MySQL vs PostgreSQL]
http://corn.2ch.net/test/read.cgi?bbs=php&key=989341364
0002名無しさん@お腹いっぱい。2001/05/10(木) 12:18ID:???
PostgreSQL関連スレ乱立しすぎ。
0003名無しさん@お腹いっぱい。2001/05/10(木) 13:15ID:xUOtbAIE
すいません。せっかくDB版にもなったのに、PostgreSQL単体の
話題を書き込むときに、上の関連スレッドだと、書きづらいので
スレ立てました。
0004名無しさん@お腹いっぱい。2001/05/10(木) 13:32ID:???
1. PostgreSQLのシステムの話題
2. パフォーマンスチューニングの話題
3. コマンドの使い方に関する話題
4. 管理の話題
5. リリース・ニュースの話題
6. 雑談
とかの話題がここに集まれば、と思うのですが。
0005弐ch編者2001/05/10(木) 18:22ID:ch.0E1QI
えとー
perlでDBD::Pgモジュールツカーテ
Postgresいろいろいじてる初心者なんですが

シリアルタイプのデータてゆーのつかってみたいんですが
まぁID番号として振りたいわけなんですが
id_seqっていう名前のシーケンス作っておいて
$conn->do("insert into test values(nextval('id_seq'))");
とやってるんですが実際何番がわりあてられたかってのを取得したいんですが
どうすればいいんでしょう。
0006弐ch編者2001/05/10(木) 18:23ID:ch.0E1QI
↑
あ、
$conn->do("insert into test values(nextval('id_seq'))");
の前には
$conn = DBI->connect("dbi:Pg:dbname=$dbname", "", "");
をやってます(ま、あたりまえか
0007弐ch編者2001/05/10(木) 18:24ID:ch.0E1QI
↑
あ、
$conn->do("insert into test values(nextval('id_seq'))");
の前には
$conn = DBI->connect("dbi:Pg:dbname=$dbname", "", "");
をやってます(ま、あたりまえか
0008弐ch編者2001/05/10(木) 18:25ID:ch.0E1QI
↑
あ、
$conn->do("insert into test values(nextval('id_seq'))");
の前には
$conn = DBI->connect("dbi:Pg:dbname=$dbname", "", "");
をやってます(ま、あたりまえか
0009名無しさん@お腹いっぱい。2001/05/10(木) 18:36ID:???
>>5
同一セッション内であれば、nextval('id_seq')の後ならcurrval('id_seq')で
取得できます。
nextval('id_seq')しなければcurrval()は使えません。
0010名無しさん@お腹いっぱい。2001/05/10(木) 20:38ID:xUOtbAIE
えとー、PostgreSQLって、DBオブジェクトの依存があって、
AがBに依存していると言う場合、Bを再作成しちゃうとAが
動かなくなったりしますよね。

これって、何か解決方法は無いんでしょうか?
Aを作り直す以外に。

今日、これで大ポカをやってしまい、DBオブジェクトの
xrefでも作ろうかと思ってるんですが、ひょっとして
既に存在したりします?
0011電動ナナシ2001/05/11(金) 12:22ID:???
create table hoge;
create view hogeview;
drop table hoge;
create table hoge;
すると、hogeview がダメになるって話だよね。

オブジェクトを作り直すと oid が変わるから、って理由だっけ?
そうだとしたら無理だろうね。

自分は直接コマンドを打たずに、スキーマ生成スクリプトを使うようにしている。
drop view hogeview;
drop table hoge;
create table hoge;
create view hogeview;
という内容のファイルを作って、スキーマを更新するだびに psql -d DB -f hoge.sql
という感じで流し込む。データの移行が必要なら、
drop table hoge;
create table hoge;
のところを
alter table hoge rename hogehoge;
create table hoge;
insert into hoge select ...(新しいスキーマにあわせる)... from hogehoge;
という風にすればいい。
0012名無しさん@お腹いっぱい。2001/05/14(月) 19:19ID:YqqCadMo
むぅ、やはりそうですか。
情報、さんきう。

create table dbobjs (
parent text,
child text
);
というテーブルを作って、
table - view
table - function
function - view
function - function
の依存関係をつっこんで、table Fooを変更したときに何をどの順番で
作り直せば良いのかを出力するモノを作ろうとしたんですが、挫折しました(^^;
0013名無しさん@お腹いっぱい。2001/05/14(月) 19:21ID:???
全部出来ているけど、作成の順番によって動かないものが
存在するってヤですよね。
どうにかならないのかなー?
0014電動ナナシ2001/05/15(火) 15:15ID:???
どうにもならないし、どうにかしたらまずいだろうね。

hoge に依存する View を作った後で

drop table hoge;
create table hoge;

と作り直したとして、この hoge が、たまたま名前が一緒であるだけの
全然違う意味を持つテーブルである可能性は常にあるからね。勝手に
view を有効にしたらそれこそ迷惑じゃないかな。
0015名無しさん@お腹いっぱい。2001/05/15(火) 17:06ID:2pI6By2w
 
001612001/05/15(火) 18:05ID:flqm6i8Y
>>14
>どうにもならないし、どうにかしたらまずいだろうね。

でもOracleはそのView定義に問題がなければ、何事も無かったように
検索できるよ。

>勝手にview を有効にしたらそれこそ迷惑じゃないかな。

うーん、迷惑な場合もあれば、迷惑じゃない場合もありますよね。
「カラムの追加」なんかは、既存のDBオブジェクトには関係ない
だろうし。

せめて「依存しているオブジェクトがあります」くらいの警告が
欲しいです。SQL92の’Restrict'が指定できればいいんだけど。
0017電動ナナシ2001/05/15(火) 20:27ID:???
>>17
なるほどね、Oracle は名前にのみ依存しているんだ。
# SP みたいに依存性管理をきちんとやっているのかな?

警告については同意。FKey については警告してくれるのにね。

DROP CASCADE とかサポートしてくれるとかなり違うよね。どうせ無効に
なるなら自動的に消してくれって感じもする。まあ要望があるならここで
愚痴たれずに自分で実装しろって話になるから、そんな実力を持っていない
漏れは黙っているしかないんだけど。
001812001/05/16(水) 10:11ID:???
>>17

>なるほどね、Oracle は名前にのみ依存しているんだ。
># SP みたいに依存性管理をきちんとやっているのかな?

んと、SPがなんだかわからないので、はずしてるかもしれないけど、
依存性管理はきちんとやってます。
オブジェクトの状態(Valid or Invalid)をシステムカタログに持っていて、
依存するオブジェクトが削除された場合は、即座にInvalidになります。
だから、Invalidなオブジェクト一覧、なんてのも簡単に検索できます。

また、「オブジェクトのコンパイル」という概念があり、「リコンパイル」
すれば、依存関係をチェックし、問題なければValidになります。

InvalidなViewにアクセスすると、自動的にコンパイルされ、Validになれば
通常どおり検索でき、Invalidならエラーになります。

・・・って感じですね。

>まあ要望があるならここで
>愚痴たれずに自分で実装しろって話になるから、そんな実力を持っていない
>漏れは黙っているしかないんだけど。

それは僕も同様。まあ、いいじゃないですか、愚痴言い合いましょうよ。
MLはそんな雰囲気じゃないし。

# 電動ナナシ氏の一人称が「漏れ」だということを知り、ちょっとショック(w
0019電動ナナシ2001/05/16(水) 13:26ID:???
SP は Stored Procedure/Package の省略形。
あまり一般的でなかったか?すまぬ。

そういえば Schema Manager で Valid/Invalid とかいちいち見ていた記憶が
よみがえってきた。
# 最近 Oracle 触ってないから忘れてるよ・・・。
002012001/05/16(水) 13:55ID:???
あ、SPってソレだったんですね。
何かSybaseのアレとかMS SQL Serverのソレが強烈に頭に残ってたので
???状態でした。

そういう意味で言うと、Oracleのパッケージの思想は秀逸ですよね。
PostgreSQLにとっては無いものねだりなんですが。
0021電動ナナシ2001/05/16(水) 15:30ID:???
PL/SQL ってもともと Ada だよね。
Ada の Package/Interface がそのまんま引き継がれた感じだね。

PostgreSQL でも PL/Perl を使って Perl のパッケージ機能?を
使えば似たようなことができるんじゃないかと愚考してみたり。
# Perl はマジで知らん・・・。
002212001/05/16(水) 16:47ID:???
ふむふむ、勉強になるなぁ。

僕はRubyな人だから、PL/Perlがあることなんてすっかり忘れてた。
PerlはPerl4までの知識しかないし。

暇が出来たら調べて見よう。
002312001/05/17(木) 13:16ID:vuz.jAiQ
石井達夫氏の『改訂第3版 PC UNIXユーザのためのPostgreSQL完全攻略ガイド』
がようやく出版されるようです。
通称『シーラカンス本』というやつですね。

http://www.cbook24.com/bm_detail.asp?sku=01051501

対応バージョンも7.1.1で、うれしい限りです。
002412001/05/17(木) 13:16ID:???
>>23
あ、発売日は6/4だそうです。
002512001/05/17(木) 18:40ID:???
PL/Perl:
うーん、あの程度のマニュアルじゃ何も分からない。
引数を$_[0], $_[1]などと参照できるのと、タプルをハッシュで受け取る、
ってことしか書いてない。あ、外部ファイルへの書き込みは出来ない
というのもあったけど。

ソースをちらっと眺めたら、トリガーではPL/Perlは使えないような
コメントもあったし、一体PL/Perlって何の意義があるのかわからなかった。

今後発展していくのかな。
0026名無しさん@お腹いっぱい。2001/05/25(金) 13:08ID:Tkv4/1zU
少々お聞きしたいのですが

例えばperlから
$hoge="insert into hoge values('ほげ')";
$result = $conn->exec($hoge);

とした場合、もし追加できないという場合のエラーメッセージなどは
どこで取得するのでしょうか?
0027名無しさん@お腹いっぱい。2001/06/14(木) 08:12ID:N.VaDaWU
PostgreSQL ODBCでAccess2000上にリンクテーブルを新規作成しようとしているのですが・・・


ODBC--呼び出しは失敗しました。
Could not connect to server.
Could not connect to remote socket.(#101) [Microsoft][ODBC Driver Manager]

と言われてしまいます。
どうしたらよいのでしょうか?
#これだけでは情報が足りないのかもしれませんが、
#しかし、どういった情報を提示すれば皆様にお助けいただけるか分からないため、
#それもお教えねがえますでしょうか?
0028名無しさん@お腹いっぱい。2001/06/14(木) 08:46ID:???
>>27

エラーメッセージ読めば分かるだろ。
0029名無しさん@お腹いっぱい。2001/06/14(木) 15:07ID:???
Postgreでtextカラムにでかい文字列入れたらそのテーブルが壊れる(selectも利かなくなる)って
聞いたことないでしょうか?
0030名無しさん@お腹いっぱい。2001/06/14(木) 15:08ID:???
Postgreでtextカラムにでかい文字列入れたらそのテーブルが壊れる(selectも利かなくなる)って
聞いたことないでしょうか?
0031名無しさん@お腹いっぱい。2001/06/14(木) 16:00ID:bZl.pTIs
どれくらいの文字列だ?
0032292001/06/14(木) 16:15ID:???
二重スマソ。

>>31
破損時にinsertしたのがおおよそ4k。発生しない場合もあります。
何kだから発生するというものではないようです。
0033名無しさん@お腹いっぱい。2001/06/14(木) 17:06ID:bZl.pTIs
ラージオブジェクトを使ってない前提で確か1レコード8kまでは
いけるはずだったと思うよ。
昔掲示板作ったけど内容の部分を4kで規制してるが問題なく動いてる
0034292001/06/14(木) 17:54ID:???
ある程度正常なデータをinsertしておいてから長いSQL文等でpg_exec()のエラーを
起こすと発生するようです。「ようです」としか書けないヘタレで申し訳ありませんが。
0035292001/06/14(木) 18:02ID:???
環境。
Apache/1.3.20
PHP Version 3.0.18-i18n-ja-2
PostgreSQL 6.5.3
0036272001/06/14(木) 18:10ID:ObjdY6qg
Could not connect to remote socket
の原因が分からないもので・・・。
「詳解PostgreSQL入門」の通りにやったはずなのですが・・・
0037272001/06/16(土) 06:00ID:1YgBviPk
postmaster でiオプション付けるの忘れてました。鬱だしのう
0038名無しさん@お腹いっぱい。2001/06/18(月) 00:16ID:4Y6BFwKU
>>35
そのPostgreのバージョンはvacuumするとデータが壊れちゃう
バージョンだけど、そのせいじゃないの?

vacuumかけると、データが壊れるらしい。。。
0039名無しさん@お腹いっぱい。2001/06/19(火) 00:16ID:???
7.1.2 にすると、無制限になるはず。
0040名無しさん@お腹いっぱい。2001/06/20(水) 18:41ID:CEGcishk
MLで非常に気になる発言が・・・。

[pgsql-jp 21916]
>  主キーの1つを検索する場合にはインデクスの全体がオンメモリに入っていな
> くてもそれほどパフォーマンスが落ちるとは思えません。たとえば1ページに
> 200件のエントリがあるとして、3回アクセスで 200×200×200で8,000,000件の
> データを網羅できますから、データ本体へのアクセスを含めてせいぜい4回のディ
> スクアクセスで済むはずです。200件というのは大雑把に言っただけで根拠があ
> る数字ではありませんが、仕組みを理解すれば30万件を過ぎたら急にパフォーマ
> ンスが落ちるということが起こりにくいと推測できます。ただしこれはB-Treeが
> バランスよく構成されている場合の話です。

マジすか、これ?
俺の想像していたのと全然違う・・・。
0041名無しさん@お腹いっぱい。2001/06/20(水) 18:49ID:628tfmwg
>>40
どう想像してたの
0042夜勤 ★2001/06/20(水) 18:54ID:???
ちょっとテスト
0043名無しさん@お腹いっぱい。2001/06/21(木) 10:46ID:oxRjCmRE
>>41
2^22 < 8,000,000 < 2^23ですよね。
だから、800万件のインデックスアクセスは、最大23回のアクセスが必要。
平均は・・・うーん、解らない。12回、じゃないよね。

ただし、同じブロック内にn回目、n+1回目、・・・がある場合もあるからディスク
アクセスの回数はそれなりに減るけど、「せいぜい4回で」というのはどうも
納得できません。
0044名無しさん@お腹いっぱい。2001/06/22(金) 11:27ID:WswC8UUc
B-Treeはbinary treeでは ないよ。ノード数がもっと多い。
アルゴリズム辞典でも調べるべし。
0045名無しさん@お腹いっぱい。2001/06/22(金) 12:03ID:4sT6WJJU
B-Treeについて、勘違いしてました。昨日からいろいろと調べてみました。

でも、さらに疑問が。
> 1ページに200件のエントリがあるとして
これは一体どういう意味なんでしょう?N=100ということ?

また、「せいぜい4回のディスクアクセス」というのは、「木の高さはせいぜい4である」
ということですよね?
何故これが言えるのでしょう?
0046名無しさん@お腹いっぱい。2001/06/25(月) 17:09ID:ejiw8dks
そこから先は実装にもよるし、ソースを読んで納得してもらうしか。
0047rissen-truchi2001/07/13(金) 03:47ID:IdnCE2mY
どこかしこで初心者質問していて非常に恐縮なのですが教えて下さい。
redhat7.0+postgresql7.0でpgaccessを使おうと思いました。

まずlinux版を導入しようと思って、/usr/local上にpgaccessを展開して、
/usr/binにシンボリックリンクを張りました。「pgaccess testdb」で
起動しようとしたところ、invalid command name "image"とのエラーが。
/usr/local/pgaccess/main.tclの5行目のimageというコマンドが実行
出来ていないみたいです。

とりあえず問題は棚上げしてWindowsでpgaccessを導入しようと思いました。
Windows2000にtcl/tkを入れてpgaccessを導入しました。main.tclを
起動するとpgaccessが起動したのですが、「database」「open」で繋がっている
linuxマシンに接続しようとしたら
Is the postmaster running (with -i) at 'localhost' and accepting
connections on TCP/IP port '5432'?
とエラーメッセージが出ます。
postmasterに-iは付けて起動しているのでその点は問題なさそうなので、
localhostの名前が違ってるかport5432が閉じているかという所でしょうか。
ちなみにlinuxでユーザ名postgresで接続しているときに、コンソールで
[postgres@localhost postgres]$と表示されていたらWin2000からの接続先の
名前はlocalhostでいいんですよね?
そうするとport5432が開いているかどうかも確認する必要ありでしょうか。

linux版でもwindows版でもどちらでもいいので、pgaccessが動くようにしたいです。
どなたか上記書き込みから何か分かる事は無いでしょうか。
0048名無しさん2001/07/13(金) 04:44ID:eePtt3OA
漏れは、WindowsからCommon SQL Environment使って、
開発するぞ(゚Д゚)ゴルァ
http://www.hi-ho.ne.jp/tsumiki/

他にもいいのが有ったら教えれ。
0049名無しさん@お腹いっぱい。2001/07/13(金) 13:29ID:???
日記の検索システムを作ろうと思ってるのですが、date型で7月分だけを選択とか、textである文字列を検索というのをselect文でやろうとしたのですが、やり方が分かりません。
どうやればできますか?
0050名無しさん2001/07/13(金) 14:06ID:???
7月分は、'2001-07-01'::date + '1 month'::interval とかつかって検索かな?

textの検索は、正規表現使って、WHERE mojiretsu ~* '.*h[ao]ge.*'とするか、
それで速度に不満が出れば、Chasenとかで単語を抜き出してインデックス作ったり、
全文検索ソフトのNamazuと組合わせたりするのがいいと思う。

自信無いけどな。
0051492001/07/13(金) 22:56ID:TzQ65wDI
ありがとうございます。>50
取り敢えず7月分ってのは
select * from hoge where date =< '2001-07-01' and date > '2001-08-01'
って感じでやりました。
全文検索はソースがあるページとかないですかね?
0052名無しDB2001/07/13(金) 23:57ID:???
Postgreでもtext型の中を検索することはできるけど、
それをやるならnamazuのがいいよ。

Postgreでやると、ホントに、1文字づつ全文検索する
ことになるから、文章の検索ならnamazuだね。

ちなみに、もし Postgreを使う場合のやり方は

nikki_bunsyo like '%日記%'

とかって書くよ。この場合 nikki_bunsyo 項目の中で
日記の文字がつくレコードが全部選択されるよ。
でも、この方法は負荷がメチャ高いからほどほどに。。。
■ このスレッドは過去ログ倉庫に格納されています