質問するログイン新規登録

回答編集履歴

4

変更

2016/10/24 02:09

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -84,6 +84,7 @@
84
84
 
85
85
  /*
86
86
   データの作成は、子テーブルへ直接行う方が早いです。
87
+  その際は子テーブル毎にインサートしてください。
87
88
  今回大量なので分割子テーブルへ直接挿入する方がよろしいかと思います。
88
89
  */
89
90
  ```

3

追加

2016/10/24 02:08

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -13,4 +13,77 @@
13
13
  親テーブル(details_table)と子テーブル(details_table_2110...)として作成する様にできます。(仮にですよ)
14
14
  今回は、特に検索速度の向上なので1検索がパーティションを跨って行われる場合や分割キー以外での検索と
15
15
  なら無い様なパーティショニングを見つけ出す事が必要です。言い換えるとそうでなければ検討はそこまでです。
16
- 運用者大変でしょうが、がんばってください。
16
+ 運用者大変でしょうが、がんばってください。
17
+
18
+
19
+ ご参考になればと思い作成してみました。
20
+
21
+ ```sql
22
+ --仮にportで分割するとしました、他の項目であれば置換えしてください。(もしかしてAA_id)
23
+ CREATE TABLE details_table (
24
+ response_time timestamp,
25
+ AA_id varchar,
26
+ port varchar,
27
+ octets numeric);
28
+
29
+ -- 2110, 2210, 2310, 2410 の4分割の場合
30
+ -- INHERITSで親を継承してインデックスを作成しています。必要に応じて追加してください。response_time等
31
+ -- CHECKを付けて分割の範囲を指定します。親テーブルからの検索使います。
32
+ CREATE TABLE IF NOT EXISTS details_table_2110 (
33
+ LIKE details_table INCLUDING INDEXES
34
+ INCLUDING DEFAULTS
35
+ INCLUDING CONSTRAINTS,
36
+ CHECK ( port = '2110' )
37
+ ) INHERITS (details_table);
38
+ CREATE INDEX details_table_2110_idx ON details_table_2110 (port);
39
+
40
+ CREATE TABLE IF NOT EXISTS details_table_2210 (
41
+ LIKE details_table INCLUDING INDEXES
42
+ INCLUDING DEFAULTS
43
+ INCLUDING CONSTRAINTS,
44
+ CHECK ( port = '2210' )
45
+ ) INHERITS (details_table);
46
+ CREATE INDEX details_table_2210_idx ON details_table_2210 (port);
47
+
48
+ CREATE TABLE IF NOT EXISTS details_table_2310 (
49
+ LIKE details_table INCLUDING INDEXES
50
+ INCLUDING DEFAULTS
51
+ INCLUDING CONSTRAINTS,
52
+ CHECK ( port = '2310' )
53
+ ) INHERITS (details_table);
54
+ CREATE INDEX details_table_2310_idx ON details_table_2310 (port);
55
+
56
+ CREATE TABLE IF NOT EXISTS details_table_2410 (
57
+ LIKE details_table INCLUDING INDEXES
58
+ INCLUDING DEFAULTS
59
+ INCLUDING CONSTRAINTS,
60
+ CHECK ( port = '2410' )
61
+ ) INHERITS (details_table);
62
+ CREATE INDEX details_table_2410_idx ON details_table_2410 (port);
63
+
64
+ -- 親テーブルのトリガーを作成します。
65
+ -- 親へのインサート命令を子テーブルへのインサートに置換えます。
66
+ -- RETURN NULLにより親テーブルへのインサートを中止します。子テーブルへインサート
67
+ CREATE OR REPLACE FUNCTION details_table_trigger() RETURNS TRIGGER AS
68
+ $$
69
+ BEGIN
70
+ -- key is port
71
+ EXECUTE 'INSERT INTO ' || 'details_table_' || new.port || ' VALUES(($1).*)' USING new;
72
+ RETURN NULL;
73
+ END;
74
+ $$ LANGUAGE plpgsql;
75
+
76
+ -- 上記のトリガーを親テーブルへ付けます。
77
+ -- BEFORE INSERTとして親テーブルへのインサート前に呼び出し、NULLにてスキップします。
78
+ DROP TRIGGER IF EXISTS details_table_trigger ON details_table;
79
+ CREATE TRIGGER details_table_trg
80
+ BEFORE INSERT
81
+ ON details_table
82
+ FOR EACH ROW
83
+ EXECUTE PROCEDURE details_table_trigger();
84
+
85
+ /*
86
+  データの作成は、子テーブルへ直接行う方が早いです。
87
+ 今回大量なので分割子テーブルへ直接挿入する方がよろしいかと思います。
88
+ */
89
+ ```

2

変更

2016/10/24 01:58

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  親データ項目を継承した子テーブルがデータを保持します。
5
5
 
6
6
  INSERT、UPDATE、DELETE、SELECTは親テーブルに対して行えます。当然、分割を単位で直接子テーブル
7
- に同様なアクセスできます。
7
+ に同様なアクセスできます。
8
8
  親テーブルへのアクセスは分割情報元に検索等の実行を子テーブルへと振り分けます。
9
9
  パーティショニングも数は、100以下であれば親テーブルからの検索でも速度向上が望めます。
10
10
  私事ですが現行DBはこの100を優に越えています、なので親検索は行わす子テーブルに直接アクセスしております。

1

変更

2016/10/22 11:13

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  Postgresのパーティショニングは親テーブルと子テーブルの構成で親テーブルはデータを持たず、
4
4
  親データ項目を継承した子テーブルがデータを保持します。
5
5
 
6
- INSERT、UPDATE、DELETE、SELECTは親テーブルに対して行えます。当然、分割を単位で直接子テーブル
6
+ INSERT、UPDATE、DELETE、SELECTは親テーブルに対して行えます。当然、分割を単位で直接子テーブル
7
7
  に同様なアクセスできます。
8
8
  親テーブルへのアクセスは分割情報元に検索等の実行を子テーブルへと振り分けます。
9
9
  パーティショニングも数は、100以下であれば親テーブルからの検索でも速度向上が望めます。