テレワークが広まりRemoteViewの利用者も多くなっていると思いますが、RemoteViewを使用していてやはり一番不満に思うのがレスポンスの悪さです。
このRemoteViewのレスポンスを少しでも改善するための設定方法をメモしておきます。
この設定は「標準ビューア」を選択した場合の手順となります。
テレワークが広まりRemoteViewの利用者も多くなっていると思いますが、RemoteViewを使用していてやはり一番不満に思うのがレスポンスの悪さです。
このRemoteViewのレスポンスを少しでも改善するための設定方法をメモしておきます。
この設定は「標準ビューア」を選択した場合の手順となります。
OracleでのTRUC関数と類似したものにPostgreSQLではDATE_TRUNC関数があります。
DATE_TRUNC関数は「DATE_TRUNC([‘精度’],[列名])」形式で指定する事で取得できます。
サンプルテーブル「goods」のtype_code=’102’のadd_dateをサンプルとしてDATE_TRUNC関数で抽出してみます。
|
1 2 3 4 5 6 7 8 9 |
SELECT DATE_TRUNC('year',add_date), -- 精度に'year' を指定し年で切り捨て DATE_TRUNC('month',add_date), -- 精度に'month' を指定し月で切り捨て DATE_TRUNC('day',add_date), -- 精度に'day' を指定し日で切り捨て DATE_TRUNC('hour',add_date), -- 精度に'hour' を指定し時で切り捨て DATE_TRUNC('minute',add_date), -- 精度に'minute'を指定し分で切り捨て DATE_TRUNC('second',add_date) -- 精度に'second'を指定し秒で切り捨て FROM goods WHERE type_code = '102'; |
IN句をEXISTS句へ変換するとパフォーマンスが向上すると言われることがあるので
IN句からEXISTS句への変換例をメモしておきます。
以下の商品テーブル「goods」と属性コードテーブル「type_code」を元に説明します。
商品テーブル「goods」のtype_codeが ‘101’で属性コードテーブル「type_code」にも存在する商品名を取得する例となります。
|
1 2 3 4 |
SELECT tc.code_name FROM type_code AS tc WHERE tc.code IN(SELECT type_code FROM goods WHERE type_code = '101'); |
WHERE句後の「tc.code IN」を「EXISTS」に変更し、「AND type_code = tc.code」を追加しただけです。
|
1 2 3 4 5 |
SELECT tc.code_name FROM type_code AS tc WHERE EXISTS (SELECT 1 FROM goods WHERE type_code = '101' AND type_code = tc.code); |
EXISTS句は使い慣れてないと今一つ分かりにくい気がするので、上記のEXISTSをNOT EXISTSで実行してみた例も記載しておきます。なんとなくEXISTSがどういう結果を出力しているかわかるかも。。
|
1 2 3 4 |
SELECT tc.code_name FROM type_code AS tc WHERE NOT EXISTS(SELECT 1 FROM goods WHERE type_code = '101' AND type_code = tc.code); |
本稿では、 IN句 から EXISTS句 への変換例およびその基本的な使い分けを紹介しましたが、実運用においては以下の点にもご留意ください。
データベース製品(たとえば PostgreSQL/Oracle Database/MySQL)やバージョンによって、IN句とEXISTS句の内部実行プランや最適化状況が異なるため、単純に「INは遅い」「EXISTSの方が速い」と一律判断するのは危険です。
実際には、サブクエリの対象件数・インデックス構成・統計情報の鮮度などがパフォーマンスに大きく影響します。EXISTSに変えたからといって必ずしも高速化するとは限りません。
また、可読性・保守性の観点からは「どちらが読みやすいか・将来変更しやすいか」も考慮に入れるべきです。たとえば、複雑な条件・結合・集計を伴うSQLでは、意図が明確な記述を優先したほうがトラブルを防げます。
最後に、SQLのチューニングは「手段」ではなく「目的」—つまり、「実際の業務で期待されるレスポンスタイムを満たしているか」「運用負荷を適切にコントロールできているか」という観点が最も重要です。この点を忘れず、必要に応じて実行計画の確認やプロファイリングを実施してください。
引き続き、SQL設計・実装・運用の改善にお役立ていただければ幸いです。
今後も他の観点(たとえば JOINの最適化/ウィンドウ関数の活用/データ量に対するスケーリング)についても、機会を改めてご紹介したいと思います。
SQLで指定した件数のみ取得する場合、MySQLやPostgreSQLではLIMIT句を使用します。
OracleではLIMIT句は使用できないのでROWNUMを使用します。
クエリーの最後にLIMIT(取得したいレコード数)を指定することで指定した件数のみ取得することが出来ます。
|
1 |
SELECT * FROM goods ORDER BY type_code LIMIT(3); |
Oracleの場合、ROWNUMを指定しただけではORDER BYでソート後の状態で取得ができないので副問合せで一度ソート後にROWNUMを指定することで指定した件数で取得することが出来ます。
|
1 2 3 |
SELECT * FROM (SELECT * FROM goods ORDER BY type_code) WHERE ROWNUM <= 3; |
「packer」はJavaScriptやjQueryなどの「.js」ファイルを最小化してくれるサイトです。
テレワークが広まって一気に需要が高まってきているMicrosoft Teamsですが、最初はブラウザからOfficeにログインしてアプリを選択して起動していると思います。
毎日のように利用していると毎回WEBにログインしてという作業が面倒になるのでそういった方にはデスクトップアプリ版をインストールすることをおすすめします。
iTunesを長く使用しているとiTunes上には表示されてても再生しようとすると「元ファイルが見つかりません…」のように表示され「!」マークが表示されることがあります。
こういうファイルをまとめて削除する方法をメモしておきます。