0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

エコなSQLの書き方

Last updated at Posted at 2023-09-27

はじめに

こんにちは、SQLを使ったデータ抽出業務に従事している者です。

近年、データ量が増え続ける中で、データベースの効率的な運用に対するニーズが高まっています。効率的なデータベース操作は、サーバーの消費エネルギーを減少させるだけでなく、データの読み込みが早くなることに直結し、アプリケーションのパフォーマンスを向上させる効果もあります。

この記事では、初学者でもできる、SQLの最適化の基本的な3つのポイントについて解説します。

1. 必要最小限のデータを取得する

データベースからのデータ取得時にやってしまうポイントの一つが「不要なデータの取得」です。
「とりあえず、どんなデータが入っているのか確認したい。」といった理由でやってしまいがちですが、特に大規模データが格納されているテーブルに対して、以下のようなクエリを実行すると、大量のデータが不必要に読み込まれ、システム全体のパフォーマンスに影響を及ぼす可能性があります。

SELECT 
    *
FROM
    users
;

上記のクエリは、usersテーブルの全ての列を取得してしまうため、必要ではない余分なデータを不要に取得してしまい、メモリやネットワークの無駄使いとなります。

これを避けるためには、以下のような方法で、不要なデータの読み込みを防ぎましょう。

A. カラムの選定:
SELECT *の代わりに、必要なカラム名を明示的に指定しましょう。これにより、不要なデータの読み込みを防げます。

例えば、ユーザーの名前とメールアドレス、年齢、都道府県コードが必要な場合、以下のようなクエリを書くことで、不要なデータの読み込みを回避できます。

SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
;

B. LIMIT句の利用:
必要な行数だけ取得しましょう。特に、多数のレコードが存在するテーブルからデータを取得する際には、LIMIT句を使用して取得行数を制限します。

SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
LIMIT 5
;

2. JOIN操作の効率化

JOINは異なるテーブル間で関連データを結合する強力なSQL操作です。しかし、不適切に使用されると、パフォーマンスの大きなボトルネックになる可能性があります。

JOINの効率化のポイントとしては以下のようなものがあります。
A. 必要最小限のテーブルをJOIN:
必要なテーブルだけをJOINし、不要なテーブルの結合を避けることで、データの転送量と処理量を削減します。

B. ON句の条件の明確化:
ON句の条件は明確にし、必要最小限の行だけが結合されるようにします。

C. 適切なJOINタイプの選択:
INNER JOIN, LEFT JOIN, RIGHT JOINなど、適切なJOINタイプを選択することで、不要なデータの結合や処理を防ぎます。
可能な場合は、INNER JOINを使用しましょう。LEFT JOINやRIGHT JOINよりもパフォーマンスが良くなる可能性があります。

実際のわかりやすいJOINの例を考えてみましょう。
例: 顧客テーブル(customers)と注文テーブル(orders)があり、特定の顧客の注文情報を取得する場面を考えます。

SELECT 
    customers.name
    , orders.order_date
    , orders.amount
FROM 
    customers
    , orders 
WHERE c
    ustomers.customer_id = orders.customer_id
;

このクエリは、両テーブルの全てのカラムと行を結合し、その後WHERE句でフィルタリングを試みます。

SELECT 
    customers.name
    , orders.order_date
    , orders.amount
FROM 
    customers 
INNER JOIN 
    orders 
    ON customers.customer_id = orders.customer_id
;

このクエリは、必要なカラムのみを取得し、効率的なINNER JOINを使用しており、JOINする際のON条件を明確に指定することで、データベースが必要なデータのみを効率的に取得することが可能となっています。

3. WHERE句の最適化

WHERE句の最適化は、クエリパフォーマンスを大きく左右します。効率的なWHERE句を作成することで、データベースが対象とする行の数を大幅に減少させることができ、結果としてクエリの応答時間も短縮されます。

WHERE句の最適化のポイントとしては以下のようなものがあります。

A. 具体的な条件の使用:
可能な限り具体的な条件を用いることで、データベースがスキャンする必要のあるデータの量を削減できます。

SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
WHERE
    prefecture_code = '02'
;

B. 範囲の絞り込み:
検索条件でBETWEENなどを用いて範囲を明確に絞り込むことで、処理するデータの量を減少させます。

SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
WHERE
    age BETWEEN 25 AND 30
;

C. 論理演算の最適化:
ORANDを利用する際にも、効率的な書き方があります。ORよりもINを使用した方が良い場合があります。

SELECT 
    username
    , email
    , age
    , prefecture_code
FROM
    users
WHERE
    prefecture_code IN ('01', '14', '26', '30')
;

最後に

<もしあれば一言とお礼>
以上で紹介したような方法で、クエリの最適化を行うことで、不必要なリソースの消費を抑えることができます。これにより、エネルギーの使用量が削減され、環境への負荷も軽減されます。つまり、効率的で最適化されたクエリの作成と使用は、環境保護にも寄与すると言えます。
データベースのパフォーマンスを向上させながら、よりグリーンで持続可能なテクノロジーの実現に向けて、一緒に努力しましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?