株式会社コーソル
COLUMN

コーソルのお役立ちコラム

コーソルでは経験豊かなエンジニアが、Oracle Databaseに関するお役立ち情報を発信しています。
データベースのチューニングや設定にお役立ていただけます。

SQL

公開日  更新日

SQLチューニングとは?具体的な方法を解説

企業のデータベースを管理するうえで、「SQLの使い方は理解していてもチューニングの方法がわからない」とお困りのご担当者様も多いのではないでしょうか。
データベースの動作を最適化し、システム全体のパフォーマンスを向上させるために、SQLチューニングは非常に重要です。

そこで本記事では、SQLチューニングの具体的な方法を紹介します。
データベースのパフォーマンスを効率化させたいご担当者様は、ぜひ最後までご覧ください。

SQLチューニングについて知る前に押さえるべき用語

SQLのチューニングに取り掛かるにあたって、まずは“データベース”と“SQL”の概要は押さえておきたいところです。

以下で、詳しく解説します。

データベース

SQLチューニングの対象であるデータベースとは、形式やルールを決めて整理・管理されたデータの集合体のことです。
大量のデータを効率的に管理するためには、データベースは必須の仕組みとなっています。

言葉で言うのは簡単ですが、データベースの仕組みを頭で完璧に理解するのは難しいものです。
この仕組みのイメージをつかむためには、データベースを“大きな箱”、データを“ブロック”と考えるとよいでしょう。
箱の中に大量のブロックを乱雑に入れてしまうと、必要なブロックを探すのに手間取ります。
しかし、ブロックを種類ごとに整理しておけば、必要なデータをすぐに見つけることができます。

このように、大量のデータをコンピューター内にあるデータベースを使って整理・管理することで、必要なデータを容易に検索できるようになるわけです。

なお、データベースは主に2種類に分けられます。
一つは、表形式でデータを格納する“リレーショナルデータベース”で、もう一方はさまざまな形式でデータを保存する“非リレーショナルデータベース”です。
リレーショナルデータベースでは、データ間の関係性を明確にし、データを行と列の表形式で格納するのが特徴です。
対して、非リレーショナルデータベースでは、データを特定の用途に合わせた形式で格納します。

本記事で取り上げるSQLのチューニングは、主に前者のリレーショナルデータベースで必要となります。

SQL

SQLは、一般的なプログラムコードとは異なり、データベースの操作・制御に特化した言語で、データベースに指示を出す際に用いられます。
さまざまなクエリを実行でき、たとえばデータベース内にあるデータの追加や更新、検索といった作業を効率的に行えるのが特徴です。

データベースの設計や効率的なデータ管理を可能にする重要なツールのため、データベースを有効に活用したいのであれば、SQLの基本的な知識があると役立つでしょう。

なお、SQLはISO(国際標準化機構)が国際標準化している規格のため、Oracle Databaseをはじめ、MySQLやPostgreSQLなどのデータベースでも使用可能です。

SQLチューニングとは

ここまでで、データベースとSQLの概要はおわかりいただけたはずです。
では、そもそもSQLチューニングとは何かというと、データベースの動作を正常なものとするために行う、SQLの性能を改善する作業のことです。
SQLで記述したクエリが正常に実行されない場合や、実行が遅い場合など、その原因を調査したうえで性能の改善を試みる必要があります。

データベースは、企業の業績や顧客情報の管理だけではなく、ECサイトの商品検索やスマホアプリの動作など、多くのシステムで活用されています。
これらのデータベースでは、SQLの効率的かつ正確な実行が不可欠なので、SQLチューニングによる整備が欠かせません。
つまり一般的な企業だけではなく、サイトの運営やアプリの提供に携わっている企業の担当者にも、ユーザビリティの観点からSQLチューニングの知識が必要なのです。

SQLチューニングの必要性

では、なぜSQLチューニングによるデータベースの改善が重要視されているのでしょうか。

