## 高速化の工夫:オーダーidをキー、ユーザ名を値とする辞書型配列で管理。
user_map = {user["id"]: user for user in users}
for order in orders: # O(N)
# O(1)で取得できる
user = user_map[order["user_id"]] # O(1)
print(order["order_id"], user["name"])
for の中で毎回テーブル検索を繰り返すと、DBサーバとのやり取りを繰り返すことになり、非効率になりがち。仮にordersが1万レコードあった場合を仮定すると、 I/O 関連のボトルネックが発生してしまう。
DBとの通信が1万回発生する
SQLの解析実行を1万回繰り返す
ネットワーク往復が1万回発生する
# 例) order の各レコードから、注文者の名前を表示したい場合
orders = (sqlでordersテーブルを検索。 select order_id, user_id from orders)
# 各レコードに対し、注文者名を表示
for order in orders:
# 各orderごとにユーザ名検索を繰り返す
# select user_name from users where user_id = (order["user_id"])
user = (sqlでusersテーブルから user_id に紐づくレコードを検索。
select user_name FROM users WHERE users.user_id = order["user_id"]) )
print(order["order_id"], user["user_name"])
results = (sqlでordersテーブルとusersテーブルを内部構造して検索。
select order_id, user_name from orders
inner join users on orders.user_id = users.user_id)
# 内部結合でのクエリ結果に対し、注文者名を表示
for result in results:
print(order["order_id"], user["user_name"])
# 前)ファイル全体をDL→中身の処理を開始 の例
# large.csv (10GB)
with open("large.csv", "r", encoding="utf-8") as f:
content = f.read() # 10GBすべて読み込む
for line in content.splitlines():
process(line)
# 後)ファイルの一部のみDL→中身を処理 を繰り返す方法
with open("large.csv", "r", encoding="utf-8") as f:
for line in f:
process(line)
CREATE TABLE users (
user_id BIGINT,
user_name STRING NOT NULL
)
# usersテーブルの user_id カラムにインデックス付与
# user_id をキーにして検索をする場合に高速化できる
CREATE INDEX idx_users_user_id
ON users (user_id);
SQL②:パーティションに分ける
検索対象の総量を減らすことにつながるので、この設定も有効。
CREATE TABLE orders (
order_id BIGINT,
order_date DATE NOT NULL,
user_id BIGINT,
amount NUMERIC
)
PARTITION BY RANGE (order_date); # パーティションの親テーブルの設定。order_dateカラムの値で分ける
CREATE TABLE orders_202607 # パーティションの子テーブル。2026年7月のorderを管理
PARTITION OF orders
FOR VALUES FROM ('2026-07-01')
TO ('2026-08-01');
CREATE TABLE orders_202608 # パーティションの子テーブル。2026年8月のorderを管理
PARTITION OF orders
FOR VALUES FROM ('2026-08-01')
TO ('2026-09-01');
SQL③:insertよりもbulk_insert
PostgreSQL 向けの高速化案となる。テーブルへの大量データの新規登録処理をする際、
(遅) insert < bulk insert < copy (速)
の順で高速に処理できる。
When inserting a lot of data at the same time, consider using the COPY command. It is not as flexible as the INSERT command, but is more efficient. Refer to Section 14.4 for more information on improving bulk loading performance.