• ベストアンサー

PostgreSQLのパーティショニングの方法

http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050722/165140/?P=2 このページにかかれている「Constraint Exclusion」という方式を使用してテーブルのパーティショニングを行ったつもりなのですが、あるデータをSELECT文で検索してみても全てのテーブルに対して検索してしまっているようなのです。 このページに書いてある通りにテーブルを作成したのですが、どこに問題があるのか分かりません・・・。 何か駄目な所があるならば教えてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Dodonpa2
  • ベストアンサー率82% (19/23)
回答No.5

こんにちは。 >気になるのがon,off両方の場合で最初にマスターテーブルを検索している( >Seq Scan on マスターテーブル名)ようなのです。 例えば、 CREATE TABLE t_base (F1 int, F2 int, CONSTRAINT t_base_pkey PRIMARY KEY (F1) ); でマスタテーブルを定義して CREATE TABLE t_drive1 INHERITS (t_base); CREATE TABLE t_drive2 INHERITS (t_base); ・ ・ とパーティションを作成したとします。 極端な話、t_baseに10万レコードあり、各パーティションに1レコードしかなく、 あるパーティションにある(例えばt_drive2にある)レコードを検索しようとしても 時間的にはほとんどかわりません。 というのは、最適化してもマスタテーブルであるt_baseは必ず検索されるからです。 この場合は(t_baseとt_drive2が検索されると思われます) ですから、マスタテーブルにはレコードを格納しないで、すべて子テーブルに 記録しないとパーティショニングの効果は薄れるかと思います。 このへんはドキュメントにもかかれていますのでご確認ください。

atobex2000
質問者

お礼

わかりました やってみます! 長々とお付き合い頂きありがとうございました!

その他の回答 (4)

  • Dodonpa2
  • ベストアンサー率82% (19/23)
回答No.4

こんにちは。 >ですが肝心の処理時間は変わらないままです・・・ 設定を変更した後起動しなおしましたか? EXPLAIN ANALYZE実行したのでしたら、変更前と、 変更後ではコストはどう変化したかを確認してみると ヒントになるかもしれません。

atobex2000
質問者

お礼

コストを比較してみるとconstraint_exclusionがonになっている時のほうが少なかったです しかしTotal Runtimeは変わりませんでした・・・ 気になるのがon,off両方の場合で最初にマスターテーブルを検索している(Seq Scan on マスターテーブル名)ようなのです。一応その際のコストは減っているのですが、これでは意味が無いような気が・・・ わかりにくい文ですみません

  • Dodonpa2
  • ベストアンサー率82% (19/23)
回答No.3

こんにちは。 >一度全てのディレクトリ内を検索してみたのですがpostgresql.confというファイルは見つかりませんでした・・・。 えっ、ないですか。initdbで複写されるとドキュメントにあるのですが。 potgresql.confがなくてPostgreSQLが起動できるかどうかも やったことがないのでわからなく、また現状がどうなっているか想像もつかないのですが、 >これは新たに作成しなければならないんでしょうか? 当然、必要不可欠な設定ファイルです。 私なら再インストールまで考慮にいれます。 プラットフォームが何かわかると具体的なコメントがつくかもしれません。

atobex2000
質問者

お礼

見つかりました そしてパラメータもonにできました(showコマンドで確認もしました) explainオプションで試してみたところ条件に該当するテーブルの部分のみ読み込んでいることが確認できました ですが肝心の処理時間は変わらないままです・・・ 何故なんでしょうか?

  • Dodonpa2
  • ベストアンサー率82% (19/23)
回答No.2

こんにちは。 >postgresql.confというファイルはどこにあるのでしょうか・・・ 普通はdataディレクトリにあります。 または、pgAdminIIIでスーパーユーザでログインして、 ツール→サーバ構成からでも見られます。

atobex2000
質問者

お礼

一度全てのディレクトリ内を検索してみたのですがpostgresql.confというファイルは見つかりませんでした・・・。 /usr/share/pgsqlにpostgresql.conf.sampleというファイルならあったのですが。 これは新たに作成しなければならないんでしょうか?

  • Dodonpa2
  • ベストアンサー率82% (19/23)