企業の基幹システムやECサイト、アプリにおいても「いくら動作が遅くても、正常に表示されれば問題ない」と軽視している方がいらっしゃるかもしれません。
しかし、これは誤りです。
データベースの処理が遅いと、必要なデータを迅速に集められないだけではなく、システム全体のパフォーマンスが低下してしまいます。

たとえば、業務システムでは、データの処理が遅くなることで業務効率が低下し、生産性に悪影響を与えます。
また、ECサイトの検索結果がすぐに表示されないとユーザーは離脱してしまうでしょう。
スマホアプリでは、データの同期が遅くなり必要な情報が表示されなければ、ユーザーにとって大きなストレスとなり利用者の減少につながります。
こうしたパフォーマンスの問題の多くは、SQLを適切にチューニングしていないことが要因である場合がほとんどです。

SQLをチューニングしてデータベースの処理速度を改善することは、自社の利益を守り、ユーザーの使い勝手を維持するためにも、非常に重要な作業なのです。

SQLチューニングの難しさについて

SQLチューニングは、ほとんどのシステム開発で求められる作業ですが、実は高度な技術が必要であるため、初心者にとっては難易度が高いとされています。

たとえば、企業のデータベースから必要な情報を得る際の、SQLの速度を改善するケースで考えてみましょう。
データベースには、“テーブル”とよばれるデータの格納先が複数存在しています。
SQLでは、これら複数のテーブルを結合して、必要なデータを取得するのが一般的です。
しかし結合するテーブルが多い場合、データベースに大きな負荷がかかり、実行速度が遅くなる可能性があるわけです。
このような問題を解決する手法の一例として、よく使用するデータのみを集めたテーブルを新たに作成し、そこからデータを取得できるよう設定し直す方法があります。

このように、SQLチューニングには少々複雑な作業を要します。
そのうえ問題の解決法が複数あり、もし間違った方法を選択すると操作性がより悪化してしまうケースもあるため、初心者には難易度が高いと言わざるを得ません。
SQLチューニングに取り組む際は、データベースやSQLに関するスキルと知識を身につけたうえで、柔軟に対応しましょう。

具体的なSQLチューニングの方法

先述の通り、SQLのパフォーマンス改善には、ある程度の複雑な作業が伴います。
しかし基本的なポイントを押さえれば、不慣れな方でもSQLチューニングを実施することは可能です。

SQLチューニングの基本は、“現状のSQLに無駄がないかを調査し改善すること”と、“表面には表れていない問題点を調査し改善すること”の2点です。
このポイントを踏まえたうえで、以下で具体的なチューニング方法を紹介します。

テーブルに別名をつける

データベースのテーブルごとに“別名(エイリアス)”をつけることで、SQLの解析時に検索項目がどのテーブルに属しているのかといった判定を省略できます。
基本的にデータベースでは複数のテーブルを扱うため、長いテーブル名を簡略化した短い別名をつけることで指示を簡潔にできるうえ、記述ミスが防げます。
こういった少しの工夫で効率化を図ることが、SQLの精度の向上につながるわけです。

SQLチューニングのなかでも比較的容易に実行できるため、データベースの適正な動作を実現するためには、まず押さえておきたいポイントです。

SELECT * FROM~となっている部分を探す

SQLでデータを得る際、SELECT * FROM~のように「*」が用いられている場合は、これを削除することでデータベースの処理速度の改善が見込めます。

「*」は、テーブルの全項目を取得するという意味をもっています。
そのため、これを削除して必要な項目のみを指定することで、データベースの負担が減り、快適に情報を引き出せるようになるはずです。

必要のないテーブルを結合していないかどうかを確認する

先述したように、使用しないテーブルを結合している場合はデータベースに余計な負荷がかかっている状態なので、発見次第すぐに不要な結合を解除してください。

たとえば、過去の開発や不具合修正の際に追加されたテーブル結合が、現在は不要となっているケースもあります。
本当に必要なテーブルのみを結合して、できるだけシンプルなSQLを心がけることで、データベースのパフォーマンスが向上します。

