質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.06%

  • PostgreSQL

    832questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • Tera Term

    70questions

    Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

20万行超のテーブル内の複数行を削除できない

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 230

hohohotn

score 2

前提・実現したいこと

あるテーブルが20万行を超えてるので、
いらない行を削除してダウンサイズしたいが、
データが大きすぎるのか、削除できません。

何か解決策があれば教えていただけないでしょうか?

発生している問題・エラーメッセージ

Tera Term VTでSQL文(DELETE)を打ちましたが、
途中で止まってるのか
ずっと処理中なのか
反応がなくて困っています。(カーソルが点滅したまま)

該当のソースコード

2015-12-31以前を削除したい(行数不明)
DELETE FROM order2 WHERE sid IN (SELECT id FROM sale2 WHERE rst < '2015-12-31 00:00:00');

2005-12-31以前でも削除できない(2530行)
DELETE FROM order2 WHERE sid IN (SELECT id FROM sale2 WHERE rst < '2005-12-31 00:00:00');

数行すら削除できない
DELETE FROM order2 WHERE id < 10;

1行なら削除できる
DELETE FROM order2 WHERE id = 30;

試したこと

あと、
テーブルをCSVでダウンロードして
対象行を削除後、それをアップロード
を試しましたが、ダウンロードできず
(少ない行のテーブルならダウンロードできるのですが)

psql# \o /home/www/dbiba000/public_html/order2.csv
psql# \a

psql# \pset fieldsep ','
Field separator is ','.
psql# SELECT * FROM order2 ORDER BY id;
psql# \o 

補足情報(言語/FW/ツール等のバージョンなど)

CPU    Intel Xeon / 2.4GHz Dual Processor
メモリ    2048 MB
ハードディスク    72 GB (RAID1:Mirror)
OS    FreeBSD 4.7-RELEASE
データベースサーバ    PostgreSQL 7.2.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

エラーの原因が不明なので、上手くいくかは、定かではありませんが、deleteするのではなく必要なレコードを出力し、テーブルを作成し直して(truncate)LOADされてはどうでしょうか?

--copy out where id 
\copy (SELECT * FROM order WHERE id > 10) to /home/www/dbiba000/public_html/order2.cpy

--table recreate 
drop table order;
create table order ....;
-- or truncate
truncate table order;

--copy back
\copy order from /home/www/dbiba000/public_html/order2.cpy

テーブルのdrop&create部分のddlはpg_dumpでも作成できます
pg_dump database -s -c -t order >/home/www/dbiba000/public_html/order2.ddl

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 09:14 編集

    vacuum full後、状況変わらずでしたが、
    いつのまにか、deleteされて、8万行(2015-12-31以前)まで減らすことができました。
    なぜかは分かりません。

    その後、
    \copy order2 to '/home/www/dbiba000/public_html/order2.csv'';
    でコピーできました。

    ただ、DELIMITERをつけるとエラーになり、困っています。
    \copy order2 to '/home/www/dbiba000/public_html/order2.csv' DELIMITER ',';

    他に下記を試しましたが、
    dbiba000=> \o /home/www/dbiba000/public_html/order2.csv
    dbiba000=> \a
    Output format is unaligned.
    dbiba000=> \pset fieldsep ','
    Field separator is ','.
    dbiba000=> SELECT * FROM order2 ORDER BY id;
    calloc: Cannot allocate memory

    となり、メモリが足りないようです。
    やはり、現サーバーでは、8万行を扱うには無理があるのでしょうか?

    キャンセル

  • 2018/01/05 10:29

    当初20万件有ったので8万件に減った時点でエラーには、成りずらいと思われます。
    一度vacuum order2(できればvacuum FULL order2)をされてはどうでしょうか?削除の12万件がdeadタプルとして存在していると思われます。
    また、DELIMITERを付けた際のエラーメッセージは何でしょうか?

    キャンセル

  • 2018/01/12 13:45

    vacuumしましたが、やはり8万件でも下記の削除ができません。
    DELETE FROM order2 WHERE sid IN (SELECT id FROM sale2 WHERE rst < '2016-01-12 00:00:00');

    DELIMITERを付けた際のエラーメッセージは、
    \copy order2 to '/home/www/dbiba000/public_html/order2.csv' DELIMITER ',';
    \copy: parse error at 'DELIMITER'
    となります。

    キャンセル

  • 2018/01/15 17:19

    PostgreSQL 7.2.3環境が無くエラーにはなりません。(V8.3)
    同じようにcopyコマンドがありますのでこちらを試されてはどうでしょうか。
    copy (SELECT * FROM order WHERE id > 10) to '/home/www/dbiba000/public_html/order2.cpy';

    キャンセル

  • 2018/01/15 17:21

    上記はDBが同じサーバ上に有る場合です。もし異なる場合は、”to stdout;"として外でリダイレクションして下さい。

    キャンセル

  • 2018/02/06 00:16

    \copy order2 to '/home/www/dbiba000/public_html/order2.csv'
    DELIMITER ','なしでうまくダウンロードできました。
    ありがとうございました。

    キャンセル

