SQLを速くするコツ#トレンド技術ブログ現代社会において私たちは頻繁にスマホアプリやWebサービスを利用しており、アプリなしでの生活は考えられなくなりました。「あ~もうっ、アプリの動作が遅くてイライラする。」と思ったことはないでしょうか?この原因には様々な理由が考えられますが、原因の一つに、アプリで利用しているSQLの品質が悪いということが考えられます。■SQLを速くするための作業、SQLチューニングSQLはデータベースを操作する際に使用する言語で、このSQLの書き方が悪いとアプリの動作に影響を与えます。そのため、プログラマーにはパフォーマンスの良いSQLを書くスキルが必ず求められます。この「SQLを改善する作業」は「SQLチューニング」と呼ばれています。今回はこのSQLチューニングに関して説明します。■SQLチューニングの意義ではなぜアプリのパフォーマンスが悪いことが問題になるのでしょう?「動作が遅くても最終的に動いてくれれば別にいいのに・・・。」という考えも一部ではあるかもしれません。それは大きな間違いで、速度はアプリが想定通り動作するかどうかと同じくらい重要なことです。時にアプリは、「速度が遅い」という理由で使われなくなってしまいます。スマホアプリ:挙動が遅いとユーザーにとって大きなストレスになり、利用率の低下やアンインストールに繋がります。ECサイト:反応が遅い場合は直帰するユーザーが増え、売り上げが落ちます。利用中に速度が遅いなどの不快感があると利用者はどんどん離れてしまいます。Webサイト:SEOにも影響します。Googleなどの検索結果の順位が落ちると、利用者数が減少しWebサイトを有効に活用できなくなります。速度を改善するということはシステム開発を行う上で非常に重要です。企業の基幹システムは機能ごとに目標の応答時間があり、それを達成できないと不具合として扱われ、リリースが延期になったりすることもよくあります。■SQLチューニングの難しさについてSQLチューニングはほぼすべてのシステム開発で求められる作業ですが、実は非常に高度な作業であるため、この作業をこなすにはスキルと経験が必要になります。システム内で画面に表示する情報を取得するSQLを速度改善するケースで考えてみましょう。SQLが複数のトランザクションテーブルを結合している場合、結合の部分の影響で遅くなっていることがあります。結合はそれなりに重い処理になるので、結合せずにSQLを書くと改善するケースが多いです。作業画面に必要なデータだけを集めた参照用のテーブルを新しく作成し、そのテーブルからデータを取得するようにすると解決することがあります。解決方法は、一つではありません。この例だと、新たにテーブルを作ることになるので、後でシステムへの機能追加のためテーブルにカラムを増やす必要がある場合、トランザクションテーブルと参照用のテーブルの両方にカラムを足すことになり、ダブルメンテナンスになります。このような保守性の低下以外にも、SQLチューニングは方法を間違うと逆効果になることもあります。データベースに関する高度な知識と未来に起こりえる変更にも柔軟に対応できる経験が必要になってきます。■具体的なSQLチューニングSQLチューニングの方法は無数にありますが、大きく分けると2種類に分けられます。「現在のSQLの無駄な部分が無いか調査し改善すること」と、「表面には出ていない問題点を調査し改善すること」です。一つ目の無駄な部分の改善はSQLの知識が無くてもある程度はできる作業です。~となっている部分が無いか探し、あれば必要なカラムだけ取得するようにする*はテーブルの全項目を取得するという意味。必要な項目だけを指定することで、アプリに送られるデータ量が少なくなり速度改善が見込めます。・必要のないテーブルを結合していないかどうか確認し、あればその結合部分を削除する不具合修正や追加開発時などでもともと結合されていたテーブルが必要なくなっていることがあります。・「in句」で実装されている部分を「exists句」で実装できるかどうか検討してみるexists句はすべてのレコードを検索する必要が無いので速度改善できることがあります。対して、二つ目の表面に出ていない問題点の調査と改善は、システム全体に影響することもあるので、高度なスキルが必要です。利用されているSQLを分析し、問題点を洗い出す作業を行います。「explain」というコマンドを利用することでSQLの実行計画を調べることができ、問題点を発見できる場合があります。この分析結果に基づいてチューニングを行なっていきますが、システム全体への影響も考慮しSQLの実行計画やデータ構造を確認しながら慎重に進めていく必要があります。・Indexを適切なカラムに設定するIndexを設定することで、SQLでも同じ手法でデータにアクセスすることができ、結果的に速度改善が見込めます。・実行計画を指定するたとえば、ヒント句を使用することでデータベースがどのようにデータを処理するか指示を出すことが可能です。処理の順番が明確であれば適切に利用します。・速度に問題のある部分のテーブル設計をやり直す問題のある個所を作り変えてしまう手法です。「必要な情報を一つのテーブルにまとめ、アクセスするテーブルの数を減少させ、結果的に速度が出る」などの方法があります。■まとめ今回はシステムの速度改善の意義と、SQLチューニングについて取り上げました。速度改善に強いプログラマーは多くの案件で求められる貴重な人材です。普段からスキルを磨いておくと良いでしょう。