回答No.1

こんにちは。 確認ですが、postgresql.confのconstraint_exclusionパラメータは 有効になってますよね?

atobex2000
質問者

お礼

すみません postgresql.confというファイルはどこにあるのでしょうか・・・ 今使用しているデータベースは別人が作った物なのでよくわからないのです 無知ですみません・・・

関連するQ&A

  • PostgreSQLの列分割(水平分割)について

    PostgreSQLで次のテーブルを作るとして create table test1(id int , name text , pass text , img bytea , dates date); このテーブルをパーティショニングしたいと思っています。 水平分割(dates列の値によって行をパーティショニング)についてのSQL文は、公式ドキュメントに例示されていたため理解したのですが、 垂直分割(列自体を分割)する設計のテーブルを作成する場合について調べているのですが、見つけることができませんでした。 id,name,pass,dateのテーブルと、id,imgのテーブルにパーティショニングするSQL文についてご教授願えないでしょうか

  • 携帯キャリアの送信ドメイン認証は、送信元のIPとドメインを認証するんですか?

    ITPROにこんな記事がのってました。 >Sender ID/SPFでは送信元サーバーのIPアドレスとドメイン名の関係をチェックするだけ。 【記事URL】 http://itpro.nikkeibp.co.jp/members/ITPro/USURA/20040909/149711/?ST=oss&P=2 この意味を私が取り違えているかもしれませんが スパム業者は、ドメインと一致するIPに偽装して、 スパムをまた、送っているということでしょうか? 「Sender ID/SPFを導入」というのは、実際何をすることなんですか? お願いいたします。

  • PostgreSQLのカラムに"user"という名前のカラムがある場合のデータ表示について

    PostgreSQLを使い始めたのですが、わからないことがあるので知恵をおかしください。 ユーザー名を管理するテーブルを以下のように作成しました。 テーブル:table  |No|user|from |  |1 |Atom|tokyo|  |2 |Boss|izu |  |3 |Cat |chiba| このテーブルのデータをuser部分のみ表示するに以下のSQL文を作成しました。  SELECT user FROM table 上記のSQLを実行したのですが、userのカラム部分がcurrent_userとテーブルのカラムではなくセッションの情報を取得してきてしまいます。 試しに  SELECT * FROM table で実行するとテーブルのデータを取得でき、  SELECT table.user FROM table で実行するとsyntax errorとエラー表示されデータが結果が表示されません。 userをセッション情報としてではなく、テーブル(table)のデータとして取得したい場合はどのようにしたらいいのでしょうか? よろしくお願いします。

  • SQLの実行速度

    XMLを解析し、テーブル内を検索するシステムを 作成しているのですが、 ストアドプロシージャ内でSQL文を作成し実行するのと ASP.NET などからSQL文を作成して実行するのとでは、 実行速度に差はでるのものなのでしょうか。 ・SQLServer 2005 ・SELECT の対象テーブルは2~3つのテーブルをINNER JOIN して使う。 ・検索対象の列は実行のたびに異なる。 よろしくおねがいします。

  • select文のwhere句に配列を入れて検索したい

    こんばんは。 題名の通り、select文のwhere句に配列を入れて検索したいのですが、 同じ質問↓も見つけ、やってはみるのですがうまくいかないので、教えてください。 http://oshiete1.goo.ne.jp/qa2940474.html 現在、 $member_id という配列にデータを入れ(この配列には正しく値が入っています。) $sql = "SELECT * FROM テーブル名 WHERE id IN (".$member_id."); としているのですが、うまくいきません。 どこがおかしいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブルの行を増やしたい・・・。

    テーブルの行を増やし、 データを一年文作成したいのですが・・・。 CREATE TABLE CALENDAR_TBL( YYYYMMDD DATE NOT NULL, DayData NUMBER(3) NULL CONSTRAINT CALENDAR_TBL_PKEY PRIMARY KEY(YYYYMMDD)); このテーブルに、2005年のデータ365レコードを挿入したいのですが、 1つのINSERT文(SQL)で、できますでしょうか? (※PL/SQLは除きます。) ※不可能であれば、SELECT文(下記のように)を一年分用意してUNIONで作成するのですが、 これ以外に簡単にできないでしょうか? INSERT INTO CALENDAR_TBL ( (SELECT SYSDATE + 000, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 001, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 002, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 003, DayData FROM CALENDAR_TBL) ・・・(省略)・・・ UNION (SELECT SYSDATE + 365, DayData FROM CALENDAR_TBL) )

  • Postgresqlの自己結合について

    first_table f_id f_name 1 鈴木 2 田中 3 佐藤 last_table l_id l_name 1 一郎 1 二郎 2 太郎 3 次郎 欲しい結果 id f_name l_name1 l_name2 1 鈴木 一郎 二朗 2 田中 太郎 (空白もしくはNULL) 3 佐藤 次郎 (空白もしくはNULL) PHP4.3.2とPostgresql7.4.29の環境です。 first_tableとlast_tableの2つのテーブルがあって、 欲しい結果のような表を作成したいです。 l_name1やl_name2でのキーワード検索も行いたいので、1つのSQL文を発行したいのですが、 どのように書けば良いのでしょうか? last_tableを自己結合し、first_tableと結合するのが近い気がするのですが。 SELECT * FROM first_table AS f INNER JOIN ( SELECT l1.l_id, l1.l_name AS l_name1, l2.l_name AS l_name2 FROM l_table AS l1, l_table AS l2 WHERE l1.l_name > l2.l_name AND l1.l_id = l2.l_id ) AS l ON f.f_id=l.l_id よろしくお願いします。

  • クエリビルダで列名を変数にしたいが

    VisualStudio2010でwebアプリを作成しています。 クエリビルダでSQL文を作成しSQLサーバにアクセスしています。 このSQL文でわからない点があります。 列1、列2、列3のフィールドを持つテーブルがあるとします。 ドロップダウンリストで選択した項目により、ある時は列1だけ取得し ある時は列2だけ取得し、ある時は列3だけ取得する様なSQL文を作りたいのですが、どうすればよいかわかりません、列名を変数にできればよさそうなんですが、そんなことできますか? ある時は SELECT 列1 FROM table1 ある時は SELECT 列2 FROM table1 ある時は SELECT 列3 FROM table1 としたいので   SELECT @列名 FROM table @列名は変数のつもりです。 このようにできればよいと思っていますが・・・ よろしくおねがいします

  • MySQLでTIMESTAMP型の列から現在日付の1週間以内のデータ検索をSQL文で

    タイトルの通りですが、MySQLのSELECT文についてです。 以下のようなテーブルがあったとします。 MEMBER{ ID SMALLINT M_DATE TIMESTAMP} このテーブルのM_DATEが現在の日付から一週間以内であるレコードの検索を以下のようなSQL文で実行しました。 SELECT * FROM MEMBER WHERE M_DATE BETWEEN (NOW() - 00000000070000) AND NOW(); 最初はこれでOKだと思っていたのですが、月をまたいだりした時に抽出されるべきではないレコードが表示されるので間違いに気付いたのですが、どう修正すべきなのか分からない状況です。 どなたか良い方法があれば、教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • どのテーブルのどのカラム???助けて下さい

    会社に入社したばかりなのですが、プログラミングをしています。 で質問なのですが データベースのselect文で ある名称を取ってこないといけないときに どこのテーブルとどこのテーブルのどのカラムとどのカラムが 等しいときの名称を取ってくる様なselect文が作成できません テーブル設計書のカラム名を見ただけではわかりません こういった場合はどうすればいいのでしょうか 設計書とかにどのカラムが等しいときとか どのテーブルのどの名称とか普通そういう資料があるのでしょうか select文の構文は判ってもテーブルの仕様みたいなのがわからないので 対応できません 全然わかりません。助けてください