
初めて投稿させて頂きます。
過去に、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で質問しましょう!
似たような質問が見つかりました
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Oracle SQL update方法 2 2022/06/22 14:07
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PostgreSQL PostgressからMySQL(MariaDB)へ構造を変更する際のTimestamp等について 2 2023/04/04 12:09
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- PostgreSQL 列が存在しないと言われる 2 2023/02/10 18:33
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- PostgreSQL postgreSQL カラムの全ての値を取得したい 3 2022/10/07 12:33
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?
-
【お題】甲子園での思い出の残し方
【お題】「球場の砂を持って帰る」はもう古いと思った高校球児が、甲子園で負けた際に、思い出に残そうと思って行ったこと
-
人生で一番思い出に残ってる靴
皆さんの人生で一番思い入れのある靴の話を伺ってみたいです。
-
ゆるやかでぃべーと タイムマシンを破壊すべきか。
[状況]これはディベートの論題だと仮定したうえでの回答お願いします。
-
自分用のお土産
国内や海外に旅行へ行った時、自分用のお土産ってどれくらい買いますか?
-
同じSQL文で極端に検索が遅くなる時がある
MySQL
-
PostgreSQLのパフォーマンスについて質問です。
PostgreSQL
-
AccessShareLock はどの程度気にする必要がある?
PostgreSQL
-
-
4
Viewにインデックスは張れますか?
Oracle
-
5
PostgreSQLの断片化の状況を確認したい
PostgreSQL
-
6
外部キーが設定されているテーブルのupdateについて
PostgreSQL
-
7
データを削除しても表領域の使用率が減りません
Oracle
-
8
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
9
FreeBSD+PostgreSQLでありえないぐらい遅い(通常の30倍以上かかる)
PostgreSQL
-
10
sqlに記述できない文字
PostgreSQL
-
11
PSQLで-- More --を表示しない方法
PostgreSQL
-
12
Windows10のタスクスケジューラの仕様
Windows 10
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT 文の NULL列は?
-
テーブルに存在しない列をselec...
-
単純なselectが遅くなるのです...
-
SQLにて指定日付より前、かつ最...
-
重複を許すキーの構文がわかり...
-
PostgreSQLの断片化の状況を確...
-
UPDATE文の更新順序について
-
javaでデータベース上のテーブ...
-
auto_increment型
-
2つのテーブルで引き算 postgres
-
reindex と update のデッドロック
-
トリガープロシージャのNEW変数...
-
「テーブルに座って……」という...
-
面接のときテーブルが正面に。...
-
sqlplusで表示が変なので、出力...
-
飲み会で、座敷orテーブルどち...
-
ROWNUMでUPDATEをしたいのです...
-
Oracleで上書きImportはできま...
-
update文で改行を入れる
-
カラム位置変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT 文の NULL列は?
-
SQLにて指定日付より前、かつ最...
-
SQLでUPSERTを一度に複数行やる...
-
テーブルに存在しない列をselec...
-
PostgreSQLの断片化の状況を確...
-
投稿記事と関連付けているテー...
-
単純なselectが遅くなるのです...
-
2つのテーブルで引き算 postgres
-
reindex と update のデッドロック
-
Postgresのデータ領域の拡張に...
-
Postgresqlのレポート機能について
-
COPYコマンドによるTEXT取り込...
-
UPDATE文の更新順序について
-
PostgreSQL レコードからアイテ...
-
javaでデータベース上のテーブ...
-
MS Access から PostgreSQL へ...
-
デットロック回避策(autocommit...
-
postgres FILLFACTOR 確認方法
-
テーブルにcsvファイルをインポ...
-
同一カラムに複数条件指定
おすすめ情報