データ分析
2025/05/16
池田 悠真

SQLクエリ最適化入門

SQLクエリ最適化の基本テクニックを学び、パフォーマンス向上を目指しましょう。SELECT * の回避や、JOINの最適化、サブクエリの代替方法、パーティション分割・クラスタリングの活用方法を解説します。

クエリ最適化とは

SQLクエリ最適化とは、データベースに対して発行されるSQL文のパフォーマンスを向上させる技術や手法のことを指します。大量のデータを効率的に処理し、応答時間を短縮することで、システム全体の負荷を軽減し、ユーザー体験を向上させることが目的です。

主要なクエリ最適化テクニック

【SELECT * の使用を避ける】


SELECT * はテーブル内の全カラムを取得するため、必要以上のデータを取得し、処理速度や通信コストが悪化します。 必要なカラムだけを明示的に指定しましょう。


-- NG
SELECT * FROM orders;

-- OK
SELECT order_id, order_date, customer_id FROM orders;

 


【JOINは小規模なテーブルで実行する】


JOINを行う結合は、結合対象のテーブルが大きいと処理が重くなります。 可能な限りフィルタリングや集約を行い、小規模なデータ同士を結合しましょう。


-- 非効率な例(大きなテーブル同士を結合)
SELECT o.order_id, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;

-- 効率化例(注文データをフィルタしてから結合)
WITH recent_orders AS (
SELECT * FROM orders WHERE order_date > DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH)
)
SELECT ro.order_id, c.customer_name
FROM recent_orders ro
JOIN customers c ON ro.customer_id = c.customer_id;

 


【サブクエリの使用を控える】


サブクエリは便利ですが、過度に使うとクエリが複雑になりパフォーマンスが落ちることがあります。 JOINや共通テーブル式(CTE)で代替することを検討しましょう。


-- サブクエリ(非推奨例)
SELECT user_id, total_sales
FROM (
SELECT user_id, SUM(amount) AS total_sales
FROM orders
GROUP BY user_id
) sub
WHERE total_sales > 1000;

-- CTEを使った例(推奨)
WITH user_sales AS (
SELECT user_id, SUM(amount) AS total_sales
FROM orders
GROUP BY user_id
)
SELECT user_id, total_sales
FROM user_sales
WHERE total_sales > 1000;

 


【パーティション分割を行う】


テーブルを日付や範囲でパーティション分割することで、クエリの対象データを絞り込み高速化できます。


-- パーティションテーブル作成例(BigQuery)
CREATE TABLE sales_data_partitioned (
order_id INT64,
order_date DATE,
amount FLOAT64
)
PARTITION BY order_date;

-- パーティションを活用したクエリ例
SELECT order_id, amount
FROM sales_data_partitioned
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';

 


【クラスタ化を行う】


クラスタリングは、特定カラムの値ごとにデータをまとめて格納し、検索や集計の効率を上げます。


-- クラスタリングテーブル作成例(BigQuery)
CREATE TABLE clustered_sales_data
CLUSTER BY customer_id, product_id AS
SELECT * FROM sales_data;

-- クラスタリングされたカラムでの検索が高速化
SELECT customer_id, SUM(amount)
FROM clustered_sales_data
WHERE customer_id = 'CUST123'
GROUP BY customer_id;

まとめ

SQLクエリ最適化は、効率的なデータ処理とシステムパフォーマンスの向上に不可欠です。今回紹介したテクニックはどれも基本的かつ効果的な方法なので、ぜひ普段の開発や分析に取り入れてください。


New call-to-action