+1

Diskが不足しているのでしょう。
一旦 vacuum full を行って下さい。
その後、deleteを試してみて下さい。

deleteで状況が変わらないなら、
テーブルをtruncate後にvacuum fullしてCSVでの取込を。

それでも変わらないならDISK容量が十分な環境にするしかないと思われます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 08:28

    truncateで全データ削除されるのは、困ります。

    ですが、
    vacuum full後、状況変わらずでしたが、
    いつのまにか、deleteされて、8万行(2015-12-31以前)まで減らすことができました。
    なぜかは分かりません。

    しかし、8万行でも、CSVでの取込みができず、
    これもDISK容量の問題でしょうか?

    下記のようにしましたが
    ファイルはできますが、中身が空

    psql# \o /home/www/dbiba000/public_html/order2.csv
    psql# \a

    psql# \pset fieldsep ','
    Field separator is ','.
    psql# SELECT * FROM order2 ORDER BY id;
    psql# \o

    キャンセル

  • 2018/01/05 09:31

    CSVに出力しておいてからTruncateです。

    csvのサイズはどの程度でしょうか?
    また、Diskの空き容量はどの程度でしょう?
    postgresはメンテナンス時に一時的に最大で通常の3倍の容量を必要とします(あくまでテーブル単位ですが)ので、増分+αのDisk資源は確保しておいた方が良いと思います。

    既にデータファイルが破損している可能性もありますので、バックアップを取ってから、クリーンインストール後の再構築を行ってみてはどうでしょうか。

    キャンセル

  • 2018/01/12 13:22

    CSVは5MBほどです。
    Diskの空き容量はレンタルサーバーなので、分かりません
    WebとMailの部分は分かるのですが(データベースは別サーバーなので)

    キャンセル

0

ディスクに不良ブロックができていないか、ログを確認して下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 08:18

    レンタルサーバーですが、ログ確認できるでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    PostgreSQLでDBのデフォルトエンコーディングの設定が知りたい

    デフォルトエンコーディングが何か知りたいデータベースがあります。 どうすれば確認できますか? どなたか回答お待ちしております。

  • 受付中

    MySQLのSelect文でよい方法があれば教えてください。

    前提・実現したいこと date name pay 2015/2/1 tarou 5,000 2015/2/2 zirou 8,000 2015/2/2 saburou

  • 解決済

    SQLのSELECT構文の書き方教えてください。

    画像のテーブルから、sidの1と3を取り出す場合の記述はどうなりますか。 sid1のみなら、 SELECT * FROM schedule WHERE sid = 1;ですが、

  • 解決済

    DBのデータ削除できない

    スケジュール帳のデータを、更新・削除すうプログラムを作っているのですが、 更新ができても、削除ボタンを押すとエラーが出ます。 理由がわからないので、ご教示の程宜しくお願い致します。

  • 解決済

    SQLiteで一つだけ行を削除する

    SQLiteで一つだけ行を削除したいのですが、以下のようにすると 「1 "near "LIMIT": syntax error"」 というエラーが返ってきます。 "DELETE 

  • 受付中

    ログテーブルにログがインサートされない

    access_logテーブルにログがインサートされません。コードを記載しますので、修正箇所を教えていただけないでしょうか。 <?php require_once('TableBa

  • 解決済

    DB2 検索できない

    DB2です。 テーブルのCREATE_DAYカラムはTIMESTAMPでいっぱい格納されてます。 ↓こんなデータ 2008-12-01 18:24:47.022123 201

  • 解決済

    oracleのソート順について

    oracleでソートを行うと、数字、英字、ひらがな、カタカナの順番で表示されます。 これをひらがな、カタカナ、数字、英字の順番で表示させたいのですが、調べてもよい方法が見つかりま

同じタグがついた質問を見る

  • PostgreSQL

    832questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • Tera Term

    70questions

    Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。