ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
テーブルの基本構造
RDB のテーブルは行 (Row / Tuple) と列 (Column / Attribute) で構成される 2 次元の集合です。物理ストレージへの格納方法はいくつかの種類があります。
Heap-organized Table (デフォルト)
ほとんどの RDB のデフォルト形式。新しい行は空きブロックに順次格納され、主キー順とは関係ありません。検索には別途インデックスが必要です。
CREATE TABLE employees (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
dept VARCHAR2(50),
salary NUMBER
);
-- → Heap-organized (Oracle / PG / MySQL InnoDB を除く)
-- MySQL InnoDB は主キーで Clustered Index 化される(IOT に近い)
-- これは Heap ではない点に注意
Index-organized Table (IOT) - Oracle
Oracle 独自の機能。主キー B-Tree の葉ノード自体に行データを格納します。主キー検索が高速、ただし更新と追加列のオーバーヘッドあり。
CREATE TABLE order_items (
order_id NUMBER,
seq_no NUMBER,
sku VARCHAR2(50),
qty NUMBER,
CONSTRAINT pk_oi PRIMARY KEY (order_id, seq_no)
)
ORGANIZATION INDEX -- ★ IOT 指定
PCTFREE 5
INCLUDING qty -- ここまでが主表、これ以降はオーバーフロー
OVERFLOW TABLESPACE app_data;
-- 用途: 主キー範囲スキャンが多い、列が少なく短い表
-- 注意: 二次索引のサイズが Heap より大きくなる傾向
MySQL の InnoDB は仕様上すべてのテーブルが IOT に近い形(主キーが Clustered Index)。SQL Server も CLUSTERED INDEX を作ると同じ挙動になります。
パーティション表 (Partitioned Table)
1 つの論理的なテーブルを、内部で複数の物理セグメントに分割します。パーティション・プルーニングでクエリが大幅高速化。
RANGE パーティション
-- Oracle
CREATE TABLE sales (
id NUMBER, sale_date DATE, amount NUMBER
)
PARTITION BY RANGE (sale_date) (
PARTITION p_2023 VALUES LESS THAN (DATE '2024-01-01'),
PARTITION p_2024 VALUES LESS THAN (DATE '2025-01-01'),
PARTITION p_2025 VALUES LESS THAN (DATE '2026-01-01'),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);
-- PostgreSQL (10+)
CREATE TABLE sales (id BIGINT, sale_date DATE, amount NUMERIC)
PARTITION BY RANGE (sale_date);
CREATE TABLE sales_2024 PARTITION OF sales
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
-- MySQL
CREATE TABLE sales (id BIGINT, sale_date DATE, amount DECIMAL)
PARTITION BY RANGE (TO_DAYS(sale_date)) (
PARTITION p_2023 VALUES LESS THAN (TO_DAYS('2024-01-01')),
PARTITION p_2024 VALUES LESS THAN (TO_DAYS('2025-01-01'))
);
HASH / LIST パーティション
-- HASH: 均等分散したいとき
CREATE TABLE users (id NUMBER, name VARCHAR2(50))
PARTITION BY HASH (id) PARTITIONS 8;
-- LIST: 明示的な値のグループ
CREATE TABLE customers (id NUMBER, country VARCHAR2(2))
PARTITION BY LIST (country) (
PARTITION p_asia VALUES ('JP', 'CN', 'KR'),
PARTITION p_america VALUES ('US', 'CA', 'MX'),
PARTITION p_others VALUES (DEFAULT)
);
-- 複合(サブパーティション)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY HASH (customer_id) SUBPARTITIONS 4
(...);
Temporary Table (一時表)
セッション or トランザクション限定で存在するテーブル。中間結果の保管、複雑なバッチ処理に便利。
-- Oracle: Global Temporary Table(スキーマに常駐、データだけセッション限定)
CREATE GLOBAL TEMPORARY TABLE temp_calc (
id NUMBER, value NUMBER
)
ON COMMIT DELETE ROWS; -- または PRESERVE ROWS
-- PostgreSQL: セッション限定(スキーマも消える)
CREATE TEMP TABLE temp_calc (id INT, value NUMERIC);
-- セッション終了で消える
-- ON COMMIT DROP / DELETE ROWS / PRESERVE ROWS
-- MySQL
CREATE TEMPORARY TABLE temp_calc (id INT, value DECIMAL);
-- セッション限定
-- SQL Server: # で Local、## で Global
CREATE TABLE #temp_calc (id INT); -- セッション限定
CREATE TABLE ##temp_calc (id INT); -- 全セッション共有
| 区別 | Oracle GTT | PG TEMP | MySQL TEMPORARY |
|---|---|---|---|
| スキーマ定義 | 常駐 | セッション | セッション |
| データ | セッション or トランザクション | セッション | セッション |
| ロック / Undo | 少ない | 無し(ローカルバッファ) | 少ない |
External Table (外部表)
CSV / Parquet / S3 上のファイルなどを「表のように SELECT」できる機能。ETL や DWH で頻出。
-- Oracle: ファイルを表として読む
CREATE TABLE ext_orders (
id NUMBER, sku VARCHAR2(50), qty NUMBER
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
)
LOCATION ('orders.csv')
);
-- PostgreSQL: foreign_data_wrapper
CREATE EXTENSION file_fdw;
CREATE SERVER files FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE ext_log (line text) SERVER files
OPTIONS (filename '/var/log/app.log', format 'text');
-- Snowflake / BigQuery / Redshift Spectrum 等は S3 上の Parquet を直接 SELECT 可
Materialized View (マテリアライズドビュー)
クエリ結果を物理的にテーブルとして保存するビュー。集計の高速化に絶大な効果。
-- Oracle
CREATE MATERIALIZED VIEW mv_daily_sales
BUILD IMMEDIATE
REFRESH FAST ON COMMIT -- ★ ベース表変更で即時更新(FAST には MV LOG が必要)
AS
SELECT TRUNC(sale_date) AS day, SUM(amount) AS total
FROM sales
GROUP BY TRUNC(sale_date);
-- PostgreSQL
CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT date_trunc('day', sale_date) AS day, SUM(amount) AS total
FROM sales
GROUP BY 1;
-- 更新
REFRESH MATERIALIZED VIEW mv_daily_sales;
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_daily_sales; -- ロック軽減(要 unique idx)
-- MySQL は標準で MV 無し → 自前で集計テーブル + トリガで模倣
テーブル情報を確認するシステムビュー
-- Oracle
SELECT * FROM user_tables;
SELECT * FROM all_tables;
SELECT * FROM dba_tables; -- DBA 権限必須
SELECT * FROM user_tab_columns WHERE table_name = 'EMPLOYEES';
-- PostgreSQL
SELECT * FROM information_schema.tables WHERE table_schema = 'public';
SELECT * FROM pg_tables WHERE schemaname = 'public';
\d+ users -- psql コマンド
-- MySQL
SHOW TABLES;
SHOW CREATE TABLE users;
SELECT * FROM information_schema.tables WHERE table_schema = DATABASE();
-- SQL Server
SELECT * FROM sys.tables;
SELECT * FROM INFORMATION_SCHEMA.TABLES;
EXEC sp_help 'users';
行サイズと PCTFREE
行サイズが大きいと 1 ブロックに収まる行数が減り、I/O 効率が落ちます。頻繁に UPDATE で行が膨らむ列構成では PCTFREE を大きく取り、Row Migration を防ぎます。
-- 良くないパターン例:
CREATE TABLE articles (
id NUMBER PRIMARY KEY,
title VARCHAR2(500),
body CLOB -- 行外格納(LOB セグメント)
)
PCTFREE 30 -- ★ UPDATE が多いので予約を多めに
INITRANS 4; -- 同時更新セッションが多いなら ITL 増やす
FAQ
Q: テーブルの行数を高速に知りたい
A: COUNT(*) は遅い。Oracle user_tables.num_rows(要 ANALYZE)、PG pg_class.reltuples、MySQL information_schema.tables.table_rows など統計の概算値が便利。
Q: パーティション表を後から作れる?
A: 既存表を直接パーティション化はできない(Oracle 12.2+ は ALTER TABLE ... MODIFY PARTITION BY で可能)。多くは「新テーブルを作って INSERT SELECT」。
Q: 一時表とテーブル変数の違い (SQL Server)
A: #temp はトランザクション・統計あり、@table はメモリ+簡易・統計無し。大量データは #temp が無難。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?