PostgreSQL Part.5
レス数が1000を超えています。これ以上書き込みはできません。
0001NAME IS NULL
2007/12/01(土) 21:38:37ID:LPSUO/OT前スレ [【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 NULL
2007/12/02(日) 00:41:47ID:Q5JHapW8乙! 盛り上がっていきましょうw
0003NAME IS NULL
2007/12/02(日) 13:35:21ID:???0004NAME IS NULL
2007/12/04(火) 02:25:53ID:???【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 NULL
2007/12/04(火) 02:34:18ID:???年明けにでもPCを入れ替えるものがあるので、どうせなら8.3をつっこんでやろうかと思ったり。
0006NAME IS NULL
2007/12/04(火) 09:38:05ID:???今月とか来月じゃなかったっけ?
セミナーでベータ版使ってくれって言ってた。
0007NAME IS NULL
2007/12/05(水) 00:41:02ID:gLh1+dWI本家のMLに流れてた
00085
2007/12/05(水) 00:53:45ID:???サンクス。
初夏の頃にフリーズされてから結構かかったような。
こんなもんでしたっけ? 当初夏から秋にかけてリリースする
雰囲気だったような気もするのだが。
-- 素直に8.2を入れて頃合いを見て8.3へ上げることにすっかな。
0009NAME IS NULL
2007/12/05(水) 10:55:20ID:???初めて使うもので (MySQL からの移行)、せっかくだから Auto VACUUM あったら楽そうでいいかなとか。
Beta 4 の文字列が公式サイトで見られるけど、配布されているもののファイル名は beta3 だね…。
0010NAME IS NULL
2007/12/05(水) 11:05:25ID:???0011NAME IS NULL
2007/12/06(木) 09:01:33ID:symOClnh0012NAME IS NULL
2007/12/07(金) 15:31:14ID:rx0IPmKFhttp://phppgadmin.sourceforge.net/?page=download
↑のページの中断にRHEL用のrpmの置き場として、
↓へのリンクがあるのですが、NotFoundになっています。
http://ftp.icdevgroup.org/phpPgAdmin/
どなたか他の置き場などご存知ないですか??
0013NAME IS NULL
2007/12/08(土) 09:29:08ID:???select * from pg_stat_activity
その接続を強制切断(強制終了)はできるのでしょうか?
Windows版使用です。
0014NAME IS NULL
2007/12/09(日) 03:54:35ID:Pkpabdth9.0とメジャーバージョンアップしてもいいぐらい
機能がてんこ盛りだからね。
レビューに時間がかかったみたい。
0015NAME IS NULL
2007/12/09(日) 04:05:49ID:???もうわかりませんわ。
0016NAME IS NULL
2007/12/10(月) 16:40:19ID:???procpid でプロセスを終了させるといいようですが、
自分自身の接続のpostgres.exe の PID(procpid)を取得する方法はあるのでしょうか?
0017NAME IS NULL
2007/12/12(水) 08:49:31ID:???つpg_cancel_backend()
0018NAME IS NULL
2007/12/13(木) 01:33:25ID:w5o1YGhv16が知りたいのは自分自身のPIDを取得する方法
0019NAME IS NULL
2007/12/13(木) 12:04:20ID:???引数にpidいるのかw
\df でそれらしいの探したら pg_backend_pid() というやつで返ってきたけど。
0020NAME IS NULL
2007/12/13(木) 14:05:41ID:???ありがとうございます。
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 NULL
2007/12/13(木) 14:11:46ID:???って、たぶん実行中だとキャンセルされるっていう意味なんだろーなー?!(想像)
0022NAME IS NULL
2007/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 NULL
2007/12/13(木) 23:32:12ID:???> 改行コードが\nのままの値
改行コードが含まれているんだから、表示すると改行されるのが当たり前。
「改行コードを『'\n'という文字列に変換』して」ということなら、
INSERT INTO Table VALUES(replace('123\n456\n789','\n','\\n'));
なんかでやればいいけど、それはもう改行コードじゃなく'\n'という文字列。
0024NAME IS NULL
2007/12/13(木) 23:33:24ID:???http://www.postgresql.jp/document/pg825doc/html/sql-syntax-lexical.html
の4.1.2.1.
0026NAME IS NULL
2007/12/14(金) 00:52:16ID:???pg_cancel_backend()は実行中のSQLをキャンセルする関数。
プロセスを終了させるもんではないわな。
例えば、数分間結果が返ってこないSQLを一旦キャンセルしたいようなときに使う。
0027NAME IS NULL
2007/12/14(金) 02:15:50ID:???やはりそうでしたか。
どうもです。
pg_kill_pid()なんていう関数があると便利なんですがねぇ。笑
0028NAME IS NULL
2007/12/14(金) 04:16:14ID:???0029NAME IS NULL
2007/12/14(金) 05:05:24ID:???0030NAME IS NULL
2007/12/14(金) 05:17:17ID:???postgres.exe 以外のプロセスもKILLできると勘違いしてるか、
プログラミングができない人だよ。
仮にKILLできても、su や admin なら問題ない。
0031NAME IS NULL
2007/12/14(金) 05:25:16ID:???『釣られてるよ』
ですかね?!
003228
2007/12/14(金) 15:27:56ID:???接続毎にバックエンドが上がるのを完全に忘れてた。
危険な機能には権限で対処てのは当然思ってたけど、
pg_cancel_backend(pid)も管理者権限がないと使えないんだな。
PQcancelと違って任意のバックエンドに対して使えるみたいだから
当然だけど。
13が意図してることはさっぱり理解も同意もできないし、
単に接続終了かキャンセル+終了でよさそうなもんだけど、
調べてみるとpg_terminate_backend(pid)てのがソースにあった。
中身はSIGTERM送るだけ。
信頼性を損ねるからダメとコメントが付いてて使えないが。
長文スマソ
0033NAME IS NULL
2007/12/14(金) 17:05:37ID:???APIで強制終了できるのかな?
0034NAME IS NULL
2007/12/14(金) 17:17:27ID:???>単に接続終了かキャンセル+終了でよさそうなもんだけど、
それってどういうコマンドですか?
その操作でプロセスも終了するんですか?
0035NAME IS NULL
2007/12/14(金) 17:23:54ID:???>>28
ちなみに悪用される危険性、わからないな。
悪用される危険性があるなら、されないように
関数を作ればいいんではないか?
0036NAME IS NULL
2007/12/14(金) 17:28:39ID:???0037NAME IS NULL
2007/12/14(金) 17:58:17ID:???なんの権限無しにできるのが、アレだけど。笑
悪用もへったくれもないが、さて、どんな風にからんでくるの?
0038NAME IS NULL
2007/12/14(金) 17:59:07ID:???×最開始
○再開始
0039NAME IS NULL
2007/12/14(金) 18:03:27ID:???Windowsの管理者権限だけが必要だね
0040NAME IS NULL
2007/12/15(土) 08:20:17ID:???CURRENT_TIMESTAMP - INTERVAL (HOGE.HOUR || ' hour')
と書いてみたが HOGE.HOUR で構文ネラーで撥ねられた。
0041NAME IS NULL
2007/12/15(土) 10:02:09ID:???CURRENT_TIMESTAMP - (HOGE.HOUR || ' hour')::INTERVAL
0042NAME IS NULL
2007/12/15(土) 10:10:07ID:???INTERVAL って前置演算子みたいなものかと思ってましたが、よく考えたら型でしたね。
ありがとうございました。
0043NAME IS NULL
2007/12/15(土) 16:02:06ID:???0044NAME IS NULL
2007/12/15(土) 21:07:52ID:???8.3ではインストーラの方でVista対応してくれるんでしょか?
http://www.iwahrt.com/iwahrt/ListProblemSolution.do?problemNo=185&categoryNo=13
0045NAME IS NULL
2007/12/17(月) 08:59:44ID:VmIYEZ1r某国の株価データを入れているのですが、レコードが7000万件くらいに
なってしまいます。(今はずーっとinsertしつづけていて、5000万件を
越えたところ)。まだ全部入ってないので途中なのですが、
SELECT * from stock_data;
とすると、20分ほど頑張った後でメモリ不足で表示がされませんでした。
一件のレコードは、35個のデータから構成されてます。こういう状況で
上記のSQLとかがサクサク実行できるような方法はありませんか?
メモリは2GB積んでます。
今週終わりくらいに時間がとれるので、oracleとmysqlもためしてみようと
思ってるんですが、mysqlはさわったことないし、oracleはGUI経由
で操作するのを強制されるようなところが嫌で、、psqlとかでリモートから
色々できるのがいいので、できればpostgresqlでやりたいんですが。。
あと、ティックデータも入手できれば飛躍的にデータ量が増えそうなのですが、
postgresqlの実用的な範囲って、データ量どれくらいなのでしょうか?
色々質問ばかりですいません。
0046NAME IS NULL
2007/12/17(月) 14:00:41ID:???詳細環境も提示したほうが答えやすいかも。
少なくともPostgreSQLのバージョンは。
0047NAME IS NULL
2007/12/17(月) 14:47:10ID:???SELECT文で条件指定しないで全取得すれば、データ全取得しようとするから
遅いし、(クライアントの)メモリが足りなくなるよね。
とりあえずは、条件設定したり、LIMIT OFFSET で件数絞ってやってごらん。
0048NAME IS NULL
2007/12/17(月) 14:50:17ID:???0049NAME IS NULL
2007/12/17(月) 16:18:17ID:???サーバではなくクライアント側のメモリが足らなくなるというのがポイントですな。
クライアント側では、普通、何万件オーダーのSQLの返りを受け取れるようにはできていないので。
0050NAME IS NULL
2007/12/17(月) 16:19:54ID:???クライアントプログラムを書けばいい。
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 NULL
2007/12/17(月) 17:00:25ID:???Limit とかoffset で抽出してみるのわ?
0052NAME IS NULL
2007/12/17(月) 17:03:15ID:???これもインデックス無いとかなり時間かかると思う。
0053NAME IS NULL
2007/12/17(月) 17:11:04ID:???0054NAME IS NULL
2007/12/17(月) 17:54:48ID:???005550
2007/12/17(月) 18:00:28ID:???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 NULL
2007/12/17(月) 18:15:11ID:???n 件の行を取ってきた後にソートするという動きで金玉もげるかと思ったのを思い出した。
0057NAME IS NULL
2007/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 NULL
2007/12/17(月) 22:11:07ID:???ノートPCでメモリ2Gでクライアント&サーバをやって
> それにしても、データだけでディスクをかなり占領するし、メモリ確保関係の
> エラーにも何回も遭遇するし、大量データを扱うのは大変ですね。
ってそりゃあ、おいおいって感じだ。
0059NAME IS NULL
2007/12/17(月) 22:16:00ID:???0060NAME IS NULL
2007/12/17(月) 23:17:42ID:???0061NAME IS NULL
2007/12/18(火) 09:32:43ID:???操作も覚えるしいいと思うがな
0062NAME IS NULL
2007/12/18(火) 14:06:28ID:???データベースシステムを図書館と司書さんに例えると、
----------------例え話----------------------------
お客(クライアント)は、司書さんに「○○の本を貸してください(SELECT * FROM xxx WHERE ○○)」と問合せをかける。
お客は問合せの結果をバッグに入れてユーザーの所まで持ってくるわけだ。
藻前さんが最初にやったのは、図書館の本全部を一気にバッグに入れて持ってこさせようとした。そりゃ無理だ罠。
だからこそ、「○○な本のうち、50音順で500冊目から100冊持ってきて」という様に要求を区切って出したり、
「○○な本全体で、△△という単語が何回出現するか数えてきて」と集計する要求を出したりするわけだ。
DBのテーブルを分類ごとの書架だとすると、
その書架でも本がすごく多いモノ(例えば小説とか)を一定単位(作者別とか)で仕切るのをパーティショニングという。
パーティショニングされていないと、司書さんは書架全体の中から探す事になり、時間が掛かる。
インデックスっていうのは、図書館の蔵書を管理するカードの様なもので、それを元に検索すると素早く検索できる。
いくら司書さんが、本の扱いに慣れていても、一瞬一瞬に扱う本は1冊づつで、
その時扱っている本(インデックス含む)を差す指がカーソルという事だ。
----------------例え話----------------------------
株価のデータベースで、過去も含めた全てのデータを集計もせずに取り出す場面が(バックアップ目的以外で)あるとも思えない。
バックアップ用途なら、ダンプを取れば良いし、集計クエリやら条件付けやらをして、取り出す件数を絞れば、
メモリ不足でクライアントが動かなくなる事態がそうそう頻発するとは思えない。
OlacleやらMySQLにデータを移すなら、共通に使えるクライアント(ODBC等)経由で、
PostgreSQLのテーブルからSELECT INTOとか使って一気に流し込んじゃう方が楽だ。
0063NAME IS NULL
2007/12/18(火) 23:20:02ID:/fynqWlShttp://pgfoundry.org/projects/ptop/
0064age
2007/12/18(火) 23:53:42ID:???0065NAME IS NULL
2007/12/19(水) 00:45:26ID:kklpHsFGパフォーマンスチューニングするのに使えそうね。
そういえば8.3の全文検索機能試してる人いる?
0066NAME IS NULL
2007/12/19(水) 00:50:25ID:???0067NAME IS NULL
2007/12/19(水) 10:38:38ID:???57じゃないが、勉強になったThx
0068NAME IS NULL
2007/12/21(金) 03:10:15ID:fwC7Qy9u0069NAME IS NULL
2007/12/21(金) 10:46:56ID:???参加できたなー、申しこむんだった
0070NAME IS NULL
2007/12/27(木) 00:25:14ID:???0071NAME IS NULL
2007/12/27(木) 08:24:23ID:YLT4m45U色々勉強になりました。(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 NULL
2007/12/27(木) 10:49:45ID:???psqlでDOBC使わないし。
ODBC使うツールでやってくれるやつもありそうだけど。
まあ実行可能ならdumpしたSQL食わせるのでいいと思うよ
0073NAME IS NULL
2007/12/28(金) 07:27:58ID:???> # pg_dump -d kabu > dump_file
> # dump_fileを編集(テーブル一個の単純なDBなので、これは簡単そう)
本当に編集が簡単と思っているのか?
7000万件INSERTした結果のdump_fileなんだぞ?
なんか最初から見てるけど、感覚がおかしい。
0074NAME IS NULL
2007/12/28(金) 12:36:23ID:e6yBnBlwテーブルが一個しかなくて、編集といっても、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 NULL
2007/12/28(金) 12:42:12ID:???少なくとも
> それともDBの使い方がまずいのでしょうか?
なんてことを書いているようなレベルの人には
> これはやはり、多すぎると考えるべきなのでしょうか?
多過ぎるかと。
0076NAME IS NULL
2007/12/28(金) 12:48:55ID:???抽出条件に対して適切にINDEX張ってれば
そんなに多いって訳でもないと思うが…
>>75の言うことももっともだと思う。
0077NAME IS NULL
2007/12/28(金) 14:39:10ID:???大量データ流し込んでチューニング
0078NAME IS NULL
2007/12/28(金) 21:26:08ID:???いまさらだろうが、クライアント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 NULL
2007/12/29(土) 08:56:26ID:???0080NAME IS NULL
2007/12/29(土) 10:08:24ID:???作るだけ作って辞めるのもアリだなwww
ドキュメント? メンテナンス? シラネwww
0081NAME IS NULL
2007/12/29(土) 20:30:37ID:???お断り出来ないときは、見積でふっかけましょう。
メンドクサイ客で予算が少ない時は、見積次第で客をコントロールする事は可能です。
自社の営業がヘッポコな時はむずかしいですが、
自社の営業を接待漬けにするぐらいの勢いがあれば危機対応能力は向上すると思います。
0082NAME IS NULL
2007/12/30(日) 22:50:01ID:???見積もりするけんg(ry
0083NAME IS NULL
2007/12/31(月) 02:37:49ID:???0084NAME IS NULL
2007/12/31(月) 13:18:59ID:???「お前らの見積なんぞ知らんがな。とにかくこれだけの金で作れ。」
・・・ってところも多いがな。
0085NAME IS NULL
2007/12/31(月) 17:03:38ID:n233Vr/g0086NAME IS NULL
2008/01/02(水) 10:20:25ID:???0087NAME IS NULL
2008/01/02(水) 14:47:49ID:???ユーザーを管理するテーブルって何て名前にしてます?
user
はすでにあるみたいで使えないし
"user"
にすると、セレクトかける時も"user"にしなきゃならないし
tbl_user
とか接頭語や接尾語つけるのはあんまり好きじゃないし・・・
users
っていうのも考えたけど、なんでユーザーだけ複数なんだ?って感じだし
どうして、こんな一般的にみんな使いそうな名前を初期で入れてるだよ〜
他の名前にしてくれればいいのに
まあ、どうでもいいから好きなのつけろって言われそうだけど、皆さんどうしてます?
0088NAME IS NULL
2008/01/02(水) 15:02:56ID:???どうでもいいから好きなのつけろ
0089NAME IS NULL
2008/01/02(水) 17:13:26ID:???http://www.postgresql.jp/PostgreSQL?top
0090NAME IS NULL
2008/01/03(木) 01:08:09ID:???本体は日本語版も何も無いだろう
0091NAME IS NULL
2008/01/03(木) 16:09:34ID:???passwd
0092NAME IS NULL
2008/01/03(木) 17:34:40ID:???そもそも本体の話しはしてない禿
0093NAME IS NULL
2008/01/05(土) 11:36:26ID:???usertbl
0094NAME IS NULL
2008/01/05(土) 12:38:26ID:???0095NAME IS NULL
2008/01/05(土) 12:58:23ID:???そんな資料は出せないはず。Oracleが禁止してなかったっけ?
昔の話だから、今はどうか知らないけど。
0096NAME IS NULL
2008/01/05(土) 20:22:55ID:???配列の要素にNULLが存在する場合にマッチするクエリは、どのように記述するのか教えてください。
PostgreSQL 8.3beta4です。
0097NAME IS NULL
2008/01/05(土) 20:45:32ID:Ible2iRH0098NAME IS NULL
2008/01/06(日) 12:11:23ID:???自前で比較用の関数用意するしかないんじゃね。
ANYとIS NULLの組み合わせじゃダメだし。
0099NAME IS NULL
2008/01/06(日) 20:18:51ID:???ありがとうございます。次のテーブルに対して、
下記のクエリを作成することで対処しました。遅いですが。
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 NULL
2008/01/07(月) 12:56:11ID:???このページのConstraint Exclusionは、条件に合う部分だけ検索がかけれるということなのでしょうか?
実際に試してみたところ、テーブル内を全て検索するのと速度があまりかわらないような気がするのですが・・・
PostgreSQL 8.2.5です
0101NAME IS NULL
2008/01/07(月) 23:12:54ID:???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 NULL
2008/01/07(月) 23:19:12ID:???0103NAME IS NULL
2008/01/08(火) 08:03:14ID:NK7MHFFtしかし8.3は難産ですね。RCも1で終わってくれるのかな・・・?
0104NAME IS NULL
2008/01/08(火) 08:52:18ID:???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 NULL
2008/01/08(火) 12:50:49ID:???http://itpro.nikkeibp.co.jp/article/NEWS/20080108/290554/
0106NAME IS NULL
2008/01/08(火) 23:54:49ID:???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 NULL
2008/01/09(水) 03:56:47ID:???通常、PC-Unix 版に比べてどのくらい遅れてリリースされるのかな。
0108NAME IS NULL
2008/01/09(水) 20:39:00ID:???普通は遅れはほぼゼロ。
0109NAME IS NULL
2008/01/10(木) 00:13:06ID:???マニュアル見ても、create/alter でテーブルスペース指定することはできないし、
serial型で自動作成されるsequenceも指定できないし。(テーブルが別テーブルスペースでもsequenceはデフォルト域になってしまう。)
最新の8.3でもだめそう。
だれかこの件について情報持ってないですか?
ちなみに、pg_classのテーブルスペース情報をupdateして、物理ファイルをmvしたら、なんとなく動いてるいるようには見える。が、さすがに本番では怖いのでやってない。
0110NAME IS NULL
2008/01/10(木) 02:13:10ID:???サンクス
0111NAME IS NULL
2008/01/10(木) 02:13:20ID:???そもそもSEQUENCEを別のテーブルスペースに作成する意味はあるの?
メリットが分からん。
あと、pg_classをUPDATEしなくても、移動した物理ファイルに対して、
ln でリンクを作ってやればいいんじゃない?
0112NAME IS NULL
2008/01/10(木) 07:28:05ID:???設定パラメータ default_tablespace を変更してもダメ?
>> 111
> SEQUENCEを別のテーブルスペースに作成する意味はあるの?
誰しもそう思っているから、むしろ忘れられていたのかも。
機能としてはあってもかまわない気はする。
0113NAME IS NULL
2008/01/10(木) 21:50:07ID:???まずはじめの0〜50は正常に表示されるのですが次の50を表示するを選択すると
50〜100までの表示ではなく50〜ラストまでの表示になってしますのです。
SQL文は次のようになっています"select * from -- where number > "+number+" and number <= "+number+50;
何か間違っていることがあれば指摘してください。お願いします。numberの変数はデバッグで意図した値な事を
確認しています。なおnumberはserialです。
0114NAME IS NULL
2008/01/10(木) 21:53:18ID:???知らんがな。実際に発行されているSQL文を0〜50と50〜100の時で
どうなってるか確認して、psqlで実行してみなよ。
0115NAME IS NULL
2008/01/10(木) 22:22:12ID:???0116NAME IS NULL
2008/01/10(木) 23:01:47ID:???全然関係ないけど、実験の時でも普段から PreparedStatement 使うようにしとくといいぜ。
0117NAME IS NULL
2008/01/11(金) 00:05:06ID:???String + int + int って、((String + int) + int) って解釈されね?
n = 0 なら "number <= 050" で上限は 50 と解釈されるけど、
n = 50 だと "number <= 5050" になる気がするんだが。
「number <= " + (number+50)」と括弧を付ければ良いのでは。
0118NAME IS NULL
2008/01/11(金) 00:14:40ID:???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 NULL
2008/01/11(金) 00:51:40ID:???>>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 上に作成されてます。
0120113
2008/01/11(金) 09:06:04ID:???0121113
2008/01/11(金) 09:08:10ID:???0122NAME IS NULL
2008/01/11(金) 09:11:29ID:???だからさぁ、PostgreSQL的にはそんなことどーでも良いんだよ。
サーバ側で処理したSQLをチェックしろ。
意図した通りのSQLになっていて、取得結果がおかしいなら
ここで質問するのはありだが、プログラムの間違い探しなら
よそでやれ。
0123113
2008/01/11(金) 09:29:57ID:???0124NAME IS NULL
2008/01/11(金) 11:14:28ID:???しかしどれ使うにしても、ORDER BY つけないとな。
そして、実行するSQL文を吐き出してpsql等で確認するのは常に必須。
0125NAME IS NULL
2008/01/11(金) 15:38:10ID:???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文かけてみたんですが、分割前と検索速度が変わっていません・・・。
もしかして分割してからデータを挿入しなければならないのでしょうか?
0126113
2008/01/11(金) 20:54:51ID:???更新すると列が最後尾にくるので"どうしたもんか?"と思っていたところでした。
情報ありがとうございます。
0127NAME IS NULL
2008/01/11(金) 21:42:42ID:???> つまり、SEQUENCEのNextValを取得する際のI/O分散です。
それはさすがに意味ないと思う。千〜万単位で SEQUENCE 作るつもりでない限りは。
たいていはキャッシュに乗ってる。
バックアップなり信頼性目的ならば、ありうる状況かも。
0128NAME IS NULL
2008/01/11(金) 23:34:41ID:???今回の疑問は、そもそも、sequenceのテーブルスペース変更はできないのは何故なのか?
という好奇心的なものが発端でして、実質的に問題が発生しているわけではありませんけどね。
対応してないなら仕方ないですね。少し残念です。
0129NAME IS NULL
2008/01/12(土) 01:08:46ID:???それは、どう変わることが期待されてんの?
0130NAME IS NULL
2008/01/12(土) 11:39:49ID:???timeを検索条件にした?
0131NAME IS NULL
2008/01/12(土) 12:31:21ID:bIgQT3XdAというテーブルが親なら、 A1 A2 A3 A4という子の
テーブルを継承で作成する。そんで、A1 A2といった子に
insert する。そうすると親のAに対してselect すると、子を見て
くれて、制約があれば関係ないのは除外するという仕組み。
0132NAME IS NULL
2008/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 NULL
2008/01/15(火) 01:04:38ID:???> (リネーム時に何かしらデータ量に応じた処理が行われますか?)
行われない。
たぶんシステムカタログの一部が更新されるだけ。
> アクセスのタイミングによっては、ユーザーには、空データが表示されてしまうのでしょうか?
一瞬だけど TABLE_A が存在しないタイミングがあるから、
そのときのアクセスはエラーになる。
0134NAME IS NULL
2008/01/15(火) 01:25:31ID:???他からTABLE_AとTABLE_Bを順次SELECTされた場合、
タイミングによっては片方のテーブルを2度読みしちゃう可能性があるけど。
0135133
2008/01/15(火) 02:02:36ID:???ALTER 文が BEGIN, COMMIT で囲まれてるの見のがしてた。
ロック待ちだね。
> 他からTABLE_AとTABLE_Bを順次SELECTされた場合、
> タイミングによっては片方のテーブルを2度読みしちゃう可能性があるけど。
1トランザクションで ALTER 文を全部実行してるから、2度読みはないはず。
0136134
2008/01/15(火) 02:45:10ID:???> 1トランザクションで ALTER 文を全部実行してるから、2度読みはないはず。
TABLE_Aを読み出して、TABLE_Bも読み出そうとしたら >>132が走ってロック待ち、
解除後TABLE_Bを読み込んだら、それはリネームされる前のTABLE_A。
0137NAME IS NULL
2008/01/15(火) 07:53:27ID:???最初に全部ロックを取ってしまうのはどうだろう。
BEGIN;
LOCK TABLE_A IN ACCESS EXCLUSIVE MODE;
LOCK TABLE_B IN ACCESS EXCLUSIVE MODE;
...
0138NAME IS NULL
2008/01/15(火) 08:06:32ID:???0139NAME IS NULL
2008/01/15(火) 12:57:46ID:L9najbhePHPから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 NULL
2008/01/15(火) 22:40:11ID:???ふつう、DDLにトランザクションは効かないか発行時点でcommitされてしまうと思うが。
と思って調べてみたら、SQLServerはDDLもrollbackできるんだな。
0141NAME IS NULL
2008/01/15(火) 22:43:09ID:???0142NAME IS NULL
2008/01/16(水) 00:22:19ID:???両テーブルのSELECTも、トランザクションで実行するもんだと思うが。
0143NAME IS NULL
2008/01/16(水) 00:55:16ID:???どっちでも完全に一緒。お好みで。
PostgreSQLの方言でよければ RETURNING もアリ。
INSERT INTO test_tbl(memo) VALUES('AAA') RETURNING id;
0144NAME IS NULL
2008/01/16(水) 01:13:31ID:13aLpW9J>>140-142
ご回答ありがとうございます!
大変参考になりました!
ただ、考えてみれば、
テーブルデータ更新中のアクセスに対応するための方法だったので、
更新失敗によるデータ破損や、自前の例外処理を心配するぐらいなら、
最初から1テーブルで、データ更新 (COPYで行う) 自体をトランザクションで行う方が安全だと気づきました…。
で、シーケンスを更新する、と。
ただ、空データ表示時間があったとして、その機会損失損害額を考えると
どういう方法がベストなのか今でも分かりませんが…。
ああ、SEへの道は遠いなぁ…。
皆さん、どうもありがとうございました!
0145NAME IS NULL
2008/01/17(木) 04:44:40ID:EaOIQdVohttp://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 NULL
2008/01/17(木) 10:49:44ID:???もしVACUUMが無くなるならば、ようやく使えるDBになるな
速度の問題だけじゃなくて、VACUUMの手間を避けたいがゆえにMySQLに行った人って多いでしょ
0147NAME IS NULL
2008/01/17(木) 10:53:35ID:???> IBMなどとデータベース市場で争うための基盤をSunは手に入れたことになる。
( ´д)ヒソ(´д`)ヒソ(д` )
0148NAME IS NULL
2008/01/17(木) 12:27:46ID:???てか普通に空いた時間でやってくれてると思うが、
そんなに面倒かな。
0149NAME IS NULL
2008/01/17(木) 16:25:33ID:???My SQL使いは Auto VACUUM の存在を知らない人が多いよ
というか、もはやPostgreSQLに目もくれないご様子で…
0150NAME IS NULL
2008/01/17(木) 18:08:10ID:???というわけで
SRA OSS、PostgreSQL 8.2をベースにしたHAクラスタソリューション
ttp://enterprise.watch.impress.co.jp/cda/software/2008/01/16/12025.html
なんて話題を振ってみる。
HAクラスタソフトにはLifeKeeperを使っているとのこと。
0151NAME IS NULL
2008/01/17(木) 18:41:57ID:???> ベースとなるPostgreSQLが8.2.5へバージョンアップ。
最近のセキュリティフィックス入ってないじゃん。
0152NAME IS NULL
2008/01/17(木) 21:56:40ID:???「設定不要になった」と言っても嘘にはならないだろう。
「VACUUMが無くなる」という発想そのものは、何も分かっていない証拠。
Oracle で UNDO セグメントを無くせないとのいっしょ。
0153NAME IS NULL
2008/01/17(木) 22:14:51ID:???0154jin
2008/01/18(金) 11:18:11ID:EMckNTsF64bit版の機器で16GBのメモリをつんだ機器でポスグレをインストール
したのですが、Shared Memoryを1GB以上にするとポスグレが起動できません。
16GBつんでるのでメモリを最大限まで使用したいです。どうしたらいいので
しょうか。教えてください。
0155NAME IS NULL
2008/01/18(金) 15:22:21ID:???バージョンいくつ?バイナリは32ビット版だよね?
0156154
2008/01/18(金) 16:10:40ID:???その時オワタおもた。
0157NAME IS NULL
2008/01/18(金) 16:12:26ID:???0158NAME IS NULL
2008/01/18(金) 23:01:42ID:???少なくとも配布されているのは 32bit 版だけだったような…。
必ずしも shared_buffers にメモリを全部割り当てる必要は無いから
(OSがキャッシュに使ってくれる) 1GB で我慢しれ。
0159NAME IS NULL
2008/01/20(日) 00:59:56ID:???> 最近利用が増えてきているPostgreSQLと比較しても、約2倍ほど
> 高速に動作します。
デマが流れてるぞ
0160NAME IS NULL
2008/01/20(日) 01:42:32ID:rsAddFWzだれだ さぁや って知ったかライター(インチキ)か。
posgreSQLにもMySQLにも迷惑だ。潰してやれ。
0161NAME IS NULL
2008/01/20(日) 13:27:12ID:???迷惑だと言えば、MySQLスレに出張して、
やたらとSunの買収について不安を煽っている人間がいたね。
大人げ無いから止めとくれ。>>152=>>158
0162NAME IS NULL
2008/01/20(日) 14:33:36ID:???0163NAME IS NULL
2008/01/20(日) 17:00:55ID:???0164NAME IS NULL
2008/01/20(日) 22:18:45ID:???0165NAME IS NULL
2008/01/20(日) 22:51:34ID:???0166jin
2008/01/21(月) 09:20:39ID:Q97Sm1d1のメモリを効率的に使用して処理速度をあげたいです。shared_buffers以外
にもどの部分のチューニングをすればいいのでしょうか。教えてください。
0167NAME IS NULL
2008/01/21(月) 11:27:09ID:???http://packages.debian.org/source/sid/postgresql-8.3
0168初心者
2008/01/21(月) 15:28:41ID:???PostgreSQL のユーザ定義関数を使って和暦変換関数を作成したいのですが
IBMのICU4Cを使ってC++で和暦変換関数を作成しました
C++で作った和暦変換関数を組み込もうとしてるのですが、
C関数でないせいかうまくいきません。
誰か詳しい方教えてください。
0169NAME IS NULL
2008/01/21(月) 16:48:37ID:???0170NAME IS NULL
2008/01/21(月) 16:49:42ID:???Vistaへのインストールはコツがいる。
ググってわからなかったらまたおいで。
0171NAME IS NULL
2008/01/21(月) 18:42:22ID:???まず、どのように「うまくいかない」のか書くべし。
postgres のヘッダで、typename や delete なんかの C++ のキーワードを
仮引数名として使っている箇所があったような気がする。
postgres と繋ぐ箇所だけを別のCソースで書くか、
include 前に #define typename typename_ で誤魔化すか。
0172初心者
2008/01/21(月) 20:49:30ID:???(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 NULL
2008/01/21(月) 20:57:30ID:???extern "C"とかで解決する問題?
0174NAME IS NULL
2008/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 NULL
2008/01/21(月) 22:44:12ID:17f4QTHj100年以上運用しても余裕があるっていう資料出したのに仕様に入れてきやがった…
cronで定期的にcount取って制限に達したら古いデータを削除しようと思うんだが、
これぐらいしか方法無いよねぇ?
0176NAME IS NULL
2008/01/21(月) 22:46:04ID:???トリガ使って都度チェックとか
0177NAME IS NULL
2008/01/21(月) 22:47:59ID:???insertのたびにcountって重くね?
0178NAME IS NULL
2008/01/21(月) 22:51:51ID:???どれくらいの行数を想定しているとか分からないから、知らんがな。
そんなこと言われても、方法を提示しただけです。
0179NAME IS NULL
2008/01/22(火) 00:54:34ID:???行数より実際のディスク容量を監視した方がよくないか?
デッドタプルみたいに、行数には現れないが容量喰うものはあるわけで。
0180NAME IS NULL
2008/01/22(火) 10:10:05ID:tyWoTrKGPostgreSQLの公式ページで正式にRC2が発表された模様
0181NAME IS NULL
2008/01/22(火) 15:46:20ID:???0182NAME IS NULL
2008/01/22(火) 17:43:02ID:7/qXfoyh00000_2
11111_1
といったデータがあった場合、
group byを使って00000をまとめることはできないものでしょうか。
もしありましたらご教示いただけますと幸いです。
0183NAME IS NULL
2008/01/22(火) 18:27:56ID:???0184NAME IS NULL
2008/01/22(火) 22:42:35ID:???仕様で行数って書いてあるんだから気にしない
0185NAME IS NULL
2008/01/22(火) 23:05:16ID:???char *t に対して VARSIZE(t) しているのが間違い。
DirectFunctionCall1(textin) でもしておけ。
0186NAME IS NULL
2008/01/23(水) 14:04:34ID:???ちょっとトリッキーな方法かもしれんけど…
・serial型の列を作成して、それを主キーにする。
・自動的に作成されるシーケンスにMAX値とCYCLEを指定する。(MAX値は最大行数)
・主キーが重複したら削除するBEFORE INSERTのトリガーを作成する。
・取り出すときはINSERT時間でも入れといて、ソートする。
0187初心者
2008/01/23(水) 23:52:29ID:???何度もすみません。
どんな感じでDirectFunctionCall1(textin)を使えばいいのですか?
DirectFunctionCall1(textin,CStringGetDatum(t));
みたいな使い方でいいんですか?
教えてください。
0188NAME IS NULL
2008/01/24(木) 08:04:47ID:???「DirectFunctionCall1(textin」でウェブを検索なり、Postgresのソースコードをgrepなりしてみなさい。
もし前例があれば、正しい使い方だと判断すればいい。
自分で考えるのを放棄して教えを請うのは「初心者」だからといって許されない。
0189NAME IS NULL
2008/01/24(木) 11:20:06ID:???DBやらプログラミングやらには激しく向いてない気がしてならない今日この頃
0190NAME IS NULL
2008/01/24(木) 14:02:21ID:???てかあるレベルで止まる。
0191NAME IS NULL
2008/01/24(木) 17:17:30ID:???pg_dump: query to get table columns failed: ERROR: kind mismatch between backends
といったエラーが発生するのですが、pg_dumpを使わずにとりあえず
バックアップできる方法があればご教示願います。
権限は一つのDBに対して与えられているだけで、postgres権限はありません。
0192NAME IS NULL
2008/01/24(木) 17:29:35ID:???pgpool使ってる?
0193NAME IS NULL
2008/01/24(木) 17:52:08ID:???はい、使ってます。
色々調べてみましたところ、oid等が2台のサーバでずれている
可能性があるみたいですが、ユーザ権限では今のところどうし
ようもないという結論に至ってます。
せめて定期的にバックアップだけはとっておきたいと書き
込ませていただきました。
0194NAME IS NULL
2008/01/25(金) 07:15:51ID:???0195NAME IS NULL
2008/01/25(金) 15:47:09ID:???アドバイス感謝です。
pgpool経由ではないようにpg_dumpすると言うことは、
各種DBサーバへ入って直接pg_dumpを行うという認識
で宜しいでしょうか。
/usr/bin/pg_dump -h 127.0.0.1 DB > backup.db
DBサーバへログインし、上記で試してみましたが、
やはりどちらからやっても同じエラーが出てしまい
ました。
大変恐れ入りますが、ご教示いただけますと幸いです。
0196NAME IS NULL
2008/01/25(金) 16:07:47ID:???0197NAME IS NULL
2008/01/25(金) 16:11:05ID:???同じエラーって、それpgpoolに繋がってるんじゃ?
そのエラーメッセージはpgpoolが出してるんだけど。
違うポート番号で立ち上げてるんじゃないの?
0198NAME IS NULL
2008/01/25(金) 19:58:28ID:???PostgreSQL指定ポートというものがわからなかったため、
とりあえず5433で以下実行しましたらいきましたので
取り急ぎご連絡させていただきます。
/usr/bin/pg_dump -h 接続IP DB -p 5433 > backup.db
本当に有難うございます。
また何かありましたら報告させていただきます。
0199NAME IS NULL
2008/01/25(金) 23:03:32ID:???一歩ずつね。
0200NAME IS NULL
2008/01/27(日) 00:48:13ID:???ポートで動いているんですか?
>>198は5433でPostgreSQLへ繋いでるみたいだけど。
0201NAME IS NULL
2008/01/27(日) 00:53:29ID:???そりゃあ、クライアント側の設定はそのままでいけるように、pgpoolは5432でしょう。
0202NAME IS NULL
2008/01/27(日) 10:17:02ID:???おらくるでは1522とかw
0203NAME IS NULL
2008/01/28(月) 11:26:23ID:SakCgkQ00204NAME IS NULL
2008/01/28(月) 14:16:08ID:qNEN3OcM私はpgpoolじゃなくslony1使ってるんですが、
8.1でpg_dumpしたデータを8.2にリストアするとプロセスが落ちてしまいます。
落ちるのは毎回決まった場所で、
リストア中に「SET」という表示が出るあたりで処理が固まってしまいます。
何か心あたりある方いないでしょうか。
0205NAME IS NULL
2008/01/28(月) 15:13:14ID:???0206204
2008/01/28(月) 15:19:51ID:qNEN3OcM私ですか?
使ってます。
ちなみにpg_dumpのとき文字コードは何も指定してません
-Eつけずに実行しました
0207NAME IS NULL
2008/01/28(月) 16:07:48ID:???8.2は文字コード厳しいんだよねえ、8.1と比べると。
0208NAME IS NULL
2008/02/03(日) 01:46:04ID:JW+WwUKEという条件で table1 のレコードを絞り込んでいます。
このとき、この条件で絞り込んだレコードに flag=0 カラムを追加して
SELECT *, 0 AS flag FROM table1 WHERE XXX...
とし、それ以外のレコードに flag=1 カラムを追加して
SELECT *, 1 AS flag FROM table1 WHERE XXXじゃない条件...
とし、それを UNION するにはどうしたらよいでしょうか?
0209NAME IS NULL
2008/02/03(日) 08:57:15ID:???UNIONだろw
UNIONじゃなくてもCASEで1,2を分けてもいいかな。
0210NAME IS NULL
2008/02/03(日) 11:39:03ID:???0211NAME IS NULL
2008/02/04(月) 09:32:31ID:htIE4kq70212NAME IS NULL
2008/02/04(月) 11:05:26ID:kJ2XdWCkとりあえずやってみます
ただ、気になるのが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 NULL
2008/02/04(月) 15:44:34ID:???2008/02/01にダウンロードできるようになってるけど、
トップ更新もまだだしリリースノートもまだだねぇー。
最終チェック中?
0214NAME IS NULL
2008/02/04(月) 20:40:02ID:q5dGF2Ty0215NAME IS NULL
2008/02/04(月) 23:18:37ID:???0216NAME IS NULL
2008/02/05(火) 11:43:01ID:???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 NULL
2008/02/05(火) 17:31:00ID:???単品の最新版をインストールすべき。それでもやっぱりある程度の
大きさのSQL流し込むとやっぱりダメなことが多いけど。
ってことで、大きなSQLを叩き込む場合は、素直にコマンドラインの
psqlを使ったほうがいい。
0218NAME IS NULL
2008/02/05(火) 20:14:12ID:???0219NAME IS NULL
2008/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 NULL
2008/02/05(火) 20:55:50ID:???truncate main1;
truncate main2;
truncate relation;
でいいよ。重複部分もちゃんと削除される。
0221NAME IS NULL
2008/02/05(火) 21:03:53ID:gyamhWYhただでさえ人少ないのにさらに減らすようなことやめようよ。
0222NAME IS NULL
2008/02/05(火) 21:32:15ID:???DELETE FROM relation WHERE id NOT IN (SELECT min(id) FROM relation GROUP BY main1_id, main2_id);
もっと効率の良い方法があるかもしれない。
0223NAME IS NULL
2008/02/05(火) 23:51:47ID:???重複部分「も」ちゃんと削除される
というのは正しいでしょ。やっぱりダメか(笑)
>>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 NULL
2008/02/05(火) 23:52:26ID:???あ。最後に return 0; とか書いておいてね。
0225NAME IS NULL
2008/02/06(水) 07:54:42ID:???>>222 がどういう実行プランに落ちるか、イメージできているのか?
relation へ SeqScan 1回で済むような方式でなければ、222を超えられない。
0226NAME IS NULL
2008/02/06(水) 09:03:43ID:???indexがあるかどうかもわからないのに、どちらとも言えないでしょ。
0227NAME IS NULL
2008/02/06(水) 10:19:10ID:???何度もok選択するとデータがダブって入る。
0228NAME IS NULL
2008/02/07(木) 00:43:43ID:cSQE2+ALはじめてPostgreSQLを phpPgAdmin でさわっているんですが、
Accessでいうリレーションの設定は、外部キーの追加 にあたるのでしょうか?
また、リレーション図の作成といった機能、または外部ツールなど
ありましたら教えてください。
よろしくお願いします。
0229NAME IS NULL
2008/02/07(木) 00:56:30ID:???リレーション図作るならACCESSからODBCでテーブルリンクしてやっちゃった方が手っ取り早いと思う
0230228
2008/02/07(木) 01:04:32ID:???なるほど、そういう手がありましたか >ACCESSからODBCでテーブルリンク
リレーションについてですが、すみません、おそらく
自分が言いたかったのは、参照整合性のことだと思います。
それはやはり外部キーのことでしょうか?
0231NAME IS NULL
2008/02/07(木) 07:36:05ID:???YES. 参照整合性 = 外部キー制約
http://www.techscore.com/tech/sql/03_04.html
>>229
リレーションって単にテーブルの意味で使うような。
0232NAME IS NULL
2008/02/07(木) 12:10:58ID:Zq40oyH10234NAME IS NULL
2008/02/08(金) 15:50:41ID:HqMhws4Wcostとactual timeを比較しながらSQLチューニング
を行っています。
そこで質問なのですが、「costが激減したがactual timeが早くならないという」
現象は普通起きるのでしょうか?
もし起きたとすれば、それはDBサーバの処理能力が低いことが
原因と考えても宜しいでしょうか?
宜しくお願いします。
0235NAME IS NULL
2008/02/08(金) 20:28:16ID:???こうしてそうしてああすればこうなるっていうのを数字にしたようなものなので
それを改善すれば必ず速くなるというものではない。
CostっていうのはSQL文の中のボトルネックを探すのに使うとよいと思う。
0236NAME IS NULL
2008/02/09(土) 15:38:14ID:Mdw0byD58.2.3です。
Debian上で動作しているPostgreSQLサーバの管理をすることになりました。
このDBは社内システム用に使っています。
これまでほとんど管理されてなかったサーバなので、まず色々調査しなければなりません。
しかし前任者が先日、事故で死亡してしまい、情報がありません。
ログインアカウントは現在、メモなどを探しているところなので、まだサーバに入れていません。
私はこれまで、単なるPGをしていたのでDBの管理なんて何をしたら良いのか分かりません。
まずは何をしたら良いのでしょうか?
HDDの容量見たり、topで確認したりはするつもりです。
バックアップがどうなっているかも調べるつもりです。
それと、バキュームしないとまずいよね、と聞いたので、まずはそれをするつもりですが、
他にすることはありますか?
0237NAME IS NULL
2008/02/09(土) 15:50:23ID:???旧マシンの/etc/passwd の周り書き換えるなり移植するなり。
つーか全部ここで言うことじゃねえや。
0238236
2008/02/09(土) 16:03:22ID:???アドバイスありがとうございます。
アカウントが見つからなければその方法で試してみます。
なるべく止めたくないので、もう少し頑張ります。
0239NAME IS NULL
2008/02/09(土) 18:49:46ID:???アカウントやパスワードは、
使用しているアプリケーションのソースを見たら検討つくのでは?
ログインのソースとか。
あと日次や月次などバッチ処理などが深夜などに、
別途、稼動しているかどうかも確認したほうがいいでしょう。
バキュームやバックアップもバッチで自動で行っているかもしれないでしょうし。
0241NAME IS NULL
2008/02/10(日) 09:35:21ID:???rootになって全ユーザのcrontabチェックしてバックアップとバキュームしてないか確認。
ついでに、バッチでDBアクセスがないか確認。(時間も控えとく)
DBの設定みてオートバキュームしてないか確認。
リモートから接続許可してる場合、許可してるマシンからもバックアップ、バキュームしてないか確認。
資料探しまくって手動cronがないか確認。(○曜日に出社したらなにかするとか)
クライアントの利用時間帯やらをヒアリング。
わかったことは全部ドキュメントに残す。
0242236
2008/02/10(日) 14:04:58ID:???あ、たしかにアプリケーションのソースを見れば分りますね。
会社に行ったら確かめてみます。
>>241
手動cronは私の発想からは出てきませんでした。
ありがとうございます!
0243NAME IS NULL
2008/02/11(月) 20:33:23ID:???GETで持ってきた引数をデコードした文字列を問い合わせ文のWHEREの条件に入れるとうまくいかないんですがどうしてでしょうか?
アドバイスよろしくお願いします
0244NAME IS NULL
2008/02/11(月) 20:47:25ID:???0245NAME IS NULL
2008/02/11(月) 22:26:20ID:???SQL文を検証しましょう
二行ですむな
0246NAME IS NULL
2008/02/12(火) 05:35:17ID:???シングルクオートの処理が間違ってるんじゃないか?
0247NAME IS NULL
2008/02/12(火) 15:24:22ID:???CentoOSな俺は ttp://yum.pgsqlrpms.org/howtoyum.php で入れてる
0248NAME IS NULL
2008/02/14(木) 01:27:38ID:???最近も64ビットでビルドするからなおさら
0249204
2008/02/15(金) 00:03:26ID:???バージョンアップうまくいきました。
原因はSlony-�Tでした。
207さんの言ってたことに近かったんでしょうか。
Slony1をアンインストールして、
その後pg_dumpallでバックアップ取る
8.2をインストールしてリストアしてから
再度Slony1をインストールとやって動かせました。
バージョンアップと冗長化一緒にやるのって
えらいめんどくさいものなんですね。。。
0250NAME IS NULL
2008/02/15(金) 10:24:41ID:???0251NAME IS NULL
2008/02/15(金) 14:05:07ID:???0252NAME IS NULL
2008/02/15(金) 20:38:59ID:???=# SELECT true::integer, false::integer;
int4 | int4
------+------
1 | 0
0253NAME IS NULL
2008/02/18(月) 10:36:27ID:lPcRZOP6PostgreSQLは8.2.6、PHP5.2.4から操作しています
なるべくDB側の機能を使って対処したいです
0254NAME IS NULL
2008/02/18(月) 12:34:23ID:???pg_numrowsでは駄目?
0255NAME IS NULL
2008/02/18(月) 12:53:54ID:???それだとoffset limitで指定した区間のレコード数しか出ないので
全件中○〜○という風に表示するために総レコード数を数えたいのです
あとPDOでやってます
0256NAME IS NULL
2008/02/18(月) 22:28:09ID:???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 NULL
2008/02/18(月) 22:55:50ID:???よくわからないけど、こんな感じとか?
select
code as コード,
hinmei as 品名,
(
select
count(code)
from syohin
) as 総数
from syohin
where
code=1
0258NAME IS NULL
2008/02/18(月) 23:08:14ID:???select
code as コード,
hinmei as 品名,
(select count(code) from syohin) as 総数
from syohin
order by cocd
offset 0
limit 10
0259NAME IS NULL
2008/02/18(月) 23:10:13ID:???誤字訂正
×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 NULL
2008/02/19(火) 11:54:27ID:???それでいいのですが、whereでの条件が多くなると遅くならないのですか?
検索結果をキャッシュとかしてるのだったら問題ないのですが
0261NAME IS NULL
2008/02/19(火) 13:04:45ID:???心配だったら検索結果をtemporary tableにでもキャッシュしてみたら?
0262NAME IS NULL
2008/02/20(水) 04:24:26ID:???詳しくないので、遅いかどうかはわかりませんが、
1つのテーブルで100万レコードからの抽出だと、
1秒ちょっとで、抽出できます。
0263253
2008/02/20(水) 14:03:53ID:???temporary tableとの比較もそのうちやってみたいと思います
ありがとうございました
0264NAME IS NULL
2008/02/21(木) 06:15:23ID:???javaプログラムからvacuum実行して結果を管理画面とかで確認したいのですが。
postgres.confでinfoログも出力するように設定してログファイルを
見に行かないと駄目?
0265NAME IS NULL
2008/02/21(木) 10:31:42ID:???TRUE→1
FALSE→0
MySQLではBOOL+BOOLでINT型に自動変換されますが、PgSQLでは変換されません
0266NAME IS NULL
2008/02/21(木) 11:43:35ID:???>>250-252じゃいかんのか?
0267NAME IS NULL
2008/02/21(木) 11:44:18ID:???0268265
2008/02/21(木) 11:49:28ID:???ありがとうです
0269NAME IS NULL
2008/02/21(木) 22:49:06ID:???キモすぎる…
0270NAME IS NULL
2008/02/22(金) 00:43:47ID:???0271NAME IS NULL
2008/02/25(月) 09:33:31ID:???`tbl1` || `tbl2` || 'tbl2' … `tbl10` LIKE '%検索ワード%' とかだと、検索結果まで数秒〜数十秒まで時間がかかってしまうことがあります。
0272NAME IS NULL
2008/02/25(月) 15:49:29ID:???Oracle+Times10にするとか、そこだけ全部メモリに持つかしないと。
つかうちだと500万件のテーブルをselect count(1)するだけで70〜90秒くらい
かかるんだけど、1000万件でそれなら優秀なんじゃない?
ちなみにshared_buffer増やしても、検索したoidに対応するレコードがキャッシュに
あったら引っ張ってくるだけで、select countには意味ないんだよね?
0273NAME IS NULL
2008/02/25(月) 16:40:51ID:???tsearch2というのがあるらしい。
0274NAME IS NULL
2008/02/25(月) 22:18:39ID:???0275NAME IS NULL
2008/02/26(火) 04:10:08ID:???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 NULL
2008/02/26(火) 07:37:02ID:???表現の曖昧さを避けるだけなら、冗長化した形で CHECK(一方のチームID < 他方のチームID) とか。
チームIDで検索したいだけなら GIN 使う手もあるし。
0277NAME IS NULL
2008/02/26(火) 08:35:01ID:???チームIDはチーム情報のマスターに格納してあるんでしょ?
0278NAME IS NULL
2008/02/26(火) 14:54:48ID:???まさに、その何かの試合に関するテーブルを作ろうと思ってまして、
その際必ず試合1に対してチームが2になります。
カードを外に出したいのは、集計のためだったりします。
あるチームを基点に試合を検索する場合、一方か他方かがそのチームで、
検索されたデータからもあるチーム以外のチームを見つけなきゃいけない、
というのが面倒な気がしました。
一方外に出しておけば、おそらくクエリだけでなんとかなります。
検査制約とか配列を使うのはアリかもしれません。
ありがとうございます。
>>277
明示しませんでしたが、チームIDはチームテーブルのPKです。
0279NAME IS NULL
2008/02/26(火) 14:57:34ID:???サッカーなんて単語が出てたから、PKってそっちの方かと思ってたよ。
いや、なにやらごちゃごちゃ書いてあったから詳しくは読んでないんだけどね。
0280NAME IS NULL
2008/02/26(火) 15:32:19ID:???テーブル設計は、標準的でシンプルなほうがいいかもね。
メンテなどしやすい方が便利な事が多い。
0281NAME IS NULL
2008/02/26(火) 21:47:49ID:???>>273
tsearch2よりはludiaの方がいいんじゃないか。
tsearch2は形態素解析。ludiaはN-gram。
形態素解析だとLIKE %% と違った結果になるぞ。
0282NAME IS NULL
2008/02/26(火) 23:00:26ID:???割り切れるならば形態素解析も使いどころはある。適材適所で。
0283NAME IS NULL
2008/02/26(火) 23:54:36ID:???自分は初めて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 NULL
2008/02/27(水) 00:33:16ID:???>CREATE ROLE name WITH PASSWORD 'pass' LOGIN;
これはpsql等で実行するもの。
>createuser -P name
こっちはシェル(bash等)で実行するもの。
でこっちは実行出来たっぽいね。userつってもあくまでdb用userで
psql -U name -d dbname
と言う具合につかう。
ちょっと初歩的すぎるので、何か本でも買って読んだ方がよさげ。
0285NAME IS NULL
2008/02/27(水) 01:51:48ID:???丁寧な解説&ご指摘ありがとうございます。
どこで使うかをわかっていないせいで、知識がごちゃ混ぜになってたんですねorz
一からきちんと勉強しなおします。ありがとうございました。
0286NAME IS NULL
2008/02/27(水) 15:48:47ID:???ふとログを見たら、plugin_debugger.dllというのが頻繁にロードされていました。
postgresql.confを見たら、
shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll'
がデフォルトで有効になっていたんですが、このplugin_debugger.dllとは何者なんでしょうか?
0287NAME IS NULL
2008/02/27(水) 17:03:48ID:???0288NAME IS NULL
2008/02/28(木) 00:26:16ID:???使わないなら単なるリソースの無駄なので外すべし。
0289NAME IS NULL
2008/02/28(木) 00:41:09ID:???0290NAME IS NULL
2008/02/28(木) 13:47:48ID:???数十秒、長いときだと数分かかるんですが、原因がまったく検討つきません。
アクセスは一秒数回ありますが、autovacuumの実行なども発生には関係ないようで
一度killしてから同じSQLを走らせると1秒程度で終わります。
また、ストアド実行中に同じストアドを別の引数で呼び出しても、全く問題なく実行できます。
ストアド自体にはみたところ問題はありません。
原因や解決策などに心当たりがございましたら、ご教示ください。
0291NAME IS NULL
2008/02/28(木) 14:45:33ID:???アドバイスを受けるのでしたら、
少なくとも、バージョンや環境は提示した方がいいでしょう。
0292290
2008/02/28(木) 14:49:09ID:NWie+e5yFreeBSD6.3、amd64
PostgreSQL8.3
pgpool-II version 2.0.1
です。
また、稼動を続けるとCPU使用率が増加していき、postgresを再起動すれば治ります。
0293NAME IS NULL
2008/02/28(木) 15:09:55ID:???原因が見つかるといいですね。
8.2.x など旧バージョンと比較して試してみるのはどうでしょうか。
0294NAME IS NULL
2008/02/28(木) 18:03:40ID:???0295NAME IS NULL
2008/02/29(金) 00:52:01ID:???問題を切り分けるのに、PostgreSQLだけで同じ事象が
発生するか試したら?
0296NAME IS NULL
2008/02/29(金) 13:45:44ID:???0297NAME IS NULL
2008/02/29(金) 21:16:15ID:sA1ohjpHPHPとかから呼んでるなら、永続的な接続を使ってると色々
リソースを食い続けるので、非永続で。CPU使用率はpostgreSQL
が使ってるのかな? 8.3に興味あるけど、まだ怖いね。
pgpool-II Ver 2は、こういった分野のソフトにしてはバグが多い印象。
ver 1 を使ったほうがいいかもww
0298290
2008/03/01(土) 21:56:32ID:???問題きりわけのためにplpgsql内のWHERE条件を分割して実行したところ
再発しなくなりました。
元のSQLが間違ってたようには思えないのですが…
pgpoolをはずして、4BSD、ULEどちらのスケジューラーでも試しましたが
問題はpostgresql単体の問題のようです。
0299NAME IS NULL
2008/03/01(土) 22:12:52ID:???0301NAME IS NULL
2008/03/02(日) 12:58:39ID:4NEnxdcC参考のために、オリジナルと分割後のSQLを教えて。
もしPostgreSQLのバグなら、誰かが対処してくれるかもしれないし。
0302920
2008/03/02(日) 22:09:11ID:???PERFORM 1 FROM target_table
になっている場合があることに気がつきました。
これの応答に時間がかかっていたようです。
お騒がせしまして申し訳ありません。
SQL間違いとはお恥ずかしい…
0303290
2008/03/02(日) 22:11:26ID:???0304NAME IS NULL
2008/03/02(日) 22:22:55ID:???> 重要なお知らせ:
> 2月24日にwww.postgresql.jpサーバが部外者によりクラックされていた事が判明致しました。このため、サイトは安全な別サーバに移動し、トップページのみ表示されるようになっています。
> 現在、復旧作業中です。今のところルート権限を取得された形跡は発見されていません。 詳しい情報は後日公開致します。
> ご迷惑とご心配をお掛けする事をお詫びいたします。
0305NAME IS NULL
2008/03/03(月) 14:31:40ID:???postgresql.jp って、SRAが事務局でサーバも提供してたのは、もう昔の話?
0306NAME IS NULL
2008/03/04(火) 16:38:38ID:???怖すぎてアップグレードできん。
0307NAME IS NULL
2008/03/04(火) 16:49:33ID:???ルートフォースアタックを受けていると連絡が入る
10:20 pscan2が走行しているのを確認し停止させる
図らずもsshdのパスワード認証が有効になっていたため、ブ
ルートフォースアタックで作業用アカウントのパスワードが解
析され侵入を許していた。
sshdのパスワード認証を禁止し、RSA認証のみとした。
17:00 改ざん等がないか確認開始
28日 14:00 改ざんと個人情報の流出が無いことを確認した。
3月 1日 告知用サーバ運用開始
0308NAME IS NULL
2008/03/04(火) 22:44:35ID:???そんな怖くないだろ
0309NAME IS NULL
2008/03/04(火) 23:52:04ID:???俺はchangelogを読まずに酷い目に遭ったぜ・・・orz
0310NAME IS NULL
2008/03/05(水) 12:00:43ID:???どの言語出身かで分かれるだろうなw
0311NAME IS NULL
2008/03/05(水) 19:44:44ID:???date_column::text = (2008-03-01)::text = 2004::text
と解釈されるのはまずいとして、暗黙の型変換は削られたらしい。
ミスらないためには悪くは無いと思うけどね。
必要なら自分でキャスト追加すればいいだけだし。
0312NAME IS NULL
2008/03/05(水) 23:06:59ID:???pg_dumpall でデータベース全体をバックアップした後、
このデータを元に、部分的な復旧を行う事は可能ですか?
手元に pg_dumpall で取ったデータしかなくて、
それを別サーバに復元したいのですが、
全部ではなく一部分だけ復元したいです。
調べた所、丸々復元する方法は見つけたのですが、
部分的な復元方法を見つける事が出来なかったので
よろしくお願いします。
0313NAME IS NULL
2008/03/06(木) 02:54:14ID:???テーブル単位なのかレコード単位なのか、
カラムや部分文字列なのか。
0314NAME IS NULL
2008/03/06(木) 03:00:03ID:???バックアップ時のオプションにもよるだろうけど
バックアップされたファイルは基本的にテキストファイルだから
必要な部分だけに加工してrestoreするか
一時的にどこかに全てrestoreして、必要な部分だけ
個別にpg_dumpし直すか、だね。
0315NAME IS NULL
2008/03/06(木) 10:20:23ID:???バージョンは8.2.6で
0316NAME IS NULL
2008/03/06(木) 16:33:27ID:???0317NAME IS NULL
2008/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 NULL
2008/03/07(金) 00:41:47ID:???そういう時はテーブル丸々コピーして、新しい並びで空のテーブル作って
select insertで一括挿入っていうのをよくやるけど
0319NAME IS NULL
2008/03/07(金) 08:09:12ID:???0320NAME IS NULL
2008/03/07(金) 10:36:16ID:???>>319の言うことは正論。
0321NAME IS NULL
2008/03/07(金) 10:51:18ID:???純粋に、なぜ列の並び替えが必要になるのか知りたい。
0322NAME IS NULL
2008/03/07(金) 11:07:36ID:???俺も後からカラムを追加するときに、一番最後じゃ気持ち悪いときが結構ある。
0323NAME IS NULL
2008/03/07(金) 11:33:34ID:???気持ち悪いのは人だけでしょ。
プログラムを実行するコンピュータには何の関係もない。
0324NAME IS NULL
2008/03/07(金) 14:16:29ID:???つか*で取るからそういうことになる。
列指定汁www
0325NAME IS NULL
2008/03/07(金) 14:46:23ID:???0326NAME IS NULL
2008/03/07(金) 14:48:26ID:???なんて言っている人の作業効率なんてたかが知れている
0327NAME IS NULL
2008/03/07(金) 14:52:24ID:???vacuum -a -f -zは毎日夜中に一度やるとして・・・
・オンライン中にvacuumしていいのですか?
(極端に遅くなるとか、壊れる等はありますか?って意味が一番強い)
・いいのであれば、vacuumのオプションは何が最適かしら?
土日は更新メイン。平日は参照メインなシステムです。
バージョンは、8.2.6です。
よろしくお願いします。
0328NAME IS NULL
2008/03/07(金) 14:57:09ID:???確かに挿入順であって結構速い気がする。
この動作に依存して組む人たちもいるんじゃないだろうか。
0329NAME IS NULL
2008/03/07(金) 15:02:16ID:???それ行の話でしょ? いま問題になっているのは列の並び
0330NAME IS NULL
2008/03/07(金) 18:19:48ID:???それで良いと思うけど。
うちは随時更新、参照入るシステムだけど、
処理重い時間にvacuumやると結構やばい。
vacuum1回で足りないと感じるのは何故だろう?
メモリが十分にあるならチューニングしたらどう?
ttp://www.thinkit.co.jp/free/marugoto/2/1/11/
autovacuumはどうなのか知らん
0331NAME IS NULL
2008/03/07(金) 19:56:07ID:???データベースの列の並びがちがうだけで動かなくなる糞プログラムなんかに限ってソースが無かったりする。
俺は今またそれに引っかかったよ。 orz
0332NAME IS NULL
2008/03/07(金) 23:47:46ID:???0333NAME IS NULL
2008/03/08(土) 09:12:47ID:???vacuum -a -z だけで十分。
VACUUM FULL は必要ないよ。
オンライン中の VACUUM で DB が壊れることはないし、
極端に遅くなることもないけど、負荷が気になるなら
vacuum_cost_delay とか VACUUM のコストを弄ってやればいい。
0334NAME IS NULL
2008/03/09(日) 01:19:17ID:???create table fuga( bar integer not null check( bar < foo ) ) inherits( hoge );
こんな感じに継承元と先とでの数値の検査制約って出来ないんだっけ?
0335NAME IS NULL
2008/03/10(月) 23:45:35ID:???0336327
2008/03/11(火) 14:16:00ID:???ありがとう。
>vacuum1回で足りないと感じるのは何故だろう?
うーん、一個件数の多いテーブル(100万件ぐらい)があって、
そこが土日の更新の対象で且つ、結構他のテーブルとjoinしてるんですよ。
一応、explainで見て、indexの見直しと対象SQLのチューニングをして、
大分早くなったんだけど、1年で100万件程度増えるので、
いつかはまた遅くなるんだろうと感じてます。
なので、手軽?に早くする手法はないかと調べていた訳です。
オンラインのVACUUMで壊れないのであれば、
一度負荷と相談して試して見ます。
ありがとさんでした。
ところで、V8.x系のメモリチューニングで、1GB以上共有メモリを取っても、
メモリマネージメントの都合で逆に遅くなるってあるんだけど、
やっぱりそういう物なんですかね?
サーバー4GBにしたのに無駄?
0337NAME IS NULL
2008/03/12(水) 00:35:41ID:???パーティショニングすれば?
> サーバー4GBにしたのに無駄?
共有メモリ以外はOSキャッシュとして使われるから、
まったく無駄にならん。
0338NAME IS NULL
2008/03/12(水) 19:51:58ID:???レスありがとう。
パーティショニングを今度試してみるダス。
日々の売り上げデータに近い構造なので、
効果は大きそうな気がします。
大抵の集計自体も長くて3ヶ月ぐらいだし。
ありがとうございました。
0339NAME IS NULL
2008/03/13(木) 00:47:20ID:???0340NAME IS NULL
2008/03/13(木) 08:07:54ID:???というよりは、単に増やせば増やすほど速くなるわけではないってこと。
DB/OS 2層でキャッシュするよう設計されているから。
他のデータベースでも似たようなことはよくある。
0341NAME IS NULL
2008/03/13(木) 19:38:18ID:RTgKtkUI8.1のチューニングのページに書いてあった気がします。自分の8.1
での経験ですが、20Gとか指定すると、小さなテーブルのdrop table すら
1秒くらいかかった記憶が、、、。
>>338
おなじく8.1での話ですが、パーティショニングしたテーブルをjoinす
ると、selectがシーケンシャルになって激遅になるケースがありました。
同じ構造で同じSQLでも8.3はインデックスを使ってくれるんですけどね
0342NAME IS NULL
2008/03/13(木) 20:43:28ID:???drop table を高速化する目的でチューニングすべきかは疑問だが。
0343NAME IS NULL
2008/03/14(金) 00:29:37ID:???0344NAME IS NULL
2008/03/14(金) 01:03:30ID:???> 20Gとか指定すると、
実メモリはいくら積んでたの?
0345NAME IS NULL
2008/03/14(金) 01:19:18ID:???0346NAME IS NULL
2008/03/14(金) 09:25:11ID:???http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050402/158372/?P=2
ここ以外にも、具体的な数値を上げて書いてあったところが
あったと思うけど、おもいだせませんでした。
0347NAME IS NULL
2008/03/14(金) 23:16:26ID:gKUPvhD2ありました。0コンマ何秒の処理だったけど、共有メモリ1.5G設定時の
2倍くらいの所要時間だったイメージ。DB全体のサイズは6G程度です。
>>344
会社のサーバなので、たしか30G台でした。
0348NAME IS NULL
2008/03/15(土) 07:58:18ID:???共有メモリ20GBなんて大きな設定は、テストが足りてないのかも。
4GBを超えるとちょっと心配だな。
あまらせてもOSがキャッシュとして使うから、無駄にはならないし。
0349NAME IS NULL
2008/03/16(日) 01:45:48ID:???亀レスすいません。
>>316の方法で行く事にします。
どうもありがとうございます。
0350NAME IS NULL
2008/03/17(月) 21:50:44ID:???日付で管理できるテーブルなら、
例えば、
今月とそれ以前のテーブルに分割してみるとかは?
バッチでレコードの移行を行う必要が出たり、
プログラムの変更が必要になりますが。
その場合、veiwで対応ということが考えられますが、
例えば、レコードが少ないテーブルAとレコードが多いテーブルBの連結を記述しているveiwの場合、
テーブルAにINSERTなど変更が加わる際、
veiwのレコードが多いテーブルBの影響を受けて、多少遅くなるということはあるのでしょうか?
あったとしても、気になる程度じゃないのかな?
0351NAME IS NULL
2008/03/17(月) 21:53:17ID:???0352NAME IS NULL
2008/03/17(月) 22:03:59ID:???0353NAME IS NULL
2008/03/17(月) 22:18:35ID:???千万件ぐらいならclusterかければ直ぐに結果返ってくるよ
一億件は試した事ないから判らんw
0354NAME IS NULL
2008/03/17(月) 22:30:52ID:???ありがとうございます。
やったことはないので、試してみます。
現在、Group by など複数のSQLを一度に発行しているので、
それが完了するのに、20〜30秒くらいかかっています。
さらに早くなるとストレスなくなるなぁ。
0355NAME IS NULL
2008/03/17(月) 22:32:28ID:???insert や update には、全く影響はないのかな?
0356NAME IS NULL
2008/03/17(月) 22:34:53ID:???なんか、そんなことがあったような。。。
0357NAME IS NULL
2008/03/18(火) 18:30:33ID:cmzwaPqX3.1.2を入れようと思うのですがどこかでげとできますか?
bugfixした3.4.1をmakeることも考えたのですが、稼動中のサーバに
突っ込むので開発版は避けたいところです。
0358NAME IS NULL
2008/03/18(火) 19:18:39ID:1so+byeI0359NAME IS NULL
2008/03/19(水) 04:27:00ID:???適切なindexを介してアクセスする場合は対数オーダーだから、それが可能ならば
1テーブルで済ませる方が絶対有利。
どうしてもfull scanが必要となる処理ではテーブル分割も考えられるが、
union viewを使う場合、ちゃんとプランナがそれを認識してあらかじめ不要な
テーブルを実行計画から除外することが出来ないとかえって遅くなる。
0360NAME IS NULL
2008/03/19(水) 08:04:05ID:???削除のことも考えた方がいい。
テーブルを分割する最大のメリットは、古いデータの一括削除だから。
絶対に削除しないならば、確かに分割する利点は薄い。
0361NAME IS NULL
2008/03/21(金) 02:39:37ID:bZgunjjY0362NAME IS NULL
2008/03/21(金) 02:53:43ID:???未確認情報だけど、またクラックされたから復旧中らしいよ。
0363NAME IS NULL
2008/03/21(金) 05:06:01ID:???その話がMLに流れたって、スラドのアレたまで見たよ。
0364NAME IS NULL
2008/03/21(金) 16:07:05ID:???どうも。
1テーブルだと、どんどん増えて数百万レコード件以上になり、
1画面の表示に20〜40秒はかかってしまいます。
分割すると、数千レコードなので、1〜2秒以内で終わります。
将来は数千万レコードにもなり、もっとかかってしまいます。
ひとつのSQLで済むまない10以上のSQLの処理を行っている情報てんこ盛り画面なので。。。
0365NAME IS NULL
2008/03/21(金) 20:59:17ID:3PY9kdIC数千レコードで1〜2秒の処理って、、、どんなSQLなんでしょう?
処理範囲分のデータを一時テーブルに取り出して使えば、それで
速くなったりはしないですか?
0366NAME IS NULL
2008/03/22(土) 15:18:52ID:???正規化されていないってオチじゃないよね?
複雑なデータ取得でカーソルすら使ってないとかだったら
単純に技量不足だと思うよ
0367NAME IS NULL
2008/03/23(日) 01:51:18ID:???どうもありがとうございます。
>>365
合計で1〜2秒ですから、
ひとつのSQLで、0.1秒〜0.2秒以下ということですが、それでも遅いですかね?
ほとんど全部が、Group by 使用のSQLです。
一時テーブルへ抽出ですか。
普通のテーブルへInsertでしょうか?
その方法はメモリなど特殊な方法でしょうか?
一時テーブルへ抽出しても、複数同時アクセスが頻繁にあるので、
同じテーブル利用にならないよう個別利用になるよう考慮する必要があります。
同じテーブル利用で重複しても数万レコードですから、
Delete & Insert が早ければ、効果あるかもしれません。
しかし、頻繁に画面更新を行うので、Insertが多くなり、意味があるかどうか。
頻繁にバキュームしないといけなくなるのかな?
>>366
カーソルは使っていません。
カーソル利用とSQLでどのくらいの差があるのか知りませんが、
10倍以上と劇的に早くなるようでしたら、今後検討してみますが、
はっきり言って、管理と工数のことを考えると面倒ですね。
ただ、カーソル制御はわかりますが、
SQLをどう、カーソル使用で置き換えて利用するのか、勉強不足で、わかりません。
正規化とは、どの意味で、言われているかわかりませんが、
PostgreSQL固有で言われるものでしたら、正規化はしていません。
もちろん、冗長データはありません。
0368NAME IS NULL
2008/03/23(日) 03:00:03ID:???次に、ひとつのSQLを紹介します。(改行が多いので)
テーブル名やカラム名は、変えていますが、
生のSQLです。
まだ未熟なので、SQL自体を見直す点もあるとは思います。
テーブル詳細を紹介できないので、わかりづらいと思いますが、
table001が100万レコード以上で、
約、1.2秒〜2.0秒かかります。
数千レコードでしたら、
0.2秒前後です。
このようなSQLが1画面に10以上あると合計、20〜40秒以上になってしまうので、
よく使う該当レコードをテーブルを分割して数千レコードにすると、合計1〜2秒で収まります。
テーブル設計自体やインデックスの見直し、チューニング次第でまだ高速になるのは間違いないと思いますが、
将来的に、数百万、数千万レコード以上になる前提では、
テーブル分割で1〜2秒の現在と同様に早くなるとは思えないので、検討もしていない現状です。
0369NAME IS NULL
2008/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 NULL
2008/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 NULL
2008/03/23(日) 08:41:01ID:???これじゃ遅いだろうね。
code002のカーディナリティが低くてdata001に関数インデックスも
設定していないなら、そのクエリは table001 の seq scan が発生
するというのはわかるかな?
検討する気もないんだったらどうでもいいが。
0372NAME IS NULL
2008/03/23(日) 09:38:31ID:???「関数(列) = 定数」の書き方ではインデックスが使われない。
data001列をdate型に置き換えて date001 = '2008/03/21' か、
timestamp型なら '2008/03/21' <= date001 AND date001 < '2008/03/22' にするか。
一般的な方針としては、文字列型を減らす(意味にあう他の型を使う)のが良い。
0373NAME IS NULL
2008/03/23(日) 10:16:54ID:YDmnE8vH一時テーブルですが、
create template(?) table *** as select * from table001 where ***
とかで、必要な範囲のtable001のデータを持った一時テーブルをメモリ上に
つくれます。他の接続とは干渉しないので、複数処理とかは気にせず
でOK。delete も必要ないです。pgpoolとか使ってるなら、使用後に dropが必要。
んで、一時テーブルを使って処理すれば、とりあえず簡単に速く
なると思うけど
0374NAME IS NULL
2008/03/23(日) 11:35:59ID:???ありがとうございます。
文字列だと遅くなるのは、認識していますが、
「関数(列) = 定数」だと、インデックスが使用されませんか。
考えてみると、そうですよね。致命的欠陥ですね。
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 NULL
2008/03/23(日) 13:50:33ID:???>致命的欠陥ですね。
は、私の設計、SQLが欠陥という意味です。念のため。
0376NAME IS NULL
2008/03/24(月) 12:50:57ID:???大丈夫。その意味が分かる人間ならクエリを見た時点で分かっていると思うぞ。
まあ何だ。頑張れ。
0377NAME IS NULL
2008/03/26(水) 20:53:54ID:HwJR8fjT頭の中でごちゃごちゃやる分には、
結合の順番によって内部処理のコストが大分変わりそうですが、
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 NULL
2008/03/26(水) 21:07:32ID:???explain してみるといいのでは。
0379NAME IS NULL
2008/03/27(木) 10:42:10ID:???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は大きくしすぎても遅くなるとかの情報があったのですが、
なんか速くする設定とかありますか?
0380377
2008/03/27(木) 16:11:25ID:tPBRhLWvexplainの結果をどう見たらよいのか良く分からなかったのです(DB毎に違い過ぎますよね)。
検索していたらよさげな情報を見つけたので、explainしてみます。ありがとうございます。
SQLiteやMySQLのexplainよりも実用的なようですね。
>>379
primary key をはっていないのでは??
0381NAME IS NULL
2008/03/27(木) 22:12:57ID:???単にテーブルサイズが大きくて、ディスク読み込みが大量に発生しているからでは?
キャッシュに乗った後の速度で良ければ、synchronize_seqscans = off を試してみると良いかも。
他に、更新を繰り返したせいでテーブルが太っているならば、
いったんCLUSTERなりVACUUM FULLなりをかけてみるとか。
>>380
何の効果も無いぞ > primary key
0382NAME IS NULL
2008/03/27(木) 23:54:21ID:???>>381
synchronize_seqscans = offは試してみます。と思ったけど8.3からなのかな。
ディスク読込のせいなのはほぼまちがい無いんだけど、shared_buffers割り当てを
増やしてもほとんど解決しなかった。もしかしてpostgresのキャッシュって、
queryでoidを読み出して、そのoidに対応するデータがキャッシュされてれば
キャッシュを見るだけなんじゃないのかなあと思ったんだけど、それで合ってる?
そう考えるとメモリはOSのディスクキャッシュに回した方がいいんじゃないかなとも
思ったんだけど。
vacuum fullは一回途中までかけたんだけど、20分くらい返ってこないのでやめた。
365d24hサービス中なので厳しい。vacuum analyzeは毎日かけるようにしたけど。
0383NAME IS NULL
2008/03/28(金) 01:14:47ID:???まずは、テストできる予備機は必要ですね。
あとはサーバーの再起動とか。。。
365日24時間稼動で、それも不可能ならメンテ期間しか無理ということになりますね。
0384NAME IS NULL
2008/03/28(金) 08:18:06ID:???ぜんぜんちゃう。oidなど使わない。
テーブルBの「数十MBに11秒」でもものすごく遅いので、環境がおかしい気がする。
100MBで10秒ならば、1GBで100秒かかるのも仕方ないでしょ?
あと、VACUUM FULLはアホのように遅いので、やるならCLUSTER。
0385NAME IS NULL
2008/03/28(金) 17:00:26ID:???予備機はあるけどスペックが違うので大分遅いんです。
本番データは2GB強あるのでインポートするのも一苦労だし
>>384
そうなんだ。じゃあshared_buffersを全データが載るくらい増やせば
劇的に速くなると思うんだけど、postgresql8でも1GBくらいに性能ピークが
あるっていうのはなんでなの?
>100MBで10秒ならば、1GBで100秒かかるのも仕方ないでしょ?
select * じゃなくて select count(1)だから容量では単純比較できないと思う。
730万件が11秒ってなかなか優秀だと思ってたんだけどものすごく
遅いん?うーん。このスペックなら何秒くらいが妥当だと思う?
数十万件のテーブルから複雑な検索条件で検索かけるのとかは
軒並み1秒以内で終わるし、テスト環境(これもLinux)にくらべたら大分速いから、
環境のせいじゃないと思ってたんだけどなあ。
0386NAME IS NULL
2008/03/28(金) 21:02:35ID:???select count(*)にはできないのかな?
Postgreは知らんけどOracle8iではえらい差がでるよ。
count(1)ではDistinctのカウントになるので重複値の検出でえらい時間がかかる。
全件count(1)なんてやっちゃうと全件の中間テーブルを作ろうとしたりして。
0387NAME IS NULL
2008/03/28(金) 21:08:15ID:???手元の環境だと、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 NULL
2008/03/28(金) 21:09:22ID:???count(*)とcount(1)はまったく同じ動作です。
0389NAME IS NULL
2008/03/28(金) 22:28:14ID:???あれ?同じ動作だったんだっけ?
昔なにかでcount(*)よりcount(1)の方が良いって記事をどこかで見た気がするんだが・・・。
勘違いか?
0390NAME IS NULL
2008/03/28(金) 22:51:29ID:???ごめんそのpg_size_prettyを知らなくて、データのバイト数(1レコード36バイト)に
730万をかけて20〜30MBかなあと思ったんだけど、一桁間違えてた。
それやってみたら485Mだったよ。
360万件の方は3587MB
トータルのデータ領域が広すぎて遅くなってんのかな。
shared_buffersも1.5GBじゃ全然収まってないってことだね。
サービスインからしばらくVACUUMかけてなかったので、一回くらいは
VACUUM FULLかけたいんだけどね。
CLUSTERは調べたらテーブルロックしちゃうんだね。
夜中やってみるかな
0391NAME IS NULL
2008/03/28(金) 23:06:44ID:???ユニークインデックスを持った列名の方がいいという記述なら見つけた
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 NULL
2008/03/28(金) 23:45:45ID:???他のDBMSだと効果があるのかもしれないけど、PostgreSQLに関しては関係ないのですよ。
あんまり鵜呑みにしないほうが良いのですよ。
0393NAME IS NULL
2008/03/29(土) 20:05:32ID:???0394NAME IS NULL
2008/03/30(日) 09:29:37ID:7s6ei0XYマシンの物理メモリ量と、DB全体のサイズの問題なのでは?メモリを
8Gくらいにすれば、あんましHDDにアクセスせずに済んで早くなると
思います
0395NAME IS NULL
2008/03/30(日) 09:56:52ID:???オススメとしては、
・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 NULL
2008/03/30(日) 12:38:56ID:???・VACUUMをちゃんとする運用にかえる
・count()を多用しない設計にする
ほうが重要だと思うのだが・・・
0397NAME IS NULL
2008/03/30(日) 15:59:36ID:???んまぁ、>>396の言うとおり、時間がかかるからVACUUMはしないというのは
腐った運用としかいいようがないけどね。
0398NAME IS NULL
2008/03/31(月) 11:57:27ID:NLL0KbcvTableName(
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;
0399391
2008/03/31(月) 12:10:22ID:???VACUUM ANALYZEは毎日やってる。最初AUTOにしてたんだけど、
毎日10万レコードくらい追加/削除するのでデイリーでやるようにした。
count()するのは、一覧表示の時にまず全件カウントしてページング処理を
したいから避けられない。
HDDが遅いのはアレだと思ってたので、次のシステムではRAID0+1を提案した。
で、>>395の
・メモリを8Gくらいは積む。
・shared_buffersは1.5GのままでOK
っていうのは、残りの6GBはOSのディスクキャッシュにおまかせするってこと?
0400NAME IS NULL
2008/03/31(月) 12:29:58ID:???idとup_idの関係がイマイチ分からんのでkwsk
0401NAME IS NULL
2008/03/31(月) 12:43:44ID:???てきとーに、
select up_id, max(updatetime) where tablename
gourp by up_id
と書いてみるテスト
0402NAME IS NULL
2008/03/31(月) 12:44:24ID:???0403NAME IS NULL
2008/03/31(月) 12:44:57ID:???てきとーすぎるorz
0404398
2008/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 NULL
2008/03/31(月) 13:23:51ID:???up_id別の最新updatetimeを取得できるなら、
そのSQL(をVIEWにするなりして)と
元テーブルのJOINを取ればいいだろ。
0406401
2008/03/31(月) 13:37:12ID:???0407NAME IS NULL
2008/03/31(月) 13:59:28ID:???何に困ってるんだ?
select tablename.*
from tablename
join (
select up_id,max(updatetime) as updatetime from tablename group by up_id
) tmp using(up_id,updatetime);
0408398
2008/03/31(月) 14:03:41ID:???ありがとうございます。
ということは、自分のテーブルに自分のテーブルを
up_idとupdatetimeで結合する感じですよね。
なんか、こう珍しくなさそうな検索条件なので、
もっと単純な解決方法があるのかと思いまして。
0409398
2008/03/31(月) 14:10:55ID:???ありがとうございます(すれ違いました)。
>>408の通りですが、usingという書き方は知りませんでした。
勉強不足ですね…。
0410NAME IS NULL
2008/03/31(月) 15:14:44ID:???全件カウントなら・・・別テーブルでカウントしておいた方がよくないか・・・・?
引いてくる条件のバリエーションが多いと結局面倒になるだけだけど。
0411NAME IS NULL
2008/03/31(月) 15:24:33ID:cYc2EXIdidを主キーにして、データはidの昇順に登録しておきました。
WindowsなのでpgAdminIIIのデータビューで見るとidの昇順にデータが見えます。
一方
SELECT id from table
とするとid昇順になっていないところがありました。
order byを使えばいいことは分かったので問題はないのですが、こういうことは十分起こりうることなのでしょうか?
0412NAME IS NULL
2008/03/31(月) 15:28:25ID:???PostgreSQLに限らず一般的にそう。
0413NAME IS NULL
2008/03/31(月) 15:28:39ID:???レコードの順序は保証されない。順序が重要ならば必ず ORDER BY すべし。
0415NAME IS NULL
2008/03/31(月) 16:05:11ID:???結局はよく使う検索条件だけに絞って一瞬で検索できるようにしたんだけど、
それとは別に勉強のために数GBのデータを早くする方法無いのかなと
思ってさ。Oracleなら全部キャッシュにいれてしまえばいいんだろうけど、
PostgreSQLはキャッシュサイズ800MBにピークがあるって事だったので、
どうしたらいいかなと。
元々は操作する人が任意の検索条件を指定できるようになっていたので
レコード数を別テーブルで管理は無理だった。
0416NAME IS NULL
2008/03/31(月) 21:03:41ID:???PostgresとOSでキャッシュ管理がダブるので、中途半端にメモリの半分とかしないほうがいい。
少なめにしておくか、むしろ限界まで割り当てるか、どっちか。
0417NAME IS NULL
2008/03/31(月) 22:35:44ID:???0418NAME IS NULL
2008/03/31(月) 23:35:10ID:???>っていうのは、残りの6GBはOSのディスクキャッシュにおまかせするってこと?
そのとおりです。HDDから読むから遅いのであって、メモリからなら
OSキャッシュからでも、postgreSQLのメモリからでも大差ないと思います。
0419NAME IS NULL
2008/04/01(火) 07:35:04ID:???テストをして決めるときの、パラメータ値の探索範囲の話をしているんだと思うよ。
0420NAME IS NULL
2008/04/02(水) 09:25:18ID:???ベンチテストという意味ではそのselect count()の結果自体がテスト
なんだけど、本番稼働中にDB止めながらパラメータ変えつつ
テストするわけにもいかないし、とりあえずメモリ増設と設定パラメータ変更
(バッファ1.5GBとか)はやってみたので、みなさんの知恵を借りに来ました、
という感じです。
0421NAME IS NULL
2008/04/02(水) 09:35:36ID:???テーブルサイズとか無視した単なる指標に過ぎなくて
環境によっては大きく変わるのかなあ。
例えば今回の場合だったら4GBキャッシュに割り当てた方がいいとか
参考にしたのはここ
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050402/158372/?P=2
0422NAME IS NULL
2008/04/02(水) 10:20:27ID:???全部SSDにつっこめ。
0423NAME IS NULL
2008/04/02(水) 10:50:22ID:???業務用のシリコンディスクっつーのもあるよね
http://www.newtech.co.jp/products/silicon_s/ramsan/index.html
16GBで570万て
0424NAME IS NULL
2008/04/02(水) 11:51:17ID:???全件カウントじゃ4GBがテーブル全部がキャッシュに乗っからないと劇的な変化はなさそうだし、
shared_buffersを4GB強にして試してみるのは悪くないと思う。
>>422
ランダムアクセス性能が非常に重要になるので、ランダムアクセスでは速いSSDは確かに
面白そうではあるけど、あっという間に寿命がくる罠…
0425NAME IS NULL
2008/04/02(水) 15:03:01ID:???フォーラムにも見当たりません。。
どなたかご存知ないでしょうか?
0426NAME IS NULL
2008/04/02(水) 18:09:27ID:???30日に延長されたよ。今後はこのテーブルだけで8GBになる。
ちなみにデータ領域をdfでみると今10GBくらい。
0427NAME IS NULL
2008/04/03(木) 11:29:13ID:???だからSSDに配置汁。
0428NAME IS NULL
2008/04/03(木) 14:30:26ID:???0429NAME IS NULL
2008/04/03(木) 22:18:13ID:???0430NAME IS NULL
2008/04/04(金) 13:53:48ID:???でも、8GB以上メモリを積めるマシンはそれなりの価格になるぞ。
0431NAME IS NULL
2008/04/04(金) 15:29:07ID:???最近とったメモリ大目の見積もりだと
クアッドコアのSMPでメモリ16GでSASの73GB(15000回転)でRAID10で
(保守とかその他オプションつけて)だいたい100万〜150万くらいだったかな
0432NAME IS NULL
2008/04/04(金) 18:59:30ID:???0433NAME IS NULL
2008/04/08(火) 17:59:30ID:JAlLqxhRで、結果をマウスで選択、コピーして、使ったりしてるのですが、結果が多い時コピペが大変です。
そんな時、コマンドの>みたいにテキストに書き出すことはできないでしょうか?
0434NAME IS NULL
2008/04/08(火) 18:19:36ID:???psql -U postgres test < test.sql > test.result
こうすればtest.resultに結果が書かれると思うんだけど
これじゃだめ?
0435NAME IS NULL
2008/04/08(火) 18:24:54ID:???psql を -o オプション付きで起動するか
psql で \g ファイル名とするか。
こういう時は psql --help するか
psql で \? すれば大概分かるかと。
0436NAME IS NULL
2008/04/08(火) 18:29:32ID:???0437NAME IS NULL
2008/04/09(水) 03:58:11ID:???Windowsじゃなかったらアレか
0438433
2008/04/09(水) 13:44:15ID:vjpBiAeV>>435
>>436
>>437
レスありがとうございます。
おっしゃる通り、ヘルプの存在をすっかり忘れてました。
失礼。
ログっていうのも手軽でいいですね。
0439NAME IS NULL
2008/04/10(木) 00:56:47ID:???0440NAME IS NULL
2008/04/16(水) 12:46:24ID:xMO3l+R5かなりコストがかかってしまい、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 NULL
2008/04/16(水) 13:01:41ID:???date列にindexを張るとか?
0442NAME IS NULL
2008/04/16(水) 19:52:51ID:???>>306
そんなのSQLサーバ側で変わったら使えないと思ったんだが、
見た目文字列リテラルなのか、日付リテラルなのかは、コンテキスト次第だ
った・・
>>440
やっぱり、dateにINDEX張ってないと遅くなるね。って441と同じ意見であった。
データが膨らむからその時点でディスク容量が増えているか・・・。
INSERT系なら、
ttp://www.postgresql.jp/document/pg831doc/html/using-explain.html
で、幾分か速くなった。
0443442
2008/04/16(水) 19:55:44ID:???ttp://www.postgresql.jp/document/pg831doc/html/sql-prepare.html
0444NAME IS NULL
2008/04/16(水) 22:27:02ID:???他には月ごとにパーティショニングしてみるとか。
0445NAME IS NULL
2008/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
とやるのよりはやいの?
状況によりけりとは思うんだけど、どちらのほうがより安定しているのかな、とおもって。
0446440
2008/04/17(木) 18:38:38ID:???アドバイスありがとうございます。
date にインデックスをはったら大分早くなりました。
というかめちゃくちゃ早くなりました。
0447NAME IS NULL
2008/04/17(木) 22:19:51ID:???pg_dumpallから生成されたファイルから、ある一つのDBだけリストアしたい
場合、コマンドとしてどのように実行すればよいでしょうか?
テンパってます。。。
0448NAME IS NULL
2008/04/17(木) 23:03:32ID:???最悪、ダンプファイルを開いて必要なとこだけ残してリストアする?
あまりお力になれず申し訳ない。
0449NAME IS NULL
2008/04/17(木) 23:17:08ID:???ありがとう、試してみます。
0450448
2008/04/17(木) 23:29:49ID:???postmasterのインスタンスをもう一個起動して、そっちに放り込んだあと
必要なDBだけのダンプファイルを作成するのはどうでしょう?
ダンプファイルを直接編集するよりは楽かもしれません。。。
0451NAME IS NULL
2008/04/17(木) 23:38:56ID:???ありがとう、私もそれしか思い浮かびませんでした。
いったん別マシンのpostgresにフルで戻した後、必要なdbだけをdb_dumpして、
それを戻すようにしました。手間ですが、何とかなりました。
0452NAME IS NULL
2008/04/18(金) 00:15:32ID:???何とかなったようでよかったです。
おつかれさま。
0453NAME IS NULL
2008/04/18(金) 10:11:21ID:TLsFyIeR主キーを削除できればできそうですけど・・
お願いします。
0454NAME IS NULL
2008/04/18(金) 10:56:55ID:???MySQL、新機能追加は有償版の「MySQL Enterprise」だけを対象に
http://www.technobahn.com/news/2008/200804172000.html
Linuxを代表するオープンソースベースのリレーショナルデータベース管理システムのMySQL
が近くソースコードの公開を停止する方向で準備を進めていることが16日、米カリフォル
ニア州サンタクララで開催中のMySQLコンファレンスの席上で明らかとなった。
0455NAME IS NULL
2008/04/18(金) 11:06:32ID:???スレ違い
MySQL vs PostgreSQL Part2
http://pc11.2ch.net/test/read.cgi/db/1123011800/
こちらへどうぞ
0456NAME IS NULL
2008/04/18(金) 11:14:49ID:???0457NAME IS NULL
2008/04/18(金) 22:09:27ID:???0458NAME IS NULL
2008/04/18(金) 22:56:43ID:???『なんか大変ですね。よかったらこっちも試してみませんか。』
0459NAME IS NULL
2008/04/18(金) 23:01:55ID:???XOOPSが動けば、PostgreSQLに乗り換えたい。
0460NAME IS NULL
2008/04/18(金) 23:13:45ID:???つーか、ライセンスのこと気にする人は最初からこっちにいるでしょ。
>>459
へ? 動かないの? XOOPS コミュニティってそんな低レベルな世界だったんだ。
0461NAME IS NULL
2008/04/18(金) 23:19:07ID:???PostgreSQLで動かしたことがあるのか?
推奨環境には、MySQLしかないようだが。
0462NAME IS NULL
2008/04/18(金) 23:25:42ID:???何言ってるの?
XOOPS って MySQL に依存しまくりのコーディングしてるの?
なんという前時代的な。
にしたって、それくらい改造出来るだろって話。
実際やってる例もあるみたいだし。
0463NAME IS NULL
2008/04/18(金) 23:29:47ID:???0464NAME IS NULL
2008/04/19(土) 01:18:47ID:???0465NAME IS NULL
2008/04/19(土) 06:28:53ID:???0466NAME IS NULL
2008/04/19(土) 09:32:09ID:???行ロックなら SELECT ... FOR SHARE/UPDATE
表ロックなら LOCK tbl IN SHARE/EXCLUSIVE MODE
>>465
MVCCあるからあんまり必要ないのは同意。
でも SELECT FOR UPDATE くらいは使わないといけないこともよくある。
0467NAME IS NULL
2008/04/19(土) 12:14:16ID:???というより、SELECT FOR UPDATEはOracleやPostgresのように直接RRレベルを
サポートしないDBMSでRRが必要な場合に使うものと考えた方が良い。
下手にロックとか考えると、同期制御とごっちゃに理解して後々困ることになるからね。
OracleのRead Commitedは間違ってる、とかw
0468NAME IS NULL
2008/04/19(土) 15:14:52ID:???0469NAME IS NULL
2008/04/19(土) 15:17:10ID:???0470NAME IS NULL
2008/04/20(日) 07:02:44ID:???>pgperlを使う方式(旧称 pgsql_perl5)
>1995年のpostgres95の時代からPostgreSQL7.2.3まで PostgreSQLのソースの含まれていた Perlインタフェースで,
>libpqに似せたシンプルなインタフェースデザインとなっています.
>libpqライブラリが必要です.
0471NAME IS NULL
2008/04/22(火) 13:52:15ID:qNcJmW6iFETCH [ direction { FROM | IN } ] cursorname
とありますがFROMとINの違いってなんですか?
「INを使用するオプションはPostgreSQLの拡張です。 」としか書いてないし
実際に使ってみても同じ結果しか得られないし・・・
0472NAME IS NULL
2008/04/22(火) 14:18:56ID:???FROMが標準語で、INはPostgreSQLの方言ってだけかと
0473NAME IS NULL
2008/04/22(火) 17:12:16ID:???PostgreSQLでもutf-8を使ったほうがいいんですか?
utf-8にしたことにより発生するエラーというものも有るんでしょうか?
0474NAME IS NULL
2008/04/22(火) 23:14:06ID:???基本的にはドライバが吸収するから、webサイトとDBの言語は
別々に考えていいよ。そして、どっちもutf-8にすべき。
諸事情でwebをSJISにする場合でもDBはutf-8で
いいんじゃないかな
0475NAME IS NULL
2008/04/23(水) 00:32:56ID:???ありがとうございます!
統一できると、ローカル作業で言語切替の事を気にしなくていいのでよかったです
0476NAME IS NULL
2008/04/23(水) 01:40:14ID:???0477NAME IS NULL
2008/04/23(水) 10:52:33ID:???まあ日本語以外のマルチバイト文字も考えなきゃならんときはUTF-8はありがたい
0478NAME IS NULL
2008/04/23(水) 11:00:32ID:???0479NAME IS NULL
2008/04/23(水) 11:17:38ID:???個別にソート用に表持たせることもあるかな
0480NAME IS NULL
2008/04/23(水) 19:00:39ID:???int 型を検索するときに
c = 1 ではなく、' で括った
c = '1' がエラーになる可能性はありますか?
PostgreSQL 8.3 にしたところ、text 型のカラムを検索する場合
where foo = 1;
ではエラーになりました。
int 型は括っても括らなくても使えているのですが、
SQL の標準とか、将来的にどうなのかな、と疑問に思って。
ご存じの方、よろしくお願いいたします。
0481NAME IS NULL
2008/04/23(水) 19:28:27ID:???↓が参考になるかも?
http://www.postgresql.jp/document/current/html/typeconv.html
個人的には
bigintとintとかtextとcharみたいにサイズが違う同じ型ならDBにまかせるけど
intとtextみたいに別物は明示的にキャストしてあげたほうがいいと思う。
0482NAME IS NULL
2008/04/23(水) 19:45:46ID:???その書き方で大丈夫。
クォートされていると型の決定は文脈依存で、適当に変換される。
ちなみに、若干似てるけど、
Java で PreparedStatement#setInt() の代わりに setString() するのはダメよ。
0483480
2008/04/23(水) 21:26:43ID:mDsa5IzIありがとうございます。
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 NULL
2008/04/23(水) 23:01:02ID:???エラーにはならない。安心して (2) を使って大丈夫。
0485NAME IS NULL
2008/04/24(木) 05:05:18ID:???これが、問題なく使えていたのを初めて知った。
気になったので確認したら、数字だと通ってたんだな。
0486NAME IS NULL
2008/04/24(木) 08:04:22ID:???正確には、型の不一致があったとき、両辺を勝手に text にキャストして比較していた。
where timestamp = 数字 とかも通っちゃってた。
いろいろと危険なので、変更されてよかったと思う。
0487NAME IS NULL
2008/04/24(木) 13:49:37ID:LtHVlG1o数字は 1 でも '1' でも危険はないから
今後とも大丈夫、ということなのでしょうか?
0488NAME IS NULL
2008/04/24(木) 22:01:50ID:???可能性の話をするならエラーになる可能性はあるんじゃない?
もしくはエラーにはならなくてもtextで検索しにいくので
条件にマッチしない可能性とか
0489487
2008/04/24(木) 22:40:07ID:v9wdKkgnありがとうございます。
SQL:1999 や SQL:2003 などの
SQL 標準的にはどうかご存知の方は
いらっしゃいませんか。
0490NAME IS NULL
2008/04/24(木) 23:52:03ID:???ちゃんと型あわせるようにしておけば大丈夫なだけじゃん。
どんな言語でも「やっぱ暗黙のキャストやーめた」となる可能性は
0じゃないよ
0491NAME IS NULL
2008/04/25(金) 00:02:58ID:???内部的にはかなりキャストしてるのが分かる
たいしたことは無いんだろうけど、表の結合条件でキャストが多いと
性能が落ちるかもしれんね
0492NAME IS NULL
2008/04/25(金) 07:50:04ID:???リテラルなら、SQLパースのあと1回だけキャストされて、処理中はすでにキャスト後になっている。
性能を心配する必要は無いよ。
そもそも「数字」といったって、int2/4/8, float4/8, numeric と
いろいろあるんだから、'' で括らなくても何かしらの変換が挿入される可能性はある。
0493NAME IS NULL
2008/05/04(日) 14:06:49ID:???過去バージョンと比較して使用感はどんなもんでしょうか
0494NAME IS NULL
2008/05/07(水) 10:21:33ID:AHN5+YcnInternet Explorer ではこのページは表示できません
になってしまいますが、サーバがこけてますか
0495NAME IS NULL
2008/05/07(水) 10:40:52ID:???ftp://ring.ocn.ad.jp/pub/misc/db/postgresql/
0496NAME IS NULL
2008/05/07(水) 11:25:58ID:???いけました。ありがとう。
0497NAME IS NULL
2008/05/07(水) 14:23:09ID:???8.2でパフォーマンスが凄く悪かったサーバが見違えるようによくなった。
他のサーバもそこそこ改善してるし今のところ人為的なのを除きトラブルはない。
無茶といわれてた大量UPDATEに耐えられるかな?
できるならそういうコードも書きたいのだが・・・
0498NAME IS NULL
2008/05/07(水) 14:46:10ID:???是非試していただければと思います。
0499NAME IS NULL
2008/05/07(水) 17:10:05ID:???Windowsの他のプログラムから、インストーラを起動して自動的にイン
ストールできるようだといいのですが。
0500NAME IS NULL
2008/05/07(水) 17:38:32ID:???http://pginstaller.projects.postgresql.org/silent.html
0501NAME IS NULL
2008/05/07(水) 18:30:16ID:???具体的に8.2ではいけなかった処理ってなんとなく尻尾つかめてたりするのでしょうか・・?
0502NAME IS NULL
2008/05/07(水) 21:34:20ID:Lqr18+2Glent /*貸し出し管理*/
+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の制限に引っかかっているようなことがありませんでしょうか?
0504NAME IS NULL
2008/05/08(木) 09:31:00ID:???min(book.fromdate || book.name) の部分で、日付が yyyymmdd に変換されると
期待してそうだけど、ちゃんと動作している?
単に、group by に book.name を含めるべきなのでは?
> minの結果が変
「変」とか「おかしい」とか言われても、助けられない。
具体的にどうなったのか、説明して欲しい。
0505NAME IS NULL
2008/05/08(木) 12:59:40ID:???レスどうもです。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 NULL
2008/05/08(木) 13:15:26ID:???unionとか関係無しに単純に文字列のminとmaxをやったらどうなるの?
encodingは?
0507NAME IS NULL
2008/05/08(木) 13:55:21ID:???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 NULL
2008/05/08(木) 13:57:57ID:???誤:ちなみにmax()にすると"20080502書籍02"が返ってきます。
正:ちなみにmax()にすると"20080501書籍01"が返ってきます。
0509507
2008/05/08(木) 14:03:26ID:???書籍01→01
書籍02→02
min(book.fromdate) min(book.name) min(book.fromdate || book.name)
20080501 01 2008050101
正しく集計されました。
もしかしてmin()関数の引数に全角文字が含まれるとおかしな動きをする、とかありますか?
0510NAME IS NULL
2008/05/08(木) 14:06:09ID:???20080501書籍01
20080502書籍02
min(book.fromdate || book.name)
この場合、先頭の8文字で大小比較が完了するので、全角文字までの評価は行われないだろうと期待していましたが、
>>509の結果を見ると、そうでもなさそうですね?
0511NAME IS NULL
2008/05/08(木) 14:53:27ID:???どんな漢字が含まれると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 NULL
2008/05/08(木) 15:02:03ID:???0513NAME IS NULL
2008/05/08(木) 15:10:32ID:???>>507
0514NAME IS NULL
2008/05/08(木) 15:27:32ID:???0515NAME IS NULL
2008/05/08(木) 15:42:59ID:???分かりません。Windows版なんですけど、付けたかどうかを確認する方法ってありますか?
でも、なんかビンゴっぽいですね。
0516NAME IS NULL
2008/05/08(木) 16:02:08ID:???Windowsかあ。createdbはどうしたの?インストール時ならチェックする項目あったかなー。
SELECT name,setting FROM pg_settings WHERE name ~ '^lc';
とかどう?
0517NAME IS NULL
2008/05/08(木) 16:04:40ID:???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 NULL
2008/05/08(木) 16:05:54ID:???0519NAME IS NULL
2008/05/08(木) 16:06:32ID:???noにすれば、そこは C になるはず。
noにしないとソート順狂うから、それだろうね。
0520NAME IS NULL
2008/05/08(木) 16:15:06ID:???ありがとうございます!
ちなみにinitdbからやり直さないとダメなんですよね。キッツイなぁ。createdb毎に指定できないものか。。
0521NAME IS NULL
2008/05/08(木) 16:28:19ID:???0522NAME IS NULL
2008/05/08(木) 17:01:28ID:???やってみます!
0523NAME IS NULL
2008/05/08(木) 17:24:44ID:???そもそもそれに依存しない抽出方法があるような気がします。
それぞれの本ごとに、一番古い貸し出し日および冊数を出したいのですよね?
0524NAME IS NULL
2008/05/08(木) 17:28:36ID:???以下のような頻出事例と似てるような気がします。
http://pc11.2ch.net/test/read.cgi/db/1193486961/35-36
0525NAME IS NULL
2008/05/08(木) 17:30:31ID:???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 NULL
2008/05/08(木) 17:35:10ID:???>それぞれの本ごとに、一番古い貸し出し日および冊数を出したいのですよね?
一番古い貸し出し日は抽出対象ではないのですが、
bookテーブルが世代管理されているので(同一idでfromdateとtodateで管理)
一番古い貸し出し日の時のbook.nameを世代を見て抽出したいのです。
0527NAME IS NULL
2008/05/08(木) 17:43:12ID:???postgresql.conf を data-old から data にコピーすればいいと思う。
0528NAME IS NULL
2008/05/08(木) 17:43:40ID:???そういうときは、ログとpostgresql.confをよく嫁
0529NAME IS NULL
2008/05/08(木) 18:58:28ID:???お騒がせしました。パニクって再インストールしてしまいましたw そしてその再インストールでも小一時間ハマってました。
ロケールをCにして再度SQLを実行したら期待通りの結果が返ってきました!!アドバイスをくれた皆さん本当にありがとうございました。
0530NAME IS NULL
2008/05/08(木) 22:31:42ID:???v8.3 からは適合しない組み合わせはエラーが出力されるようになったので、
うっかりミスも減らせるはず。
0531NAME IS NULL
2008/05/08(木) 23:12:35ID:???石井さん乙?
0532NAME IS NULL
2008/05/08(木) 23:25:38ID:???> サーバのロケール設定と矛盾するデータベース符号化方式を不許可としました。(Tom)
0533NAME IS NULL
2008/05/09(金) 00:38:51ID:???プログラムで行えば出来るのは解っているのですが、
一部一致検索で、ひっかからなくなって困ってしまいました。
そこで、PostgreSQL自体で暗号化する方法があれば、部分一致検索も
正しく動作するのか?と考えました。
だれか、こんな事をやった事ないですか?
0534NAME IS NULL
2008/05/09(金) 00:45:42ID:???ttp://osb.sraoss.co.jp/PostgreSQL/Manual/PostgreSQL-8.0-ja/encryption-options.html
特定の列に関する暗号化
/contrib関数ライブラリ pgcryptoにより、あるフィールドを暗号化して保存することができます。データの一部が極秘データであるような場合に有用です。クライアントが提供した複合化用のキーで、サーバ上のデータを複合化し、クライアントに返されます。
複合化されたデータと復号化用のキーは、復号処理中およびクライアントサーバ間の通信中サーバ上に存在します。このため、データベースサーバへの全てのアクセス権限を持つユーザ(例えばシステム管理者)によって、データとキーが盗まれる瞬間があります。
0535NAME IS NULL
2008/05/09(金) 01:53:57ID:???トム。。。
0536NAME IS NULL
2008/05/09(金) 07:54:44ID:???部分一致検索したいのなら、ファイルシステムレベルで暗号化しないとだめ。
ただ、SELECT * で普通に元の値を取得できてしまうのが難点かも。
pgcryptoのような方式で、部分一致検索できるようにしてしまうと、
暗号化の強度としてはゼロに等しい。難読化くらいの価値しかない。
大小の順序を保つ必要があるので、二分検索で簡単に特定されちゃう。
0537NAME IS NULL
2008/05/09(金) 08:42:47ID:???こういう話出す人はもう少し暗号の勉強をして、表現力を養ったほうがイイよね。
権限を持つ者がデータを持っていけるのは、暗号とは相関性が無いんだよ。
無駄に暗号強度とか持ってくるから、「説得力があると騙される無知な人も居る」と覚えておこう。
0538NAME IS NULL
2008/05/09(金) 16:32:04ID:???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 NULL
2008/05/09(金) 17:20:05ID:???birthとgenderでグループ化したらそのグループに複数のidが含まれる可能性があるから
そのまま出すのは無理。
最大値 max(id) とか、一つに特定できるのならばそれが使えるけど。
0540NAME IS NULL
2008/05/09(金) 18:00:55ID:???ですよねー
やりたいのは、まさにグルーピングであり、複数のidをグループごとにとりだしたいんです。
でもSQLではなんかうまくできなくて...すごく不自由しています。
こんなとき、みなさんどうしてますか。やっぱりPL/SQLとか使わないといけないんですかね。
0541NAME IS NULL
2008/05/09(金) 18:13:23ID:???具体的に、どんなデータからどんなデータを抽出したいのか書いてくれればわかるかもしれん
0542NAME IS NULL
2008/05/09(金) 18:51:20ID:???とか?
0543NAME IS NULL
2008/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 NULL
2008/05/09(金) 20:39:07ID:???で、あなたはいったいなんの役に立っているの?
0545NAME IS NULL
2008/05/10(土) 02:51:14ID:???抽出結果が伏せ字だらけ、、、はっ!これが暗号ってやつDESか?
0546NAME IS NULL
2008/05/10(土) 08:50:59ID:???idを配列として取り出してみては?
http://www.postgresql.jp/document/current/html/xaggr.html
のarray_accumを参考に。
0547NAME IS NULL
2008/05/10(土) 13:49:28ID:???>>534はドキュメントのコピペですよ。
どの経路をどういう目的で暗号化したいかによって全然変わってくると思う。
>>533の文面から察するに、ディスク上のデータを暗号化したいだけで、サーバ上のメモリとか通信路の上では暗号化されなくてもいいみたいだし。
0548NAME IS NULL
2008/05/10(土) 23:13:17ID:???> >>534はドキュメントのコピペですよ。
それは見れば解る。
> どの経路をどういう目的で暗号化したいかによって全然変わってくると思う。
> >>533の文面から察するに、ディスク上のデータを暗号化したいだけで、
> サーバ上のメモリとか通信路の上では暗号化されなくてもいいみたいだし。
キミに知識があるのは理解したけど、
具体的な部分を引用で誤魔化しただけじゃ意味が無い。
>>533みたいな質問を恥ずかしくなくできる程度だと、
その引用が役立つとは思えない。
暗号の基礎を学ぶ方が先決と感じるけどね。
0549NAME IS NULL
2008/05/10(土) 23:41:57ID:???部分一致検索が出来る方法を探していたので、
メモリー上や通信経路上での暗号は別問題って事で。
534や536のpgcryptoを試してみます。
0550NAME IS NULL
2008/05/11(日) 16:40:36ID:nKIrUfLqjdbcがありませんでした。
jdbcのみインストールできるサイトはありませんか?
よろしくお願いいたします。
0551NAME IS NULL
2008/05/11(日) 18:12:16ID:hAgtRqsE本家->downloadでDLのページいってみては?
0552NAME IS NULL
2008/05/11(日) 18:44:24ID:???作業をしてるのだけど、IDカラムをPRIMARY KEYにするために
数字を重ならないように振り直す良い方法ない?
連番である必要はないのだけど、
UPDATE id = nextval('foobar_id_seq');
だとトランザクションが完了までにストレージの容量不足であぼ〜ん。
データベースが500Gでストレージ容量が800Gな感じ。
行数はpgAdminの概算で10億のオーダー(実際にもたぶんそんなもん)。
Intel 8コア2Ghz、メモリ6Gで丸一日動かすぐらい以下で終わるとうれしい。
0553NAME IS NULL
2008/05/11(日) 19:33:49ID:???暗号の基礎というのが想像つかないけど、公開鍵暗号とか、ハッシュ関数?AliceとかBobがいて、…みたいなことかな。
よかったらポインタとかキーワードください。
部分一致検索「できない」ところに暗号化する意味があるといえばあると思うんだけど、暗号化されたままのデータに対するプログラムによる処理、という研究領域もあったような。
まだ実用段階ではないはず。
0554NAME IS NULL
2008/05/11(日) 20:59:34ID:???250GBぶん処理 → VACUUM → 残りの250GBを処理
で、750GBぎりぎりに収められるような気はするけど、効率的では無いね。
オリジナルの各サーバからデータをダンプすると思うのだけれど、
そのときについでにIDを再割り振りしてはいかがでしょ?
COPY (SELECT ID + <サーバごとのオフセット>, <ID以外の属性> FROM tbl) TO ...
みたいな。
0555NAME IS NULL
2008/05/11(日) 21:49:59ID:???レスどうもです。
すでにpg_dumpでテーブルを圧縮ダンプしてオリジナルを消してしまって
いるのですが、書き戻しつつまったりやってみます。
スタンドアロンで起動してチョメチョメするとUPDATEがトランザクションを
作らずできるとかあると良かったのですが。
0556NAME IS NULL
2008/05/11(日) 22:49:47ID:nKIrUfLqこのやり方だとすべてをインストールしなければならないですよね?
jarファイルだけほしいんですが・・
0557NAME IS NULL
2008/05/11(日) 23:05:40ID:???つ 本家 [ttp://jdbc.postgresql.org/]
0558NAME IS NULL
2008/05/12(月) 00:19:43ID:???0559NAME IS NULL
2008/05/12(月) 02:57:40ID:???>>534はpostgres標準でカラムごとに暗号化する方法が用意されてるよ
というポインタを出しただけだろう。なんでそんな喧嘩腰なん?
0560NAME IS NULL
2008/05/12(月) 13:03:06ID:???せめてどの列に何のデータが欲しいかくらい書いて下さい。
0561NAME IS NULL
2008/05/12(月) 14:25:10ID:???>>543は質問者への例だよ。
質問者が>>542みたいなこと書くからさ。
0562NAME IS NULL
2008/05/12(月) 16:11:58ID:???ごめんよ('A`)
0563NAME IS NULL
2008/05/12(月) 19:38:57ID:???以下の通りほぼ同じ数字なのですがこの場合どれを使えばいいのでしょうか?
■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 NULL
2008/05/13(火) 23:21:07ID:???たまにバグ持ちのOSもいるけど。
0565NAME IS NULL
2008/05/14(水) 16:50:51ID:???テーブルは200個くらいで、多いテーブルでもレコード数は20,30万レコードくらい、大半は数千、数万程度
これってだいぶ少ない感じだからかな?それともdumpを戻してからあまりデータが更新されてないから
汚れてないってことで早かったんですかね?
後、VACUUM FULL テーブル名って感じでテーブルのみ指定できるけど、これを
全テーブルやれば、VACUUM FULLやったときと変わらないのでしょうか?
0566NAME IS NULL
2008/05/14(水) 19:31:16ID:???>dumpを戻してからあまりデータが更新されてないから
> 汚れてないってことで早かったんですかね?
> これを全テーブルやれば、VACUUM FULLやったときと変わらないのでしょうか?
いちいちその通りでなにも返す言葉がない
0567NAME IS NULL
2008/05/16(金) 22:29:54ID:???今は 1 から始まっているのをたとえば10000から始めたいんですが。
0568NAME IS NULL
2008/05/16(金) 22:51:10ID:???答えを知らない俺がググって10秒で分かる内容を質問する勇気に感心した。
0569567
2008/05/16(金) 22:57:55ID:???0571NAME IS NULL
2008/05/17(土) 00:28:43ID:???COPYでテーブルのデータを全てCSVに落としたいのですが
文字列が2重引用符で囲まれなくて困っています。
COPYの説明読む限り、デフォルトは2重引用符となっています。
QUOTEで直接指定しても変わりありません。
0572NAME IS NULL
2008/05/17(土) 09:40:53ID:???FORCE QUOTE
0573NAME IS NULL
2008/05/17(土) 13:30:17ID:???文字列だけ指定した引用符で囲いたいんですが
単純にQUOTEだとNULL文字だけしか引用符で囲ってくれないんです。
0574NAME IS NULL
2008/05/17(土) 13:54:31ID:???0575NAME IS NULL
2008/05/17(土) 17:56:34ID:???こういう感じのことをしたいのですが
SELECT * FROM TABLE1 ORDER BY MAX(COL1,COL2,COL3); // COL1〜3のなかで最大の値を取りたい
0576NAME IS NULL
2008/05/17(土) 17:57:02ID:UrIKqt4y習慣でsageてしまった・・・
0577NAME IS NULL
2008/05/17(土) 18:58:10ID:???greatest() かな。max(greatest(col1, col2, col3))
0578NAME IS NULL
2008/05/19(月) 20:51:28ID:KbQaa3g3この場合、連番はどうやって取るのがスマートでしょうか?
板(板No、・・・)
スレッド(板No、スレッドNo、・・・)
レス(板No、スレッドNo、レスNo、・・・)
板Noはシーケンスでいいとして、スレッドNoとレスNoの取り方で迷っています。
Max(レスNo) + 1で取るのがいいか、発番テーブルを作るのがいいか。
あるいはもっとスマートなやり方があるのでしょうか。
アドバイスお願いします。
0579NAME IS NULL
2008/05/19(月) 22:29:57ID:???insert 〜 select 〜でいいんじゃない?
発番号テーブルとか作ってわざわざ整合とりにくくする必要性無いと思う
0580NAME IS NULL
2008/05/20(火) 01:06:45ID:yIeco2ccというデータが入っていたとしまして、SQLでこのタグ(<>で囲まれている文字列)を省き、
あいうえおかきくけこ
として検索できるようにする方法はありますでしょうか。
もしありましたらご教示いただけますと幸いです。
宜しくお願いします。
0581NAME IS NULL
2008/05/20(火) 02:47:41ID:???> SQLでこのタグ(<>で囲まれている文字列)を省き、
regexp_replace(データ,'<.*?>','','g')
0582NAME IS NULL
2008/05/20(火) 09:41:17ID:???0583NAME IS NULL
2008/05/21(水) 09:35:37ID:LdhCgnd0金額を入れるカラムは、精度の高いnumericを使用した方がよいと聞いたのですが、
マニュアル等で調べたところ、そのカラムに整数しか入らない場合はinteger等で十分のような気がするのですが
この考え方で合っていますでしょうか?
0584NAME IS NULL
2008/05/21(水) 09:58:22ID:???0585583
2008/05/21(水) 11:52:47ID:???確かにその場合は小数点があるのでnumericが必要ですよね。
必ず整数しか入らない前提の場合はintegerでも良いと思ってよいでしょうか。
「精度」の意味がよく分かっていないかもしれませんが、
整数しか格納しないのであれば、numericもintegerでも計算で誤差は生まれないと
思っているのですが。。
0586NAME IS NULL
2008/05/21(水) 13:33:19ID:???0588NAME IS NULL
2008/05/21(水) 20:30:49ID:???numericが「何と較べて」精度が高いのか聞かなかった?
真数値: numeric integer
概数値: real float
あと、「精度」といっているのが誤差の少なさなのか
有効数字のことなのか。
「金額〜」という文脈で精度のことを言うときは、上記の
真数値である(誤差がない)ことを言う場合が多い。
0589NAME IS NULL
2008/05/22(木) 07:29:35ID:???日本でも銭まで必要なこともあるし
そういうのを踏まえて必要かそうでないか判断しては
0590583
2008/05/22(木) 10:19:23ID:???レスありがとうございます。
元々、素人DB設計者がnumeric(10,0)としていたので
突っ込んでやりたいなと思って質問しました。
>numericが「何と較べて」精度が高いのか聞かなかった?
金額の計算をする時、integer等と比較しての話として精度が高いと聞きました。
なので、「精度」は
>真数値である(誤差がない)ことを言う場合が多い。
こっちのことだと思います。
>日本でも銭まで必要なこともあるし
情報小出しですいません。
私も、numericを使うことに異論は無いのですが、
もともとのカラムがnumeric(10,0)だったんです。。
「精度が高い」と人から聞いただけで、「精度」の意味も考えずに
numeric型を採用しているDB設計者に対して
「小数以下格納しないならintegerでいいじゃないですか」という理由が欲しかった次第です。
低レベルな話ですごく申し訳ないです。。
0591NAME IS NULL
2008/05/22(木) 10:48:29ID:???金額を扱う場合はnumericと決めている、のならnumericでもいいし。
0592NAME IS NULL
2008/05/22(木) 12:10:45ID:???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 NULL
2008/05/22(木) 21:03:28ID:???扱う桁数でいいだろ。
お金だと桁数10桁で足りない事もあるし、そういうときはnumericでいいんじゃね?
俺は、Java上で金額計算するから格納時には桁数roundしてるから
入れ物さえあれば問題ない。
>>590
逆になんでnumericなのか聞けば?
俺は桁数が分かるという利点でnumericにしてるんだと思うがね。
DBのポータビリティを考えて、もう1層上でテーブル設計してるんじゃないか?
0594NAME IS NULL
2008/05/22(木) 21:10:58ID:???うちも同じようなテーブル設計があったので、直せるところはintにしま
した。物の個数ですらnumericでやってあったから、さらに低レベルかも。
intかbigintの方がコンパクトで高速と思ってます。
0595590
2008/05/23(金) 12:41:48ID:???レスありがとうございます。
とりあえず、DB設計者になぜnumericなのか聞いてみた結果
→「これがいいって聞いたから」
あとは愚痴スレ行きます。。
>俺は、Java上で金額計算するから格納時には桁数roundしてるから
>入れ物さえあれば問題ない。
私も同じようにしようと思います。
ご助言いただき、ありがとうございました。
0596NAME IS NULL
2008/05/24(土) 07:11:45ID:???ごめん嘘書いちゃった
テーブル指定無しで実行しないとシステムカタログがvacuumされないらしい
http://www.thinkit.co.jp/cert/marugoto/2/1/13/2.htm
0597NAME IS NULL
2008/05/25(日) 19:07:27ID:???いや、システムカタログ名を指定すればできるだろう。
VACUUM pg_class;
とか。面倒だから普通は autovacuum に任せるけど。
0598NAME IS NULL
2008/05/27(火) 14:05:46ID:ZU6uB09Aあるカラムが別テーブルのカラムを含んでいる行と外部結合ってできないでしょうか?
SELECT o.foo, u.bar FROM hoge o LEFT OUTER JOIN huga u ON o.foo LIKE '%'||u.bar||'%';
じゃだめでした。
なんかうまい方法ないでしょうか?
0599NAME IS NULL
2008/05/27(火) 14:38:11ID:???0600598
2008/05/27(火) 14:43:16ID:ZU6uB09A↑のでできてました。
結合するテーブルにINSERTするデータが間違ってるだけでした。
お騒がせしました。
0601NAME IS NULL
2008/05/29(木) 01:30:00ID:+Ml1/7K+以下のようになってしまっておりました。
<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 NULL
2008/05/29(木) 05:49:30ID:???プログラムからのselect時との
client_encodingの違いを意識してるか?
0603NAME IS NULL
2008/05/29(木) 10:42:05ID:???その<BD><BE><CD>・・・を出力してるのはページャー(more とか lessとか)
そのページャーがその文字コードに対応していない。
ページャーを何とかするか、ページャーにあわせてクライアントエンコードを変更する。
0604NAME IS NULL
2008/05/29(木) 21:28:20ID:???0605NAME IS NULL
2008/05/30(金) 10:10:15ID:???0606NAME IS NULL
2008/06/02(月) 17:13:40ID:???いやできない。試しにやってみるとこうなる。
WARNING: skipping "pg_user" --- cannot vacuum indexes, views, or special system tables
autovacuumまかせにできるのは小規模だけだろ。
数GB程度のデータ規模でも、アクセスが少ない時間をねらって
毎日vacuumしないとvacuum時間が長くなって大変。
0607NAME IS NULL
2008/06/02(月) 17:30:20ID:???0608NAME IS NULL
2008/06/02(月) 17:51:00ID:???pg_userはVIEWですよ。VACUUMできるわけが無いし、する必要も無い。
あと、最近のバージョンだと、vacuum_cost_delayを調整して
vacuum時間を「長くする」側にチューニングしたほうがよい。
レスポンスに影響が無いなら、時間が延びてもデメリットは無い。
「毎日vacuumしないと」も間違い。テーブルによっては、それこそ数分間隔で
VACUUMが必要な場合もあるし、年単位で十分なテーブルもある。
手作業でチューニングするくらいならば、autovacuumのほうが楽だし効率も良い。
VACUUMの運用法は、ここ数年で大きく変わってきているので、
あまり古い考えにこだわり過ぎないことをお勧めする。
0609NAME IS NULL
2008/06/02(月) 18:21:54ID:???0610NAME IS NULL
2008/06/02(月) 19:24:19ID:???0611NAME IS NULL
2008/06/02(月) 20:04:27ID:???そっか。確かにpg_typeならvacuumできたわ。
>>607
autovacuumって頻度指定できんの?
0612NAME IS NULL
2008/06/02(月) 20:13:45ID:???手動でやるようにしたんだけど。
一日数万件のinsert/deleteがあるのに何日間かvacuumされて
なかったんだよ。んでpgAdminで繋いだらautovacuum設定しろしろうるさい。
してあるのに。
バッチで実行すれば「アクセスが少ない時間帯にvacuumが完了」するように
指定できるし、vacuum実行時間のログもシステム側に残る。
autovacuumが効率よくvacuumかけてくれる事を説明してるURLある?
0613NAME IS NULL
2008/06/02(月) 21:07:26ID:???autovacuum_naptimeで最小間隔の指定は出来るし、
autovacuum_vacuum_thresholdやらautovacuum_analyze_thresholdやら
いろいろ設定可能
>>612
stats_row_level = onにはなっているよね?
0614NAME IS NULL
2008/06/02(月) 22:55:08ID:???そのテーブルだけ pg_autovacuum.vac_base_thresh で設定すると良いかも。
別に、バッチVACUUMとautovacuumは排他じゃないから、
むしろ両方とも設定した方が問題が少ないことが多いかな。
0615NAME IS NULL
2008/06/03(火) 02:16:34ID:???日中にvacuum走ると使い物にならなくなってしまうので、
autovacuumは切ろうかと思ってる。
てか毎日vacuumしてて空き領域が良好な状態だったら
autovacuumは走らないものなの?
0616NAME IS NULL
2008/06/03(火) 02:59:46ID:???とりあえず、autovacuumが行われるタイミングに関しては
ttp://search.net-newbie.com/pgsql/routine-vacuuming.html
参照。
0617NAME IS NULL
2008/06/03(火) 04:26:12ID:???閾値を超えなきゃvacuumされないのね。
とりあえず数万件の削除は日毎バッチで行われていて、
手動バキュームはその直後に行うようになってるから、
よりベターなタイミングっていうのは無いと思うのよ。
とりあえずこのまま行く
0618NAME IS NULL
2008/06/03(火) 16:19:23ID:???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 NULL
2008/06/03(火) 16:22:44ID:???せめてnetstatの結果ぐらい確認しろよ
0620NAME IS NULL
2008/06/03(火) 16:53:16ID:???調べてみたら5432のポートが開いてない感じがしたのですが、
その場合どういった対策をすればいいのでしょうか?
postgresql側での設定が必要なのでしょうか?
宜しくお願い致します。
0621NAME IS NULL
2008/06/03(火) 17:13:06ID:???感じがした、って…オマ…
火壁とかどうなってんの? Windows知らんから、これ以降は誰か頼む。
0622NAME IS NULL
2008/06/03(火) 17:32:40ID:???つながるならODBCの設定があやしいし、
つながらないならpingとかでネットワークで到達できるかからやってごらん。
0623NAME IS NULL
2008/06/03(火) 17:34:24ID:???そんなことせんでも telnet で 5432 に繋げればすぐ分かる。
0624NAME IS NULL
2008/06/03(火) 17:58:57ID:???0625NAME IS NULL
2008/06/03(火) 18:57:11ID:???ありがとうございます。
pingは無事に到達します。
Windows 2000 Serverにファイアーウォールはないと思うんで特に設定はしていません。
とりあえず今は触れる環境にないので、明日もう少し試してみます。
0626NAME IS NULL
2008/06/03(火) 19:04:03ID:???お前が"postgresql ポート 設定"でぐぐることすらできないのと、
telnet foobar 5432すらできない知能なのは良くわかったから、
きちんとお勉強してくるまで出入り禁止。
0627NAME IS NULL
2008/06/03(火) 20:19:57ID:???なのに火壁が!pingが!とか言ってるのはナニ?
pg_hba.confの、この部分もコピペしたとかじゃなくて?
# ローカルのみの設定
host all all 192.168.1.0/24 trust
LANの設定にあわせて記述してますか?
192.168.0.0/24 とか。
0628NAME IS NULL
2008/06/03(火) 20:26:08ID:???開いてない感じがしただけで
開いてないとは誰も言っていない罠www
>>625
ま、実際にLISTENポートとしてリストされなかったなら、
設定が悪いだけだから、見直して再設定すればいい。
0629NAME IS NULL
2008/06/03(火) 20:28:37ID:???0630NAME IS NULL
2008/06/03(火) 20:46:21ID:???分からない事は分からない。
それを素直に出せないのは、
眼鏡をかけた新人の女の子までしか許されません。
0631NAME IS NULL
2008/06/03(火) 21:05:04ID:???0632NAME IS NULL
2008/06/03(火) 21:14:53ID:???しまった!><
0633NAME IS NULL
2008/06/03(火) 21:21:02ID:???別のポート番号にしたいとき、そこ変えて、service postgresql startとやっても
反映されなくてハマったよー
0634NAME IS NULL
2008/06/04(水) 03:02:48ID:???>>612の通りだ。
pg_autovacuumテーブルでそのテーブだけ除外してやんな。
で、夜間にvacuumすればよろし。
0635NAME IS NULL
2008/06/04(水) 03:04:30ID:???ミスったw
>>615 → >>614
吊ってくる
0636NAME IS NULL
2008/06/04(水) 11:58:40ID:???インデックスを複数同時に張るのって、1つ張り×複数とは別のときに効果を発揮する……のでしょうか?
前任者が張りまくっていたものを整理しているのですが、どうなんだろうと思いまして。
1.id, name, dateが指定されたインデックス
2.nameのみが指定されたインデックス
3.nameがインデックス指定+where id=10 と記述
が存在。
1は、その3つを同時にwhere使用する場合にしか使われない? それともidだけをwhere指定する場合でも使ってくれるのでしょうか?
教えて頂ければありがたいです。
0637NAME IS NULL
2008/06/04(水) 12:02:19ID:???本条件の場合、はじめのレコードはヒット数2、2番目は2、3番目は1となれば期待通りとなります。
不可能かとは思いますが、もしもやり方がありましたらご教示いただけますと幸いです。
宜しくお願いいたします。
0638NAME IS NULL
2008/06/04(水) 13:37:07ID:???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 NULL
2008/06/04(水) 13:44:28ID:???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 NULL
2008/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 NULL
2008/06/04(水) 14:08:09ID:???スペース区切りでキーワード入れちゃってる時点で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 NULL
2008/06/04(水) 16:22:48ID:???ご教示感謝です。
641さんのSQLでうまくいきましたので、こちらを使用させていただきました。
本当にありがとうござした。
0643NAME IS NULL
2008/06/04(水) 16:56:29ID:???0644NAME IS NULL
2008/06/04(水) 17:25:55ID:???0645sage
2008/06/04(水) 22:28:25ID:???8.3.1、キャスト問題でなかなか8.1からバージョンアップに踏み切れない
状態です。うち、意外に日付や数値の自動キャストに頼ってる場所があった。
もう8.3運用してる人って居るのかなあ?
0646NAME IS NULL
2008/06/05(木) 03:18:56ID:???というかDBは8.2だったんだけどjdbcドライバで8.3を
使っちゃって自動キャストで引っかかった。
日付で検索したときに条件に引っかからないだけだったから
大して実害なかったけど。
0647NAME IS NULL
2008/06/05(木) 08:20:32ID:???数値はともかく、日付の自動キャストって怖くない?
日付のフォーマット書式って、環境依存だったような。
うちはPreparedStatementを使ってた関係で、
既に型チェックが厳密だったので、特に問題なく8.3に移行できました。
0648NAME IS NULL
2008/06/05(木) 10:42:17ID:???ご教示ありがとうございました、理解出来ました。
ざっと見8.1からっぽかったですが(これは『個別に貼ってあっても見る』の方かも?)、
ちょっと詳しく調べる時間が無くて提示出来ずに申し訳ないです。
複数インデックスが多い割には何も考えてないSQL文だらけだったので、ちょっと書き換えてきます……。
本当にありがとうございました。
0649NAME IS NULL
2008/06/05(木) 19:03:47ID:???日付をsetString()してた
0650NAME IS NULL
2008/06/05(木) 19:07:56ID:???2番目は駄目だと思うな。複数のカラムを組み合わせてハッシュコードを
作るわけだから、順序入れ替えをOKにしたら偉い数のインデックスを
つくらにゃいけなくなる。少なくともOracleは駄目だ。
だからApache TorqueみたいにWHERE句の順序を入れ替えられない
ORMが嫌われてたんだし。
0651NAME IS NULL
2008/06/05(木) 19:29:59ID:???8.1.11でexplainで確認したら
>>640のパターンは最後のも含めて
全部インデックススキャンになったよ。
0652640
2008/06/05(木) 19:55:18ID:???手元にある一番古い環境(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 NULL
2008/06/05(木) 23:26:11ID:???芸術的な妄想しったかw
0654NAME IS NULL
2008/06/06(金) 05:33:11ID:???昔のOracleがそうだったいうだけで今は違うみたいだね
ここには順序も入れ替えるなと書いてある
ttp://oracle.se-free.com/tuning/B1_index2.html
torqueでwhere句入れ替えられない事に対する文句は昔MLかなんかで見た。
0655NAME IS NULL
2008/06/06(金) 07:17:44ID:???いやいやいや、そんなこと書いてないw
0656NAME IS NULL
2008/06/06(金) 07:25:56ID:???その「効率」がだいぶ違うことには注意が必要ですよ。
なんにせよ、Bitmap Index Scan は結構なアドバンテージだと思われ。
0657NAME IS NULL
2008/06/06(金) 07:54:24ID:???突っかかりたいだけで日本語も読めないのか
「● 複合INDEXは先頭列から指定しないと、INDEXが使用されない」
ttp://www.geocities.jp/mickindex/database/db_optimize.html#LocalLink9
--8.複合インデックスの場合に、列の順粕ヤを間違えている
col_1, col_2, col_3 に対して複合インデックスが張られているとします。
その場合、条件指定の順番が重要です。
まあpostgresには関係無い話みたいだし悪かったな
0658NAME IS NULL
2008/06/06(金) 11:49:08ID:???知っている方いれば、コマンド教えてください!
0659652
2008/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 NULL
2008/06/06(金) 17:29:56ID:???設定の項目によるんじゃない?
項目によっては要pgpool再起動
0661NAME IS NULL
2008/06/06(金) 18:23:18ID:???インデックス貼ってた時までだよ。10gでも設定することは
できるけどもうサポートされてない
http://www.shift-the-oracle.com/inside/optimizer.html
0662NAME IS NULL
2008/06/06(金) 18:30:27ID:LCupMW8Eトリガで特定のカラムの値が任意の条件を満たす場合のみトリガを発動って出来ますか?
例えば、
status というカラムが 0 という値にupdateされた場合のみトリガ発動
みたいなことをしたいんです
可能なら具体的な設定方法をご教授下さい
0663NAME IS NULL
2008/06/06(金) 18:31:47ID:???0664NAME IS NULL
2008/06/06(金) 19:04:55ID:???0という値以外にアップデートされたときは何もせずに終わったらよくない?
トリガが実行されることのコストを気にしてるのかな。
0665NAME IS NULL
2008/06/06(金) 19:54:05ID:???たしかにまずいですよね。substr(日付)とやってる処理があって、いま
手直ししてます。ぜんぜん意識してなかったです。。
0666NAME IS NULL
2008/06/07(土) 02:50:25ID:???その程度の最適化は今時どんなDBMSでもやってくれるよ。
同じで当然。
0667NAME IS NULL
2008/06/07(土) 03:15:17ID:???流れが読めない人だなあ
0668NAME IS NULL
2008/06/11(水) 15:56:27ID:???またその理由を教えてもらえると助かります。
ちなみに自分は�@派です。
�@select column from table where integer = 1;
�Aselect column from table where integer = '1';
0669NAME IS NULL
2008/06/11(水) 16:45:08ID:???ごっちゃにするのは嫌うんじゃ
0670NAME IS NULL
2008/06/11(水) 17:02:46ID:???明確に違うものをなぜ同一視する。
文字列である数字と、数値を表す数字では、意味が違う。
0671NAME IS NULL
2008/06/11(水) 18:10:46ID:???�A 昔はこれしかなかった。
0672NAME IS NULL
2008/06/11(水) 19:21:42ID:???ってのは頻出だったな。今は大丈夫だが。
ちなみに '1' だけでは、まだ文字列ではない (unknown) 。
何かしらの型への変換が要求された時点でパースされる。
=# select foo(1);
ERROR: function foo(integer) does not exist
=# select foo('1');
ERROR: function foo(unknown) does not exist
0673668
2008/06/11(水) 22:59:50ID:???自分は>>669さんと同意見なんですが、
絶対 '1' にしろという人が身近に入るもので気になりました。
あと>>671さんの意見でなんとなく理由がわかりました。
0674NAME IS NULL
2008/06/12(木) 06:06:46ID:???元のカラムの型がintなら1を使うべきだと思ってたんだけど
そう単純な話でもないんだな
0675NAME IS NULL
2008/06/12(木) 07:01:53ID:???0676NAME IS NULL
2008/06/12(木) 07:56:21ID:???私はORACLEのバージョン3から使ってますが、当時から
数値はシングルクォーツなしで参照できたが・・・
0677NAME IS NULL
2008/06/12(木) 10:15:58ID:???私もその少し前からだと思う。マニュアルでは
WHERE DEPTNO = 30 であるのに 処理系では
WHERE DEPNTO = '30' でないとエラーになった記憶がある。
それで '30' とする習慣になってしまった。
もしかして、私の勘違いだったのかな。
0678NAME IS NULL
2008/06/12(木) 13:21:33ID:dWhU52qw0679NAME IS NULL
2008/06/12(木) 15:23:39ID:eu0D2QJApg_poolはシーケンスの整合性を取る場合にはテーブルロックが必要なのね。
テーブルロックしない方法は何か無いかしら?
Slony-IIとかpgClusterも同じでしょうか?
難しいなら障害時にDB1からDB2に自動的に切り替わらるといった障害耐性が
無くてもよいかな。単純にレプリケーションが取れていれば。
0680NAME IS NULL
2008/06/12(木) 19:17:16ID:???そのカラムがvarcharで定義されてたんじゃなくて?
0681NAME IS NULL
2008/06/12(木) 21:59:56ID:???drbdとか使ってミラーリングしとくとか
自動で切り替わらなくていいならPITRでリモートにバックアップとか
0682NAME IS NULL
2008/06/13(金) 05:58:44ID:???Slony-I ならテーブルロックしない。(-IIはリリースされてないよ)
pgCluster は、そもそも更新性能が 1/10 になるという噂もあるので微妙。
冗長化だけで良いなら、>>681のとおり、warm-standbyかDRBDが良いかも。
0683NAME IS NULL
2008/06/13(金) 15:17:28ID:???signed/unsigned修飾子とtinyint型がほしいorz
今時誤差の範囲かもしれないけど貧乏症なので
smallintだと入らないけどunsigned smallintなら入りきる時とか
tinyintで十分な時とか悔しくてしょうがないんだ
0684NAME IS NULL
2008/06/13(金) 18:17:27ID:???DBの実装はよくわからないけどC言語の時は、
shortで宣言してもCPU内ではintで確保して半分未使用になるだけなので
実は速度はintの方が早いっていうのがあったよ。
大量のデータを構造体にしてネットワークでやりとりするときは
packed宣言すればデータ量を節約することはできたけど。
構造体へのポインタ(アドレス)からsizeof(構造体)分をbyte[]にキャスト
して使うような太古の作り方の話だけどね。
0685NAME IS NULL
2008/06/13(金) 19:27:54ID:???0686NAME IS NULL
2008/06/13(金) 19:30:08ID:???参考までに。
0687NAME IS NULL
2008/06/13(金) 19:39:55ID:???C言語は、intがその処理系で一番パフォーマンスが出るように、と選ばれます
なのでintが速いのは当然です。
0688NAME IS NULL
2008/06/13(金) 20:11:32ID:???さぁ、ユーザ定義型を自作するんだ!
0689NAME IS NULL
2008/06/13(金) 23:15:36ID:???DBはそのネットワークと似たようなもんだよ。結局ディスクIOが最大のネックだから。
何億レコードにもなるようなテーブルは1byteでも減らしたくなるのが人情。
0690NAME IS NULL
2008/06/14(土) 00:11:27ID:???サイズと性能の釣り合いがとれてる(=コストパフォーマンスがいい?)のはintだと
書かれているけど、小さいサイズで構わないときにsmallintよりintの方が
速いとはかかれてないね。
>>689
ごもっともで
0691NAME IS NULL
2008/06/14(土) 00:18:06ID:???0692NAME IS NULL
2008/06/14(土) 00:49:03ID:???1日1,2回のpg_dump
0693NAME IS NULL
2008/06/14(土) 20:34:22ID:???バックアップ用ならwarm-standbyで鉄板じゃないの。
0694NAME IS NULL
2008/06/15(日) 00:45:18ID:???なるほどなるほど。確かに。
では、たとえばsmallintのほうがintよりも速い場合、以下のような記述をするでしょうか?
> smallint型は一般的にディスク容量に制限が付いている場合にのみ使用します。
~~~~
どうせならこう書きそうじゃないですか?
> smallint型に収まるデータを扱う場合はsmallintを使用することを推奨します。
> なぜならずっと速いからです。
あえて先の記述をするということは対して速度に差がないのであろうと想像します。
実際に測定するのが手っ取り早いんですけど、ドキュメントから読み取れることも多いと思います。
0695NAME IS NULL
2008/06/15(日) 01:13:31ID:???0696NAME IS NULL
2008/06/15(日) 01:48:21ID:???状況によるだろ。
100GBのテーブルと200GBのテーブルのfull scanを比較したら小さい方が速いだろうし。
0697NAME IS NULL
2008/06/15(日) 09:11:54ID:???うちはpgpool II 使ってます。ハード障害対策で使ってるんだけど、
意外にハード障害が起こらなくて、今のトコ手間だけ2倍以上な印象。
2重化してるせいで、大量更新集中時の読み出し処理とかは、片側から
読むようにしたりとか、変なコツが必要だったりする。
0698NAME IS NULL
2008/06/15(日) 13:40:18ID:???>>697
やっぱりpgpoolが多いのですねぇ。。。うちはPGclusterのロードバランシング機能はずした状態で使ってんだけど
ほかにそういう人いないかな。選んだ理由はデータ復旧がコマンド一発で楽だからなんだけど。
0699NAME IS NULL
2008/06/15(日) 23:02:13ID:???今度携帯用データベース作ろうとしたとき
一緒にするか分けるかどっちがいいんですかね…?
mysqlとpostgresを併用するのは速度的にはどうなんでしょ?
0700NAME IS NULL
2008/06/16(月) 02:08:25ID:UXZw8p6Gvistaにposgreをインストールできたのですが、postgresとつけたアカウントのパスワードで、データベースpostgresにアクセスしようとすると
フリーズしてしまいます。
どうすればvistaでフリーズしないで使えるようになるのでしょうか?
0701NAME IS NULL
2008/06/16(月) 02:36:58ID:???フリーズってPC(OS)丸ごと? クライアントアプリだけ?
アクセスしようとしたクライアントはナニ?
postgres以外のアカウントだとどぉう?
っていうか、posgreってなんだよ。
0702NAME IS NULL
2008/06/16(月) 09:29:14ID:???別にPostgreSQLで困りはしないだろ。
0703NAME IS NULL
2008/06/16(月) 11:34:23ID:???どっちでもいいので、DBは統一しておいた方が楽。
特にこだわりがなければPostgreSQLでいいでしょう。
0704NAME IS NULL
2008/06/16(月) 15:32:22ID:???0705NAME IS NULL
2008/06/16(月) 16:38:53ID:???そうみたい
0706NAME IS NULL
2008/06/16(月) 16:40:42ID:???併用しても問題ないけど、管理の手間を考えたらposgres一本の方がいいよ。
キャッシュの割り当てとかも一括だし。運用に携わる人はpostgresもmysqlも
どっちもプロフェッショナルなの?両方混ぜると似たようなコマンドで混乱すると思うんだけど。
あとマスタとか共通利用できないの?できるんだったらマスタテーブル一個の方が
更新も楽だしいいと思うけど。ものすごい負荷の高いシステムで将来的に
DBをわける可能性が大きいなら、今からインスタンスを分けておく意味も
あるかもしれない。
0707NAME IS NULL
2008/06/16(月) 23:12:40ID:???同じシステムのPC版、携帯版という違いであれば同じDBMSにしといたほうがいいよ。
0709NAME IS NULL
2008/06/16(月) 23:49:20ID:???ローカルマシンのPostgreSQLインスタンスにpsqlで接続しようとしたらOSごとフリーズってことですか?
0710699
2008/06/16(月) 23:56:17ID:???みなさん、ありがとうございます。
postgresで統一したいと思います。
PCと携帯で違うデータを見せたいのですが
マスタテーブルも一つにした方が良さそうですね・・・。
ありがとうございました。
0711NAME IS NULL
2008/06/17(火) 10:26:27ID:???DBを別にするとか、スキーマでわけるか、テーブルで分けるか、キーで分けるか、
0713NAME IS NULL
2008/06/17(火) 17:47:13ID:???まずメモリをチェックしなさい。
次にHDDをチェックしなさい。
Linux(Unix)ならこんな事で落ちない。
うんともすんとも言わない。メッセージが出ない。
保護違反とかのエラーは全てメモリエラーと思っていい。
0714NAME IS NULL
2008/06/17(火) 18:20:27ID:???保護違反とメモリエラーとは直接の関係は無い。
0715NAME IS NULL
2008/06/17(火) 18:25:12ID:???フリーズってのが全体が止まるのならな。
0716NAME IS NULL
2008/06/17(火) 19:18:07ID:???保護違反ならメッセージ出るか再起動するかする
0717700
2008/06/18(水) 00:44:28ID:???普通に使っている分には、まずフリーズしないのですが・・・SP1入れようとするとフリーズしますが・・・。
0718NAME IS NULL
2008/06/18(水) 01:32:15ID:???ないか
0719NAME IS NULL
2008/06/18(水) 04:34:25ID:???だめじゃん
0720NAME IS NULL
2008/06/18(水) 10:21:41ID:???ないか
pgAdminではつなげないの?
0721NAME IS NULL
2008/06/19(木) 00:15:18ID:???pc新規購入をお勧めする。
0722NAME IS NULL
2008/06/19(木) 00:24:28ID:???0723NAME IS NULL
2008/06/19(木) 01:34:49ID:???0724NAME IS NULL
2008/06/20(金) 11:25:00ID:???http://www.postgresql.jp/blog/56
にある Explaining Explain の日本語版読んでみたいんですが、
パーマリンクの変更があった影響なのか
単にもうファイルがないのか読めないでおります。
どなたかファイル持ってる方いらっしゃればどこかにあげていただけないでしょうか?
JPUG公式ぽいんですが、コメントのSPAM荒れっぷりを見てもメンテされてない可能性があるので
こちらにきてみました。
コリコリにDBチューニングしたいわけではなくて、SQLかく時にある
ちょっとした迷い(結果同じだけどどっちの書き方がいいかな?)
をクリアする助けになればなぁと思ってる感じです。
0725NAME IS NULL
2008/06/20(金) 12:05:19ID:???困った時の、Web Archive
http://web.archive.org/web/20060429195622/http://blog.postgresql.jp/images/Explaining_Explain_ja.pdf
0726724
2008/06/20(金) 12:59:02ID:???大感謝です!
0727NAME IS NULL
2008/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 NULL
2008/06/28(土) 23:32:34ID:???0729NAME IS NULL
2008/06/28(土) 23:45:40ID:???-Dで指定するデータ領域は別のドライブにしているけど、普通に動いてる。
0730NAME IS NULL
2008/06/28(土) 23:55:33ID:???ありがとうございます。
多分initdb.exeで -D 以降に移動させたいファイルパスを指定
してあげればいいのかなと思うのですが、initdb.exeの使い方が
いまいちわかりません・・・。
新規にデータ領域を作成して、そこに既存のdataフォルダをコピー
するような感じでいけるんでしょうか?
initdb.exeはコマンドプロンプトで実行するのでしょうか?
もしわかれば教えてください。
宜しくお願い致します。
0731NAME IS NULL
2008/06/29(日) 00:06:36ID:???initdb はコマンドプロンプトで --help とかつけて動かせば説明が出るけど、
>>1のドキュメントを読んだ方が良いかも。
0732NAME IS NULL
2008/06/29(日) 01:13:30ID:???アドバイスありがとうございます。
取り合えず調べて、空の別ドライブのdataフォルダにinitdbの実行し
成功するまでは出来ました。
その後、新規dataフォルダを既存のdataフォルダに上書きして、
サービスの実行・・・・・・起動不可
再度、空のdataフォルダを作成して、initdbを実行。
今度はそのままサービスの起動・・・・・・起動不可
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pgsql-8.3\ImagePath
の値はinitdbの指定パスと同じにしているのですが、他に設定
が足らないのでしょうか?
0733NAME IS NULL
2008/06/29(日) 01:34:59ID:???コントロールパネル -> コンピュータの管理 -> サービス を開いて
PostgreSQLのプロパティを見て、[全般]タブの「実行ファイルパス」が
レジストリと同じ値になっているか確認して味噌。
っていうか、レジストリを直接弄るってはじめて知った。
scコマンドを使うものばかりだと...。
0734NAME IS NULL
2008/06/29(日) 01:37:19ID:???0735NAME IS NULL
2008/06/29(日) 02:05:45ID:Kc/12zlO>>734
ありがとうございます。
>レジストリと同じ値になっているか確認して味噌。
ここは同じになっております。
多分、レジストリの値を参照して、ここに表示しているようですね。
>システムのログでも見れば。
今見てみました。
postgres cannot access the server configuration file "F:/data/postgresql.conf": No such file or directory
とのエラーメッセージを発見しましたが、該当の
F:\data\postgresql.confは存在します。
なぜでしょう?
0736NAME IS NULL
2008/06/29(日) 02:28:40ID:???元Unix系でWindowsに移植されると、あるのにNo such file... って出て悩ませるときがあるよねぇ。
ユーザpostgresに読み取りアクセス権限が設定されていないとか。
そんときゃpostgresql.confだけじゃなくて、/dateディレクトリ下の全てのファイルとディレクトリを
設定し直さなきゃだが?
0737NAME IS NULL
2008/06/29(日) 11:49:56ID:???pg_dumpallでファイルにバックアップした後リストアすると文字化けが発生してしまいます。
登録データーがSJISなのですが、OSはUTF-8 CJKになってる為と思われますが文字化けを回避する方法はありますでしょうか。
また、上記状態でpg_dumpallしてあるファイルを文字化け無しにリストアする事は出来ないでしょうか。
宜しくおねがいします。
0738NAME IS NULL
2008/06/29(日) 11:55:18ID:???バックアップ前・後のDBの文字コードは同じ?
FTPとかを利用してファイル移動とかする際に
文字化けが入ってしまう可能性は無い?
使用しているOSは?
もうちょっと情報プリーズ
0739737
2008/06/29(日) 12:21:50ID:???早速のご回答、ありがとうございます。
バックアップ前・後のDBの文字コードは同じです。
postgresはfedora上で動いており、XPからwinSCPとputtyを使ってアクセスしてますが
バックアップしておいた時点のDBを再現したいので最悪はputtyでログインして
fedoraのディスクにそのままバックアップとリストアが出来れば良いです。
出来ればwinscpでローカルのXPにバックアップ出来れば嬉しいですが…
nkf、ググって見ました。pg_dumpallしてしまったファイルに適用しても元に戻せるのでしょうか。ちょっとやってみます。
0740NAME IS NULL
2008/06/29(日) 12:24:11ID:???>FTPとかを利用してファイル移動とかする際に
>文字化けが入ってしまう可能性は無い?
記憶が曖昧なのですが、fedora上でputtyでログインし
バックアップとリストアしても文字化けした様に思います。
0741NAME IS NULL
2008/06/29(日) 12:34:07ID:???○ 記憶が曖昧なのですが、fedoraにputtyでログインし
0742NAME IS NULL
2008/06/29(日) 13:06:59ID:???そもそもDB作るときに文字コード何にした?
$ psql -U postgres -l
List of databases
Name | Owner | Encoding
------------------+-----------+----------
***** | ******** | UTF8
この一番右のEncodingの値
0743NAME IS NULL
2008/06/29(日) 13:21:10ID:???-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 NULL
2008/06/29(日) 13:42:39ID:???テストしてみた
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 NULL
2008/06/29(日) 14:38:36ID:???実験までして頂いてお手数掛けます。
>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 NULL
2008/06/29(日) 14:52:45ID:???とりあえず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 NULL
2008/06/29(日) 16:55:09ID:???やってみました
-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 NULL
2008/06/29(日) 17:45:07ID:???>多種類の文字コードだと出力出来ないのでしょうか。
DBごとにdumpしてみたらどうなのさ? もうちょと自分で思考錯誤しる。
0749NAME IS NULL
2008/06/29(日) 19:03:19ID:???0750737
2008/06/30(月) 07:50:38ID:???DB毎にdumpしてみましたが文字化けが発生している様でした。
別サーバーを立てて文字化け部分を切り出そうとしている所ですが
昨日の初書き込みから、お蔭様でだいぶ進展した感じです。
暫く自分でやって見てまた判らない事がありましたら質問させて頂きます。
本当にありがとうございました。
0751NAME IS NULL
2008/06/30(月) 16:37:15ID:???0752NAME IS NULL
2008/06/30(月) 16:40:40ID:???例えばEUC_JPで出したものをEUC_JPとして見ようとしても化けてるの?
文字化けしてると勘違いしてるだけじゃね?
0753NAME IS NULL
2008/06/30(月) 18:37:06ID:???文字列をそのままバイト配列として格納してくれるんだっけ?
新しいDBをUTFで作ってプログラム組んでSELECT->INSERTしたほうが
早そうだけなあ
0754NAME IS NULL
2008/06/30(月) 23:38:49ID:???ただ一応ダンプデータは作られたので、そのデータを元に復旧を試みた所、一部データが欠落していました。
ググッてみて文字変換の問題のような気がしたのですが、ユーザーレベルで解決する方法が分かりませんでした。
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 NULL
2008/07/01(火) 02:01:50ID:???DBがUTF-8でシェルのLANGがUTF-8じゃないとかじゃないの?
繰り返しになるけど、
環境変数のPGCLIENTENCODINGとか?
0756NAME IS NULL
2008/07/01(火) 15:37:39ID:???0757NAME IS NULL
2008/07/01(火) 16:10:24ID:???管理者が詳しければ安心
管理者が詳しくなければどのRDBMS使っても安心できない。
0758NAME IS NULL
2008/07/01(火) 16:14:23ID:???一番の問題はPostgreSQLを扱えるSIの質と数だろうけど。
0759NAME IS NULL
2008/07/01(火) 16:30:12ID:???パフォーマンス的には問題ないでしょうか?
0760NAME IS NULL
2008/07/01(火) 16:37:14ID:???0761NAME IS NULL
2008/07/01(火) 16:43:03ID:???1000人といっても、それはフロント部分の作りに大きく依存するでそ。
それだけじゃなんとも言えない罠。ただ、今現在そのシステムがOracle等で
動いているのなら、パフォーマンス的にはPostgreSQLでも動くはず
というのはいえる。
0762NAME IS NULL
2008/07/01(火) 23:30:29ID:???ありがとうございます。
確認した所下記のようになっておりました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 NULL
2008/07/01(火) 23:34:10ID:???多分pg_dumpでも同じようなことがおきてWARNING表示になったのだと思います。
0764NAME IS NULL
2008/07/01(火) 23:53:51ID:???自分の環境変数は自分で変えられるよ
export PGCLIENTENCODING=UTF-8
ってやってからpg_dumpしよう
0765NAME IS NULL
2008/07/01(火) 23:58:16ID:???記憶違いでなければ、PGCLIENTENCODINGが設定されていない場合はLANGが使用されたと思うよ。
んで、ダンプファイルを突っ込むときにエンコード周りのエラーが出た場合なんだけど、
ダンプファイルの中の set client_encoding という行がある場合はそれが
優先されているので、そこがおかしくないかチェックしてみるとよいです。
0766NAME IS NULL
2008/07/02(水) 00:15:01ID:???レスどうもです。
一応自分で構築したサーバーで>>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 NULL
2008/07/02(水) 09:25:32ID:???0768NAME IS NULL
2008/07/02(水) 10:01:57ID:???0769737
2008/07/02(水) 11:28:22ID:???今回は関係なかった様です。ありがとうございました。
>>752
EUC_JPのDBは化けてませんでした。
と言うか、SQL_ASCIIのDBを削除する為に仮に作っただけだったので、データーが殆ど入ってなかったと言うのもありますが。
追伸
SJISの文字化けで質問していた者です。他の業務が入ってしまい追試が遅くなりました。
色々やってみましたが、DBから携帯からのメールのみ削除してバックアップした所文字化けがなくなりました。
携帯の特殊文字に関連しているのかも知れません。とりあえずプログラマにその旨を伝え、対応してもらう事になりました。
時間が取れたらこちらでも詳しく調べようと思います。
ご教示頂いた皆様、本当にありがとうございました。
追伸2
4GのメモリとQuadのマザー買っちゃいました。素人が試行錯誤するには反応が早くて良いですね。
0770NAME IS NULL
2008/07/02(水) 21:56:28ID:???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 NULL
2008/07/02(水) 23:37:35ID:???PGCLIENTENCODINGが設定されてない場合の補足ですが、
下記のサイトに以下の記載がありました。
> -E encoding
> --encoding=encoding
> 指定した文字セット符号化方式でダンプを作成します。デフォルトでは、ダンプはデータベースの符号化方式で作成されます
> (PGCLIENTENCODING環境変数を好みのダンプ時の符号化方式に設定することで、同じ結果を得ることができます)。
ttp://www.postgresql.jp/document/pg812doc/html/app-pgdump.html
この文章の「デフォルトでは、ダンプはデータベースの符号化方式で作成されます」というのが、
>>770のEncodingの部分を指していると思われます。
0772NAME IS NULL
2008/07/03(木) 02:08:24ID:???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 NULL
2008/07/03(木) 03:31:45ID:???フロントエンド(psqlなりプログラミング言語なり)がエスケープする分とlikeがエスケープする分が必要。
folderPath like 'c:\\\\%'
0774NAME IS NULL
2008/07/03(木) 09:53:15ID:???0775NAME IS NULL
2008/07/04(金) 14:49:20ID:gyCCSjbuphppgadminから起動が出来ません
環境は
apache2.2/PHP5/PostgreSQL8/WindowsXP
php.iniの php_pgsql.dllの部分の;は解除してますが
phpinfoにもPostgresが出てきません
インストールが失敗しているんでしょうか?
一応 ユーザーアカウントを新しくrootとして権限をかけて作りました
Linux環境のサイトが多くWindowsの情報が無く困ってます
Phppgadminのエラー詳細は
データベースをサポートするように
PHP のコンパイル・インストールがされていません。
configure の --with-pgsql
オプションを用いて PHP を再コンパイルする必要があります。
0776NAME IS NULL
2008/07/04(金) 15:43:53ID:???PostgreSQLが使えるようにビルドしなおすか、
ビルドしたバイナリ持ってくるしかない。
0777776
2008/07/04(金) 15:49:51ID:???そして、extension_dir にちゃんと php_pgsql.dll は入ってる?
0778NAME IS NULL
2008/07/04(金) 16:09:43ID:???phpinfo();
でpgsqlのセクションが表示されなければ
たぶん、extensions_dirの設定ミス。
つか、Win32版のバイナリなら再コンパイルとか不要で、
ほとんどのオプションはphp.iniの設定変更のみで使用できる。
0779NAME IS NULL
2008/07/04(金) 18:49:06ID:???Bug #44905 PHP 5.2.6 fails to load PostgreSQL related libraries
http://bugs.php.net/bug.php?id=44905
これかな?
0780NAME IS NULL
2008/07/05(土) 20:29:39ID:???Windowsなら大人しくxampp使っておけ
http://www.apachefriends.org/jp/xampp-windows.html
MySQLとかゴミが一緒に入るけど起動しなければ無害
そしてPostgreSQLは別途インストール
0781NAME IS NULL
2008/07/09(水) 09:40:20ID:???それとも別途CREATE INDEXしなくちゃいけないの?
他のDBとごっちゃになってきた
0782NAME IS NULL
2008/07/09(水) 11:05:17ID:???つか設定したときメッセージ出るべ?
0783NAME IS NULL
2008/07/09(水) 11:26:51ID:???サンクス
メッセージはC#&Npgsqlで直接CREATE TABLE&CREATE INDEXしてたもので出なかったのよ
0784NAME IS NULL
2008/07/09(水) 11:49:02ID:???調べる基本はドキュメントでしょ。
http://www.postgresql.jp/document/pg833doc/html/sql-createtable.html
の「注釈」を読みましょう。
0785NAME IS NULL
2008/07/09(水) 15:23:31ID:???PATH設定してみては?
おれもそれっぽいのにぶつかったが、>>777の内容はクリアできてても
phpinfoでは出てこんかった。
とりあえず、PostgreSQLのbinにPATH通したら出てきたよ。
>>779の中にも同じような対処法も書いてある。
(PostgreSQLかPHPのインストーラーでうまくやれよ…と思うんだけど)
0786NAME IS NULL
2008/07/09(水) 15:44:52ID:???仮に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 NULL
2008/07/09(水) 17:44:12ID:???0788NAME IS NULL
2008/07/09(水) 18:16:49ID:???SELECT * FROM testTable WHERE mojiretu ~ '.*000[1-2]'
とか。
0789NAME IS NULL
2008/07/09(水) 21:11:13ID:???0790NAME IS NULL
2008/07/09(水) 23:22:13ID:???面倒だからいちいち突っ込まない。
0791NAME IS NULL
2008/07/09(水) 23:56:57ID:???部分一致をあいまい検索と呼ぶのは、そう呼ぶ客が少なからずいるから、気持ちはわからんでもないのだけど、
>>786の例だと後方一致なんだよなw
0792NAME IS NULL
2008/07/10(木) 02:02:04ID:???一発でDB1のデータをDB2と同一にするような方法はあるもの
でしょうか。
ご教示いただけますと幸いです。
0793NAME IS NULL
2008/07/10(木) 07:46:45ID:???0794NAME IS NULL
2008/07/10(木) 09:38:19ID:???ありません。
レプリケーションの機能は現在のPostgreSQLの弱点の一つです。
0795NAME IS NULL
2008/07/10(木) 09:38:50ID:???0796NAME IS NULL
2008/07/10(木) 09:45:59ID:???それだ!
0797NAME IS NULL
2008/07/10(木) 10:03:10ID:???postgres って正規表現一致使えたのか・・・
永らくそれっぽい検索とかに展開して激しく無駄なことしてたよ・・・
吊ってくる
0798NAME IS NULL
2008/07/10(木) 14:16:46ID:???試してみます、サンクス
>>789-791
お客さんには伝わりやすいのですが
このスレの先輩方のおかげで正式名称がわかりました
0799NAME IS NULL
2008/07/10(木) 14:27:45ID:???0800NAME IS NULL
2008/07/10(木) 16:16:31ID:???0801NAME IS NULL
2008/07/10(木) 16:30:22ID:???0802NAME IS NULL
2008/07/10(木) 21:59:56ID:???たしかに。soundexとかかと思ってしまう。
0803786
2008/07/11(金) 09:39:13ID:???データが
AAA1999
AAA2000
AAA2001
BBB1999
BBB2000
BBB2001
とあった場合
AAA1999
AAA2000
BBB1999
BBB2000
だけを引っ張るには正規表現では無理なのでしょうか?
0804NAME IS NULL
2008/07/11(金) 09:56:52ID:???0805NAME IS NULL
2008/07/11(金) 09:59:58ID:???0806NAME IS NULL
2008/07/11(金) 12:39:25ID:OI85zmOhSIMILAR TO '%(1999|2000)%'
+その他じゃ だめ?
ttp://www.postgresql.jp/document/pg833doc/html/functions-matching.html
0807NAME IS NULL
2008/07/11(金) 12:46:55ID:???0808NAME IS NULL
2008/07/11(金) 13:11:48ID:???0809NAME IS NULL
2008/07/11(金) 13:15:57ID:???データが固定的ですいません
文字列3桁 + 数値4桁
このフォーマットでtextフィールドに入れています。
文字列3桁の部分の文字列はlikeなどの一致検索?で
数値4桁の部分の文字列は>=や<=で範囲検索したいのです。
正規表現は一致検索?タイプなので範囲検索には使えないのかなぁ
と思った次第です。
文字列フィールドを>=や<=するのはよくない気がするのですが
実際範囲検索できるので・・・
0810NAME IS NULL
2008/07/11(金) 13:22:54ID:???別々の情報なら最初から同じ所に詰め込まない方が良い気もするけど。
0811NAME IS NULL
2008/07/11(金) 13:37:35ID:???> 別々の情報なら最初から同じ所に詰め込まない方が良い気もするけど
いえ別々のデータというよりは
本の後ろに書いてあるような
ISBN978のような書籍コード?なのです
substringを使用して実現可能なのでしょうか?
発想が貧困なためイメージがわきません・・・
このようなSQLを妄想していたのですが
select * from testTable where mojiretu >= '%0001' and mojiretu <= '%0002'
0812NAME IS NULL
2008/07/11(金) 13:46:52ID:???文字列3桁 + 数値4桁
を
substring
で分けて(ry
0813NAME IS NULL
2008/07/11(金) 13:58:24ID:???数値4桁の部分をsubstringして>=、<=するということですか?わかりません><
select * from testTable where substring(mojiretu, 4, 4) >= '0001' and substring(mojiretu, 4, 4)<= '0002'
0814NAME IS NULL
2008/07/11(金) 14:04:29ID:???substring(mojiretu,4,4) between '1999' and '2000'
0815NAME IS NULL
2008/07/11(金) 14:12:20ID:???0816NAME IS NULL
2008/07/11(金) 14:17:14ID:???試してみます!サンクス!
0817NAME IS NULL
2008/07/11(金) 17:21:18ID:???0818NAME IS NULL
2008/07/11(金) 19:21:52ID:m/805UHa8.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 NULL
2008/07/11(金) 20:22:35ID:???0820sage
2008/07/11(金) 20:28:02ID:m/805UHaどもです。なんか8.3.3は-Eオプションは無いみたいです。
やってみると
pg_restore: invalid option -- E で pg_restore--helpにもありませんでした・・・
$ pg_restore --version は pg_restore (PostgreSQL) 8.3.3 です。
0821NAME IS NULL
2008/07/11(金) 20:32:25ID:???ダンプの時もEUC_JPにしてる?
0822820
2008/07/11(金) 20:53:13ID:???>>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 NULL
2008/07/11(金) 21:07:57ID:????
EUCじゃねーの?
0824NAME IS NULL
2008/07/12(土) 02:13:54ID:???0826820
2008/07/12(土) 14:19:58ID:keLDNTOSやはりうまく行っていませんでした。
念のため新旧両方のマシンで日本語の表示を確認しましたが
問題なく表示されます。
別のDB(EUC)をリストアしてみたのすが、これも表示がおかしい
のでやはり手順に問題があるのでしょうね。
何か考えられることありますでしょうか・・・?
0827NAME IS NULL
2008/07/12(土) 15:50:50ID:???プロトコル互換てありますでしょうか?
事例、調べ方とかでもOKです。
同じように、
ver7のlibpqを使っているPHPがあるのですが、
ver7のlibpqからver8.3サーバの互換についても
お願いします。
※sh、PHPにてver7、8を共存させたい
0828NAME IS NULL
2008/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 NULL
2008/07/13(日) 10:42:19ID:???自己レス
なんか、プライマリーキーがこわれて重複レコード(キー)が存在しているとう現象があったというURLを
みつけたので
そういうことにしようと思います。
当面、物理的な削除をやめてみます。
0830NAME IS NULL
2008/07/13(日) 17:17:29ID:???0831NAME IS NULL
2008/07/13(日) 17:32:59ID:???以外の操作で変更できてしまうからな。
勝手な値でinsertとかupdateされたんじゃないの?
0832NAME IS NULL
2008/07/14(月) 00:36:41ID:???どっかに良いテンプレート公開している所ありませんか?
0833NAME IS NULL
2008/07/14(月) 06:06:42ID:???レスありがと。
3回くらい、ERRORになったあと、追加できるようになりまして、テストのときから見なかった現象なので・・・。
再現したら、考えます。
0834NAME IS NULL
2008/07/14(月) 12:20:06ID:???今あるテーブルを計測するなら
>>387
レコードあたりのバイト数から算出するExcelとかが欲しいならしらにゃい
0835NAME IS NULL
2008/07/14(月) 21:05:46ID:???0836NAME IS NULL
2008/07/18(金) 04:13:24ID:trTm/p1Rこれまでグループごとのデータ件数を次のような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 NULL
2008/07/18(金) 04:53:33ID:???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;
0838836
2008/07/18(金) 13:50:35ID:Qo8rMDkVありがとう!やってみます。
0839NAME IS NULL
2008/07/22(火) 01:25:40ID:???[ 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 NULL
2008/07/24(木) 14:01:20ID:???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 NULL
2008/07/24(木) 14:10:30ID:???pg_ctl の表示の仕方がかわっただけでしょう。
試しに同じDBで、8.31の環境で新しいpg_ctl使ったら server、8.2のpg_ctl使ったら postmaster と出ましたよ。
ps で見てみるのが確実かもね。
0842840
2008/07/24(木) 14:24:02ID:???「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 NULL
2008/07/24(木) 14:39:24ID:mBwHhXoVpg_ctlなんかはそれに合わせて作り直されているけど、起動スクリプトなんかは
postmasterを呼び出すままになってるだけなんじゃ。
postmasterが廃止方向なのは、MTAがらみと混同してしまうからかな?
今更のような気もするけど。
0844NAME IS NULL
2008/07/24(木) 15:11:53ID:???0845NAME IS NULL
2008/07/24(木) 21:33:50ID:Z/swGqhj経験無いから、購入迷ってるんだけど
それとも、他にいい本ありそう?
0846NAME IS NULL
2008/07/25(金) 00:53:18ID:???それもあった。他に、シンボリックリンクをサポートしていない
Windows版で、インストーラのサイズを小さくするためもあったような。
postgres と postmaster の同一バイナリを2つ含んでいるのは無駄だったから。
0847NAME IS NULL
2008/07/25(金) 02:10:54ID:???0848NAME IS NULL
2008/07/29(火) 22:09:41ID:???0849NAME IS NULL
2008/07/29(火) 22:10:24ID:WgByyyeH0851NAME IS NULL
2008/08/01(金) 11:22:34ID:Vlj4h0JMRelation "t_table" with OID 68308374 no longer exists
って出るようになっちっち。( TДT)
調べたらキャッシュのOIDと違うようなんだけど、どうすればキャッシュのクリア。
もしくは整合性をとれるようになりますか。
教えてエロい人。
0852NAME IS NULL
2008/08/01(金) 13:15:46ID:???自己レスです。
エラー文出てたのは、clusterしたテーブルのviewテーブルをselectした時だったのですが
viewテーブルをDROPしてcreateしなおしたら、エラーでなくなりました。
すんません。
0853NAME IS NULL
2008/08/01(金) 19:35:11ID:???やけにバージョンが古くないか?
最近のならそれくらいではエラーにならないと思うんだけど。
0854NAME IS NULL
2008/08/02(土) 15:35:04ID:IADhYOwnここの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 NULL
2008/08/02(土) 16:53:51ID:/jmwO2I5SELECT * FROM gamelist JOIN brandlist ON gamelist.brandname=brandlist.id
0856NAME IS NULL
2008/08/02(土) 18:27:26ID:???ありがとうございます。
やっと思い通りにリストアップする事ができました。
0857NAME IS NULL
2008/08/03(日) 19:00:59ID:et0fI5Cl鯖は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 NULL
2008/08/04(月) 08:15:39ID:???サーバエンコーディングとOSのエンコーディングを一致させている環境でないとダメ。
特に、鯖にSJISが使えないので、Windowsでは無理なのです。昔からある不具合。
0859NAME IS NULL
2008/08/04(月) 09:55:32ID:???一番メジャーな方法は何でしょうか?
0860NAME IS NULL
2008/08/04(月) 09:56:54ID:Qg+jh4KyNpgsqlでいいんじゃね。
0861NAME IS NULL
2008/08/04(月) 10:01:40ID:???ありがとうございます。試してみます。
0863NAME IS NULL
2008/08/07(木) 15:14:49ID:???構成はINSTALL_PGCLUSTER通りの、LBx1,RPx1,CLx2で、OSはCetnOS4です。
debugログを見ると、dropdb時にpglbをHUPしているようなのですが、その後おかしくなっているみたいです。プロセスは残っていますが、pglbのpidファイルは削除されてます。
その状態でも、直接ClusterDBには正常に接続できますし、レプリケーションも機能します。
pgpool-3.4.1をpglbの元にしているバージョン以降での現象のようですが、同じ現象を経験された方や、解決方法をご存知の方いらっしゃいますか?
0864NAME IS NULL
2008/08/09(土) 12:10:53ID:???なんでWindowsだとこんなに遅いの?
0865NAME IS NULL
2008/08/09(土) 14:30:37ID:???Windowsのほうが遅いのは確かだけど、それは差がつきすぎな気が。
チューニングしていないなら、WAL関係だけでもやってほうが良いかも。
(checkpoint_segments, wal_sync_method)
まぁ、性能が必要ならWindows版は避けたほうが無難。
ちょっと機能を試すだけならお手軽で良いんだけど。
0866NAME IS NULL
2008/08/10(日) 23:13:39ID:???基本的な考え方を教えて下さい。
webで探すとtext型を推奨するような書き込みもありますが、
お互いで得手不得手な事があるのでしょうか?
0867NAME IS NULL
2008/08/10(日) 23:46:39ID:???DB側で文字数の制限およびチェックが必要かどうかだけ。
と思ってる。
0868NAME IS NULL
2008/08/11(月) 04:43:15ID:???それでOK。実装はまったく一緒だし。
管理ツールで表示が違う場合はあるかも。
varcharは1行テキストボックス、textは複数行テキストボックスとか。
0869NAME IS NULL
2008/08/11(月) 11:05:33ID:JHhGIW9sDBの文字コードは何を指定したらいいのでしょうか。
http://www.apple.com/jp/pro/design/typography/05/index6.html
を読んでいると、全てを文字コードで格納するのは不可能とも読み取れますが・・
UTF-8にしておくのが一番いいのでしょうか?
0871NAME IS NULL
2008/08/12(火) 07:29:17ID:???表現できなきゃ、バイナリデータとして格納とか。
0872NAME IS NULL
2008/08/16(土) 12:56:12ID:iPeeVtKyそれ、おれもなった。
結局解決つかなかったからpgpool使ったよ。
0873NAME IS NULL
2008/08/18(月) 04:35:12ID:rrvhCdtj1台を通常運用、ある一定時刻がきたらデータをすべて
2台目のDB鯖に写しアプリからもデータ更新不可・2台目の鯖接続というように処理させ
1台目のVACUUM処理終了後、通常運用に戻るというような
運用はありでしょうか?
何かネックになりそうなことはありますでしょうか?
0874NAME IS NULL
2008/08/18(月) 06:17:41ID:???どうやって1台目に反映させるの?
0875NAME IS NULL
2008/08/18(月) 06:48:38ID:???2台目の鯖運用時は参照のみに利用し、更新は行いません。
ということです。
0876NAME IS NULL
2008/08/18(月) 08:11:16ID:???特に問題はないと思う。2台目のデータは毎回捨てるってことだよね?
ただ、目的がVACUUM中の性能低下を回避するだけならば、
サーバ間のデータコピーが本当にVACUUMより軽いか調べたほうが良いかも。
0877NAME IS NULL
2008/08/18(月) 08:50:25ID:???バキュームしたい時、意図的に切断しとけば?
0878NAME IS NULL
2008/08/18(月) 16:14:41ID:???レスありがとうございます。そちらの環境でもなりましたか。
すぐ気付きそうな現象ですから、情報が出ていてもよさそうなもんですが、無いんですよね。
2008-03-09以降リリースのバージョンで、pglbのdropdb上手くいっている人いましたら、是非環境を伺いたく。
0879NAME IS NULL
2008/08/19(火) 00:12:40ID:qDOKASZtID+UNIQUE制約に変更したいときに、
既存データにID値を振りなおす(採番する)のって
serial型をADD COLUMNするだけで行けます?
日本語わかりにくかったらごめんなさい。
0880NAME IS NULL
2008/08/19(火) 08:51:25ID:???カラム追加だけだと中身がNULLじゃね?
0881NAME IS NULL
2008/08/19(火) 10:02:35ID:???シリアル追加だけじゃ何も入らない。
0882NAME IS NULL
2008/08/19(火) 10:21:33ID:???実はその新規連番付与にも複雑な法則性が…
なんて後出しが来ないことを祈るwww
0883881
2008/08/19(火) 10:34:12ID:???今試したら、しっかり番号入ってる。
すみません、ALTER TABLE table ADD COLUMN no SERIAL;
だけで入ってました。8.1.4ですが
0884NAME IS NULL
2008/08/20(水) 01:18:01ID:???WebサーバーのPostgreSQL へVB.NET または、VB6での接続は可能でしょうか?
可能であれば、その方法をご存知の方いましたら、教えて下さい。
WebサーバーへのODBC接続は試みましたがうまくいきませんでした。
0885NAME IS NULL
2008/08/20(水) 07:57:05ID:???ODBCでも良いし、Npgsqlでも良いし、お好きな方法で。
事象の報告もなしに「うまくいきません」といわれても、これ以上のアドバイスは無理。
0886NAME IS NULL
2008/08/20(水) 08:39:19ID:???「WebサーバーへのODBC接続」
文脈から理解できるが言葉の意味をしっかり押さえるべき
0887NAME IS NULL
2008/08/20(水) 09:52:09ID:???まず、開発用PC(Win?)からWebサーバ上のPostgreSQLにODBC接続可能かどうか試しましょう。
OKならVB6ならADODB、VB.NETならADO.NETで接続可能なはず。
ADO.NETではODBC接続は速度的に使いものにならないからNpgsqlが無難だね。
0888NAME IS NULL
2008/08/21(木) 00:13:36ID:???みなさん、ご教授ありがとうございます。
できるようになりました。
ポートが空いていなかったのが原因でした。
できれば、必要なポートだけを開けたいのですが、
PostgreSQLで必要な5432など以外に何が必要なのでしょうか?
0889879
2008/08/21(木) 02:16:48ID:???ありがとうございます。
実際に試せるのはもうちょっと先になるんですが
ハードが物理的におかしくなってそれどころじゃなくなって
泣きそうです ><
0890NAME IS NULL
2008/08/21(木) 17:41:24ID:???標準では5432tcpだけあけとけば問題ないよ
> PostgreSQLで必要な5432など以外に何が必要なのでしょうか?
これはPostgreSQL以外で必要となるポートと言ってますか?
0891NAME IS NULL
2008/08/22(金) 18:49:17ID:???888ですが、
5432だけで、いいのですか。
ありがとうございます。
今のところ、それだけでは、うまくいきませんが、試行錯誤してみます。
0892NAME IS NULL
2008/08/22(金) 19:00:47ID:???0893NAME IS NULL
2008/08/23(土) 23:17:25ID:???ありますが,そもそもビットマップとは何なのでしょうか?
windowsのビットマップ画像でないと思うのですが,それではいったい何を示しているのか
わかりません
わかる方いたらお願いします
0894NAME IS NULL
2008/08/24(日) 07:41:58ID:???0895NAME IS NULL
2008/08/25(月) 12:46:22ID:???0896NAME IS NULL
2008/08/28(木) 19:53:10ID:???別マシンから接続すると、
psql: could not open certificate file "/home/orca/.postgresql/postgresql.crt": そのようなファイルやディレクトリはありません
となってしまいます。
このファイルは、どういうタイミングで作られるんでしょうか?
0897NAME IS NULL
2008/08/28(木) 23:25:43ID:???>>888でできるようになりました、と書いているが、>>890でうまいくいきませんと書いているわけで、
何ができて何ができていないのかが伝わってこないのが現状です。
よくわからんので、Webサーバの80tcpを開けてみたら?
>>896
SSL関連のように思うが、それは意図的にそういう接続を?
0898NAME IS NULL
2008/08/29(金) 08:58:19ID:???>SSL関連のように思う
とあるソフトのインストールを、手順書の(OSのインストール手順からある)通りにやっていたんですが、
SSLの設定の事は何処にも書いてないんで、Postgerの問題かと思ったのです。
SSLのセットアップから試してみます。
0899NAME IS NULL
2008/08/29(金) 18:03:21ID:???行ロックを掛けつつタイムアウトを設定するには
どうすればいいでしょうか?
0900NAME IS NULL
2008/08/30(土) 05:40:20ID:???それ、タイムアウト設定じゃなくて
ロックされてたら待機するかエラー返すかのオプションだろwww
PostgreSQL8.1あたりからNO WAITが使えるようになった、
ってことは、これまでのはWAITだったってことだ。
0901NAME IS NULL
2008/08/30(土) 09:41:07ID:???すみません。ちょっと説明不足でした。
oracleはselect for update wait 10
とすると10秒待機してエラーになります。
このような設定はないでしょうか?
0902NAME IS NULL
2008/08/30(土) 10:02:33ID:???SQLだけでやりたいなら、statement_timeoutと組み合わせるのかな。
BEGIN;
SET LOCAL statement_timeout = '10s';
SELECT ... FOR UPDATE;
0903NAME IS NULL
2008/08/30(土) 10:17:50ID:???おぉ!
さんくす。
0904NAME IS NULL
2008/09/03(水) 17:54:16ID:???# 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 NULL
2008/09/03(水) 21:03:59ID:???仕様だな。
# 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 NULL
2008/09/03(水) 21:25:38ID:???その結果だけを見ると、単に当日を含むか含まないかの問題のように見えますが
問題はそうじゃないんですよね。
# 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 NULL
2008/09/03(水) 23:19:12ID:???0908NAME IS NULL
2008/09/03(水) 23:20:58ID:???0909NAME IS NULL
2008/09/03(水) 23:29:13ID:???日数を出すだけで良いなら、最初からそうしますって。
関数ないかなーって探して見つけたと思ったら、上記の
結果だったので、使えない関数だなぁと思って。
誰も問題視してないんでしょうかね。
少なくとも違う日で同じ差分が出るのは問題でしょ。
仕方ないので関数を自作します。
>>908
無理にっていっても、単なるキャストとかじゃなしに、
専用の関数ですよ。内部でどうにでもなるじゃないですか。
0910NAME IS NULL
2008/09/03(水) 23:48:28ID:???0911905
2008/09/04(木) 01:10:58ID:???あーなるほど、今まで気づかなかった。
マニュアルより
> 異なる月では日数が異なりますのでageで返されるmonthsにはあいまいさがあります。
> PostgreSQLのやり方は月にまたがる2つの日付の計算において、日付の早いほうの月を使用します。
今まで気づかなかったくらいだから、それほど困る場面に直面するわけでもなさそうだが、
頭の片隅においといた方が良さそうね。
0912NAME IS NULL
2008/09/04(木) 02:27:58ID:???なにー、マニュアルに書いてあったんですか。
http://www.postgresql.jp/document/pg833doc/html/functions-datetime.html
の 9.9.1 の直前ですね。age 関数の説明までしか見てませんでした。すみません。
それなら、完璧に仕様ですね。諦めて自作で進めます。
0913NAME IS NULL
2008/09/04(木) 04:14:41ID:???論理的な意味を失うと思うんだが。
0914NAME IS NULL
2008/09/04(木) 08:25:36ID:???用途に応じて使い分ければ良いのでは。
確かに age のほうは使い道がビミョーだが。
0915NAME IS NULL
2008/09/04(木) 12:04:55ID:???このageみたいな定義で計算することになっているところがあるのかも。
0916NAME IS NULL
2008/09/08(月) 21:48:18ID:hDzPVYxs「サービス開始」を実行するとエラーになります。
エラーが起こりました:
Failed to start server pgsql-8.0: Errcode=1069
Check event log for details.
のエラーメッセージが出ます。インストールしたフォルダ
D:\Program files\PostgreSQLやそのサブフォルダの中から該当するログファイルを探して
原因を調べようとしたけど、更新日付が今日のファイルが見つからないし、全くどうなって
るのかわかりません。
前はサービスが開始してて動いてたはずなのに、何でエラーになるんでしょうか。
0917NAME IS NULL
2008/09/08(月) 22:41:10ID:???event logはWindowsの機能。
コンパネ>管理ツール>イベント ビューア
で見てみて。
0918NAME IS NULL
2008/09/12(金) 01:38:47ID:???・非E''構文で、
DB内の改行文字(その他エスケープ構文)を検索することは出来ない、ですか?
「nonstandard use of escape in a string literal」の警告消したくて試してたら
こっちが気になりました。
(警告は消えたし改行文字を検索したい場面も
無い気はしますが知識として気になったので)
0919NAME IS NULL
2008/09/12(金) 02:33:30ID:???\\nでは?
0920918
2008/09/12(金) 23:41:09ID:???自己解決しました。
エスケープ系は不可ですが、
改行文字自体を検索キーにすればヒットしますね。(当たり前w)
>>919
・standard_conforming_stringsがON
・非E''構文
だと、「\\n」は「\\n」という文字に対してのみマッチします。
(\が特殊な意味を持たなくなるので
where hoge = '\' みたいな時にエラーにならない)
※他人に講釈するほど詳しくないので違ってたら指摘ヨロ
0921NAME IS NULL
2008/09/20(土) 19:10:36ID:???0922NAME IS NULL
2008/09/21(日) 00:16:16ID:???おまえの脳が一番の不安定要因だから心配するな
0923NAME IS NULL
2008/09/21(日) 00:41:19ID:???0924NAME IS NULL
2008/09/21(日) 05:10:09ID:???0925NAME IS NULL
2008/09/21(日) 09:53:04ID:???0926NAME IS NULL
2008/09/21(日) 09:55:23ID:???0927NAME IS NULL
2008/09/21(日) 11:41:06ID:???0928NAME IS NULL
2008/09/21(日) 12:10:34ID:???0929NAME IS NULL
2008/09/21(日) 12:26:29ID:???0930NAME IS NULL
2008/09/21(日) 23:01:14ID:???見つかるときは全バージョンで修正が入るような。
新しいからといって不安定なようには見えない。
0931NAME IS NULL
2008/09/22(月) 01:33:55ID:???0932NAME IS NULL
2008/09/22(月) 16:18:02ID:???0933NAME IS NULL
2008/09/22(月) 22:27:49ID:???0934NAME IS NULL
2008/09/24(水) 02:08:48ID:32cC4wGgけっこうバグが修正されてるぽ。
0935NAME IS NULL
2008/09/24(水) 02:54:11ID:???0936NAME IS NULL
2008/09/24(水) 08:05:31ID:???急いでバージョンアップしなくてもよさそうだけど
週末あたりにやるか。
0937NAME IS NULL
2008/09/26(金) 05:32:04ID:J6N79vWqレコード内の1フィールドにnextvalを適用する方法はないのでしょうか。
name, counter
yamada, 3
tanaka, 10
suzuki, 20
nameを指定してcounter部分をインクリメントさせたいのです。
0938NAME IS NULL
2008/09/26(金) 07:11:05ID:???ふつうにUPDATEしたら?
UPDATE tbl SET counter = counter + 1 WHERE name = 'yamada';
0939NAME IS NULL
2008/09/26(金) 10:08:57ID:???トリガーでnameに応じてシーケンスを使い分ける
0940NAME IS NULL
2008/09/26(金) 16:42:46ID:UeZFxsYqリコンパイルする必要があるのでしょうか?
或いはリコンパイルする必要があるか確認する方法はありますでしょうか?
リコンパイルする必要がないのでしたらどのようにしたら
BDBテーブルが作れるようになる設定や環境などあるのでしょうか?
現状create tableでTYPE=BDBを指定してもエラーにはならないのですが
出来上がったテーブルはMyISAMになってしまいます。
0941NAME IS NULL
2008/09/26(金) 16:43:47ID:UeZFxsYq0942NAME IS NULL
2008/10/02(木) 17:24:01ID:???ttp://www.postgresql.org/about/news.1013
0943NAME IS NULL
2008/10/02(木) 17:42:49ID:???0944NAME IS NULL
2008/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 NULL
2008/10/03(金) 17:25:08ID:???#include っつーか、ちゃんと #define される条件(#ifdef)になってるの?
0946NAME IS NULL
2008/10/03(金) 17:37:47ID:???レスありがとう。
ごめん、C言語はよく解らない・・・
コンパイルするソース(pgpool-recovery.c)には
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
っていう記述がある。
これでできた共有オブジェクトを各データベースノードに持っていってるんだけど・・・
0947NAME IS NULL
2008/10/03(金) 17:49:17ID:???/usr/local/pgsql/include/server/fmgr.h の中ではdefineされてる?
0948NAME IS NULL
2008/10/03(金) 18:01:34ID:???defineされてた!
今Postgresqlのインストールディレクトリが、/usr/local/postgres-8.3.3ってなってるから、includeディレクトリが見えてないのかな?
ちょっとコンパイルしなおしてみる!ありがとう!
0949946
2008/10/03(金) 18:33:51ID:???解った!
コンパイル結果をよく見てみると
usr/include/pgsql/server -I/usr/include/pgsql/internal
っていうメッセージが出てる!
ここのヘッダファイルには全然PG_MODULE_MAGICが定義されてなかった!
何とかしてinclude先を変えられればうまく行きそう!
0950NAME IS NULL
2008/10/03(金) 18:38:38ID:???頻繁にソースから入れる人には邪魔かもな。
0951NAME IS NULL
2008/10/03(金) 19:00:25ID:???yum --remove postgresql-devel 的なかんじで。
0952946
2008/10/03(金) 20:07:49ID:???無事に解決できました!
皆さん本当にありがとうございました!
結果的に、コンパイル時にMakefileの中で発行されているpg_config --pgxsが、OSインストール時に
入っていた古いPostgreSQLのpg_configでした。
>>951のアンインストール(yum remove postgresql)を実施して、ちゃんとPostgreSQL8.3のpg_configに
パスを通す事でちゃんとC言語関数がインストールできました。
何か皆さんが的確に原因を指摘してきてくれた事に感動しました!
0953951
2008/10/03(金) 20:11:19ID:???おめでとう!
けれど、アンインストールした状態で (一応/usr/include/pgsql がないことを確認して)
あらためてconfigure する方がいいよ
状態に応じて最適なMakefileを作ってくれるのがconfigureなので。
0954NAME IS NULL
2008/10/04(土) 19:17:29ID:DCYl0+1jCentOS5.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 NULL
2008/10/04(土) 19:22:28ID:???8.1 を使ったことがある(データがある)かないかにもよるけど?
0956NAME IS NULL
2008/10/04(土) 20:23:23ID:???で新しいスペースを確保して
pg_ctl -D その新しいディレクトリ start
で動作させてみては ?
0957NAME IS NULL
2008/10/06(月) 11:26:00ID:???>>956の通りなんだけど、
データベースの場所は、環境変数PG_DATAに設定されていて、
PG_DATAの場所に以前のdbが残ってるってこと。
いらないデータならいったん消してinitdbしなおせばいいし、
場所移したいなら>>956のように新たにinitdbすればい。
PG_DATAはデフォルトだと、、、PG_HOME/dataつまり /usr/local/pgsql/data のままなんじゃないかな?
0958NAME IS NULL
2008/10/13(月) 23:51:37ID:fi3Aq2C+PostgreSQL 7.3について教えていただきたいことがあるのですが、
VACUUM FULLを行い、時間がかかりすぎているため、中断したいのですが
その場合やはり不具合などはおきてしまうのでしょうか?
明日の朝5:00までにシステムを稼動させないといけないため、
あせっております。。
詳しい方いらっしゃいましたら、お願いいたします。
0959NAME IS NULL
2008/10/14(火) 00:04:45ID:???0960NAME IS NULL
2008/10/14(火) 00:05:05ID:???せめてMLに投げろよ。
お金を払ってる会社が可哀想です。
0961NAME IS NULL
2008/10/14(火) 00:07:14ID:???0962NAME IS NULL
2008/10/14(火) 00:12:11ID:???あっちをみていて、こっちを見ている人も多いだろうから
まあそういうものと思って優しい人が出てきてくれるだろう。
0963NAME IS NULL
2008/10/14(火) 00:23:58ID:???これ以上優しい回答は出てこんよ多分
0964NAME IS NULL
2008/10/14(火) 00:47:09ID:7sacMnBxvacuum処理がなんとか終了しました。
10時間以上かかっていたので、同様してしまいました。
お騒がせしまして申し訳ありません。
0965NAME IS NULL
2008/10/14(火) 00:54:13ID:???0966NAME IS NULL
2008/10/14(火) 01:17:47ID:???0967NAME IS NULL
2008/10/14(火) 01:23:06ID:???でも毎週やれば長くても数十分で終わるけどね
0968NAME IS NULL
2008/10/14(火) 01:50:49ID:???業務システムだとそうそうバージョンアップできないのは確かだけどさ…
0969NAME IS NULL
2008/10/14(火) 02:56:05ID:???0970NAME IS NULL
2008/10/14(火) 03:24:45ID:???早いんじゃないか? もちろん、ストレージが必要になるけど。
0971NAME IS NULL
2008/10/14(火) 03:33:57ID:???フォーマットからした方が良いかも。
0972NAME IS NULL
2008/10/14(火) 03:57:31ID:???0973NAME IS NULL
2008/10/14(火) 22:56:41ID:???ちょっと知りたい気がする。
どれくらい放置してたのかも。
0974NAME IS NULL
2008/10/14(火) 23:05:33ID:???さらにメモリ少なくてスワップしまくりとか。
0975NAME IS NULL
2008/10/14(火) 23:26:02ID:???0976NAME IS NULL
2008/10/14(火) 23:37:13ID:???数百GB/十数億レコードのDBだけど、丸一日かかるよ。
0977NAME IS NULL
2008/10/14(火) 23:47:59ID:???何管理してんだろう?postgresqlもがんばれるものだね。
0978NAME IS NULL
2008/10/15(水) 01:22:01ID:???0979NAME IS NULL
2008/10/15(水) 09:54:05ID:???0980NAME IS NULL
2008/10/15(水) 20:57:50ID:???0981NAME IS NULL
2008/10/15(水) 21:46:25ID:???近年の技術者の技術力低下の原因でもあるんだよな
無駄が多くてもハードとミドルで吸収しちゃうから作るソフトがクソになりやすい
選択肢がSQLチューニングしかないという状況をクリアして経験値積まないといかんよね
0982NAME IS NULL
2008/10/15(水) 21:59:36ID:???0983NAME IS NULL
2008/10/15(水) 22:03:43ID:???事前集計、事前結合が脈絡なく多用される糞設計になるのがオチ。
0984NAME IS NULL
2008/10/15(水) 22:22:23ID:HojZLdydWebアプリにカウンター機能を持たせているのですが、ちょっと疑問に思ったことが
あるので質問させてください。
/app/indexにアクセスがくるとcounter tableのカラムのtodayの値を1増加させるのです
が、増加させる度にHDDにアクセスしているのでしょうか?
頻繁に更新のあるテーブルでもテーブルのレコードの値を変更する度にHDDにアクセスす
るようだと無駄が大きい気がするのですが、PostgreSQLではどのタイミングでHDDにアク
セスするのかご存知の方はおられないでしょうか?
もしおられましたら参考サイト・書籍などを紹介していただけないでしょうか?
0985NAME IS NULL
2008/10/15(水) 23:40:25ID:???http://www.postgresql.jp/document/pg834doc/html/app-postgres.html
ただ、チューニングするときは基本実測して、どこがボトルネックなのかを調べてからがいいよ。
0986NAME IS NULL
2008/10/16(木) 00:18:10ID:???PostgreSQLに限らず、基本的にはDBMSがチェックポイントっていうのを勝手に発行した
タイミングだよ。
タイミングは各DBMSの各バージョンによってそれぞれ変わってくる。
プログラムからDBにINSERTした直後はまだメモリの中。チェックポイントが走って初めて
ディスクに書き込まれる。
ただ、カウンタぐらいならそんな意識しなくても問題ないはず。
0987NAME IS NULL
2008/10/16(木) 01:41:11ID:???0988NAME IS NULL
2008/10/16(木) 01:56:32ID:???要求からするとトランザクション単位で設定できるこっちの方がいいか。
>>986
postgresqlのデフォルトはそうじゃない
0989NAME IS NULL
2008/10/16(木) 03:52:07ID:???commit_delayとかもあったと思うけど
0990984
2008/10/16(木) 23:48:24ID:???私も自分で調べていて、どのDBでも最初はメモリに更新内容を蓄えておいて
ある瞬間になったらディスクアクセスするというような記述がありました。
DBの内容を変更するために毎回HDDにアクセスするか、メモリに書き込んで
キャッシュしておくかは設定次第ということも分かりました。
さらにはメモリのキャッシュ量まで設定できると知って驚きました。
また何か疑問に思ったことがあれば聞きにきます。
0991NAME IS NULL
2008/10/17(金) 02:56:29ID:???> 私も自分で調べていて、どのDBでも最初はメモリに更新内容を蓄えておいて
> ある瞬間になったらディスクアクセスするというような記述がありました。
そんなはずは。突然マシンが死んでも、コミットが完了したものについては
ディスクに書き込まれている事を保証する、というのが昔のイメージだった。
だからpostgresqlだってデフォルトでfsyncがonなんだろうし。
0992NAME IS NULL
2008/10/17(金) 03:46:58ID:???マニュアルじゃなく、その辺のサイトに書いてたことを鵜呑みにするくらいなら
こんなとこに来なくていいのに。
0993NAME IS NULL
2008/10/17(金) 04:33:41ID:???驚くなよ
conf見りゃ解るだろ
0994NAME IS NULL
2008/10/17(金) 17:09:42ID:???2chのレスよりその辺のサイトに書いてあることを信用するというのは
正しい姿勢かもしんまいw
0995NAME IS NULL
2008/10/18(土) 17:36:30ID:???PostgreSQL Part.6
http://pc11.2ch.net/test/read.cgi/db/1224318817/
0996NAME IS NULL
2008/10/18(土) 17:44:19ID:???0997NAME IS NULL
2008/10/18(土) 20:42:36ID:???0998NAME IS NULL
2008/10/18(土) 20:50:04ID:???0999NAME IS NULL
2008/10/18(土) 20:51:09ID:???1000NAME IS NULL
2008/10/18(土) 21:53:08ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。