“IN句”で実装されている部分を“EXISTS句”で実装できるかどうか検討してみる

IN句とは、複数の条件をまとめて指定する際に用いる命令のことです。
一方のEXISTS句は、特定の条件に一致するデータが存在するかどうかの確認に使用します。

SQLでIN句を使用している場合、該当のテーブル内をくまなく検索することとなりますが、EXISTS句なら、条件に合う項目を見つけた時点で処理を終了します。
つまり、無駄にすべての項目を検索せず、効率的に必要な情報を取得できるので、データベースの負荷が軽くなり処理速度が向上するわけです。

自社のSQLでIN句を用いている場合は、一度EXISTS句での実装を試してみるとよいでしょう。

INDEXを設定する

INDEXとは、データベース内のデータ検索を高速化できる仕組みのことで、書物の“索引”にあたります。
これを設定して参照することで、目的のデータが格納されているテーブルに直接アクセスできるので、より効率的に必要なデータまでたどり着けるわけです。

頻繁に検索する項目にINDEXを設定すれば、実用性が増すだけではなく、結果的にデータベースの処理速度が改善されます。

実行計画を指定する

データベースには、SQLによるクエリをどのように実行するのかを決める“実行計画”があり、“EXPLAIN”というコマンドを入力すれば確認できます。
たとえば、クエリの実行手順や使用されるINDEX、結合方式などの情報が得られます。
このような情報を確認して、実行計画の良否を見極めるわけです。

問題が見つかった際には、SQLで“ヒント句”を入力して指示を出し、実行計画を調整することでデータベースの処理速度の向上が見込めます。
ヒント句は、コメントの前後に「/*+(コメント)*/」を記入することで実行可能です。
たとえば、INDEXによって処理速度を上げたい場合は、「SELECT /*+ INDEX(指定するテーブル)*/ * FROM ~」のように記載してデータベースに指示を送ります。

テーブル設計をやり直す

データベースの処理速度が低下している場合は、そもそもテーブルの設計を見直すことで改善されるかもしれません。
毎回、複数のテーブルを経由しないと必要な情報が引き出せないのであれば、改善する余地があります。

使用頻度の高い情報は一つのテーブルにまとめて、アクセスするテーブル数を減少させることで、データベース全体のパフォーマンスが向上します。
このとき、不要なデータの削除や、INDEXの設定もあわせて行うのがおすすめです。

条件分岐はアプリ側で行う

アプリ内のデータベースにおいては、データベース内で複雑な条件分岐を行うと処理速度の低下を招くので、できる限りアプリ内で処理するといった工夫が必要です。

アプリで使用しているデータベースの処理速度を改善するには、データベース内のクエリをシンプルなものに書き換えてみてください。
また、アプリでの処理とデータベースでの処理を適切に分けることでも、システム全体の効率を高められます。
もし、複雑な条件分岐をすべてデータベース内で処理しているなら、一度見直してみるとよいでしょう。

SQLチューニングでは、データベースにかかる負荷を分散することもポイントの一つです。

テーブルの結合前に条件を絞る

“WHERE句”は、SQL文で検索条件を指定する際に用いられ、テーブルを結合する前後に記述できます。
これをテーブルの結合後に記述すると、大きなテーブルに対して条件の絞り込みを行うため、検索パフォーマンスが下がる原因となります。

そのため、結合前にWHERE句を記述して、あらかじめ検索条件を絞り込んでおいたほうが、データベースの負担が減り処理速度が向上するのです。

「そもそも自社のデータベースでWHERE句を使っていない」という企業は、SQLの最適化のためにも、ぜひ取り入れたいところです。

SQLチューニングとはデータベースを正常に動かすためにSQLを改善すること

今回は、SQLチューニングの具体的な方法を紹介しました。

SQLチューニングを実施することで、データベースの処理速度が改善され、必要な情報を効率的に取得できるようになります。
このチューニング方法には、すぐに実行できるものから、ある程度の専門知識を要するものまでさまざまです。
まずは、自社ですぐに実行できるチューニング方法から試してみましょう。

