初めて投稿させて頂きます。
過去に、PostgreSQL 7.4.6(Linux 2.6.9-5.EL)の環境で、データ監視系のシステムを構築しました。稼働してから数年が経過しています。
このシステムのDBには数十のテーブルがあり、期待通りに動いています。
ただ、一つのテーブルのみ、時間が経過の経過と共にselectが恐ろしく遅くなる現象が発生しています。
そのテーブルのスキーマは以下です。
=# \d node_condition;
Table "public.node_condition"
Column | Type | Modifiers
------------------+-----------------------------+-----------
node_id | integer |
checktime | timestamp without time zone |
ping | boolean |
rtt | real |
cpu | real |
loadavg | real |
mem | real |
disk | real |
snmp_w | integer |
ip_w | integer |
serv_w | integer |
licence | integer |
f_licence | integer |
version | text |
web_ver | text |
sync | boolean |
errchecktime | timestamp without time zone |
ipwatchtime | timestamp without time zone |
servwatchtime | timestamp without time zone |
nmsdlasttime | timestamp without time zone |
filemakelasttime | timestamp without time zone |
現在入力されているデータ数は51ラインです。
設計上、このテーブルは約1分間に51回updateが行われます。
主に時間系の更新です。
他のテーブルと違うところは、カラム数が少し多い、updateが頻繁に実行される、というくらいです。他のテーブルは多くても12カラムで、子のような現象は出ていません。
SQL(select)は至ってシンプルで、このテーブルしか参照しません。(select node_id,checktime ... from node_condition;)
構築時の応答速度は至って普通だったのですが、昨年の夏に異常に遅くなっていることが判明しました。
その時は、データを退避してからテーブルをDROPしてcreateし直すという荒業で解決したのですが、先日また異常に遅くなっている事に気づきました。
(この時点で原因を潰すべきだったのですが、忙しくて強引にやってしまいました。ちなみに、その時VACUUM,ANALYZEはやったのですが、効果がありませんでした。また、このシステムではVACUUM,ANALYZEが定期的に実行されています。)
postgresはupdateのアルゴリズムは、他のRDBMSと違うような事が書いてありましたが、カラム数が多くなると挙動に影響が出るのでしょうか。どなたか詳しい方がいましたら、ご教授頂けると助かります。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
定期的にVACUUMを実行しているにも係わらず、時間の経過とともに51件しかデータの格納されていないテーブルのSELECTが遅くなるとしたら、空き領域マップ(FSM)のページ数が不足していることが原因として考えられます。
FSMのページ数が不足していると、VACUUMを実行してもUPDATEで発生したゴミの領域を再利用できるようにならず、どんどんテーブルファイルが大きくなって性能が低下します。
VACUUMの実行時にVERBOSEオプションを指定すると、必要なページ数が表示されます。そのページ数がpostgresql.confファイルのmax_fsm_pagesパラメータの値よりも大きければビンゴです。
max_fsm_pagesパラメータの値を大きくして PostgreSQL を再起動し、テーブルを再作成してデータをリストアしなおすか、VACUUM FULLでテーブルファイルのサイズを小さくしてください。そうすれば性能が改善されるかもしれません。
ご回答ありがとうございます。
稚拙な質問文にもかかわらず、適切なご意見を頂きまして恐縮です。
FSMのページ数ですか、、、初めて聞きました。
この辺のパラメータは知ってからDBMSを使え!って怒られそうですけど・・・
今度現場に行った時に調査して見ます。
少し時間が空くかもしれませんが、必ず結果をご報告します。
No.1
- 回答日時:
質問内容が、漠然としすぎです。
>ただ、一つのテーブルのみ、時間が経過の経過と共にselectが恐ろしく遅くなる
>構築時の応答速度は至って普通だったのですが、昨年の夏に異常に遅くなっていることが判明
「恐ろしく遅い」、「普通だったが、・・・異常に遅くなった」などと書かれても、具体的な説明なしに他人にアドバイスできると思いますか?
>現在入力されているデータ数は51ラインです。
>設計上、このテーブルは約1分間に51回updateが行われます
51ラインとは?
母体データが51件と、言っている訳ではないのですよね?
51回updateとは、母体データ何件に対し、何件のupdateを何回やると言ってますか?
どんな検索条件を指定し、どの列をどのようにupdateするのでしょうか?
>SQL(select)は至ってシンプルで、このテーブルしか参照しません。(select node_id,checktime ... from node_condition;)
検索条件なしで、全件検索をやると言ってますか?
関数の使用、order by、distinctやgroup byなどもないのですか?
時間の経過と伴に性能劣化するなら、普通に考えればインデクスを有効利用できていないのでしょうが、提示された内容から判断は無理です。
この回答への補足
すみません・・・
説明がなってませんよね。
まず、「恐ろしく遅い」ですが、構築時はクエリ完了までに0.0secで返ってきていたのですが、運用するにつれて20.0sec程度掛かるようになっています。
次にテーブルについてですが、現在51件入力されている状態です。
この51件のデータには、それぞれIDが付いていて、その51件に対して1分間に1回ずつupdateされるようになっています。具体的には、
update node_condition set checktime = '2010/02/10 10:01:00' where node_id = 1;
です。
selectは検索条件無しです。本当に初心者本の最初に載っているようなselect文です。ソート系やプロシージャも無しです。
INDEXも使っていません(51件程度しか入らないテーブルなので)
というように幼稚な設計部分なので、この現象自体が逆に不思議なのです。SQLの組み直しをする余地も無いんです。
なので、postgres側に何か重大な欠陥でもあるのかなと思って皆様のお知恵をお借りしようと思った次第です。
拙い説明で申し訳無いですが、アドバイス頂けると幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
都道府県穴埋めゲーム
都道府県の名前を1人1つずつ投稿してください。全ての都道府県が出たら締め切ります!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
同じSQL文で極端に検索が遅くなる時がある
MySQL
-
場合により問い合わせが異常に遅い(PostgreSQL)
その他(データベース)
-
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
-
4
数式の計算結果により表示されたセルを数える関数を教えてください
Excel(エクセル)
-
5
oracleのinsert select性能
Oracle
-
6
PostgreSQLの断片化の状況を確認したい
PostgreSQL
-
7
TruncateしたテーブルへのInsertの遅さが気になる
Oracle
-
8
長期間使っていると更新処理速度が落ちるのはなぜ
PostgreSQL
-
9
データベースのINT型項目にNULLはNG?
MySQL
-
10
小数点を含む数値かどうか判断の判断方法
Visual Basic(VBA)
-
11
truncate tableを使って複数のテーブルを指定する方法
Oracle
-
12
count(1)とcount(*)の違い
Oracle
-
13
CloseとDisposeの違い
Visual Basic(VBA)
-
14
カーソル0件の時にエラーを発生させる
Oracle
-
15
PostgreSQLのtimestamp型で時間(分)を抽出したい
PostgreSQL
-
16
SQLを連続発行する時の正しい(?)書き方は?
Visual Basic(VBA)
-
17
[ BETWEEN ] vs [ >= AND <= ]
MySQL
-
18
MFCでOnPaintのタイミング
C言語・C++・C#
-
19
dumpでインデックスだけ抜きたい
PostgreSQL
-
20
Visual Studio 「AnyCpu」について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT 文の NULL列は?
-
難しいSQL
-
DISTINCTとGROUP BYの違い
-
PostgreSQL8.4 配列型 集計
-
postgres FILLFACTOR 確認方法
-
アルパインデザインのキッチン...
-
まるいテーブル 円い 丸い 漢字...
-
お金持ちのテーブル
-
人の前を通る場合について
-
[ExcelのVBA]テーブル名が更新...
-
L2SWはARPテーブルを持っている?
-
テーブルで一番古いレコードだ...
-
アクセスでテーブルのデザイン...
-
飲み会で、座敷orテーブルどち...
-
「テーブルに座って……」という...
-
MACアドレス見えない
-
複雑なSQL文について
-
DBからタブ区切りのCSVデータを...
-
Accessでデータシートに同じデ...
-
ACCESSで容量が50MBになった...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT 文の NULL列は?
-
テーブルに存在しない列をselec...
-
SQLでUPSERTを一度に複数行やる...
-
SQLにて指定日付より前、かつ最...
-
単純なselectが遅くなるのです...
-
PostgreSQLの断片化の状況を確...
-
javaでデータベース上のテーブ...
-
MS Access から PostgreSQL へ...
-
Postgresのデータ領域の拡張に...
-
UPDATE文の更新順序について
-
2つのテーブルで引き算 postgres
-
テーブルを作ろうとしたら。
-
postgres FILLFACTOR 確認方法
-
VIEWのCOPYってできないんですか?
-
reindex と update のデッドロック
-
最新レコードを抽出し外部結合...
-
デットロック回避策(autocommit...
-
PostgreSQL レコードからアイテ...
-
PostgreSQL 8.0.2 の ERROR: r...
-
複数テーブルにまたがるmax
おすすめ情報