Oracle社のデータベースを使用していて、専門的な知識が必要なSQLチューニングを実施したいのであれば、コーソルにご相談ください。
創業以来、データベースの運用支援で企業様を支えつづけてきたプロ集団が、最適なSQLチューニングでシステムの安定化に貢献します。

この記事の監修者

監修者の写真

舛井 智行 (ますい ともゆき)

営業本部 企画&マーケティング部 次長

《資格》

Oracle Master Gold、Oracle RAC Expert、Linux Expert、LPIC Level1、Dbvisit Standby Certified Associate、基本情報技術者

《略歴》

2004年コーソル入社。2019年まで一貫してOracle Databaseの設計・構築・運用のサービス提供に従事。リモートDBAやリモート監視のサービス化、働き方改革プロジェクトで人事制度改革を手掛ける。2019年からライセンス販売強化のため企画&マーケティング部に異動。DbvisitやToad、DPAの取扱開始、販売促進活動を推し進め、ライセンス販売事業の売上拡大に注力中。

《主な著書》

オラクルマスター教科書 Gold DBA Oracle Database AdministrationⅡ
オラクルマスター教科書 Silver DBA Oracle Database Administration I
オラクルマスター教科書 Silver SQL Oracle Database SQL
Oracleの基本 ~データベース入門から設計/運用の初歩まで
プロとしてのOracle入門
Oracle Database 10g Oracle Enterprise Manager 逆引きクイックリファレンス

《担当者様からの一言》

コーソルはOracle Databaseの技術力において日本有数の知見を有すると自負しています。Oracle Masterの最高峰資格である『Oracle Master Platinum』の取得者数も日本No.1です。Oracle Databaseのことはもちろん、それ以外のDBについてもリモートDBAサービスを始めとした様々なサービス、製品を駆使してお客様のお困りごとを解消いたします。お困りごとがあればコーソルまでご相談ください。

監修者の写真

峯岸 隆一 (みねぎし りゅういち)

インフラソリューション部 市ヶ谷クラウドサービスチーム シニアエキスパート

《資格》

Oracle Master Gold、ORACLE MASTER Platinum、Oracle RAC Expert、
Oracle Database Cloud Service Oracle Infrastructure as a Service Cloud 2017 Implementation Essentials、
Oracle Cloud Infrastructure 2018 Architect Associate、
Oracle Cloud Infrastructure 2019 Architect Professional、
AWS Certified Solutions Architect – Associate、OSS-DB Silver、
MySQL 5.6 Database Administrator、基本情報技術者、テクニカルエンジニア(データベース)

《略歴》

2006年コーソル入社。2021年までOracle Databaseを中心にMySQLやGoldenGateなど、多岐にわたる製品のサポート業務に従事。2021年から企画&マーケティング部に異動し、Nutanix NDBサービス化、Qlik Replicateサービス化、AWS、OCIなど様々な製品のサービス化、クラウド環境上の製品検証、ブログ執筆を手掛ける。2023年からOCI技術に磨きをかけるべくOCI基盤の設計・構築業務を遂行中 。

《主な著書》

オラクルマスター教科書 Gold DBA Oracle Database AdministrationⅡ
オラクルマスター教科書 Silver DBA Oracle Database Administration I
オラクルマスター教科書 Silver SQL Oracle Database SQL  Oracleの基本 ~データベース入門から設計/運用の初歩まで

《担当者様からの一言》

コーソルはOracle Database製品および周辺製品において特化した技術力を有している会社です。また、育成にも力を入れており、新卒などOracle Databaseの知識がないエンジニアでも数年でOracle Master Platinumを取得するほどのエンジニアに育て上げることに成功しています。クラウド分野(AWS、Oracle Cloud)にも積極的に進出しておりますので、Oracle Databaseに関するサービスをご要望であればプラットフォーム問わず対応できるコーソルにご連絡下さい。

TOP