機械学習を用いた新機能『Amazon Redshift Short Query Acceleration(SQA)』を実際に試してみました

はじめに

Amazon Redshift に導入されたShort Query Acceleration(SQA)は、機械学習を使用して、クエリの実行時間を予測し、実行時間の短いクエリを、より高速に処理するためにショートクエリ用のWLMキューに移動して実行する機能です。これまで、レポート、ダッシュボード、インタラクティブな分析などの一般的に実行時間の短いクエリは、抽出、変換、ロード (ETL) 操作など実行時間の長いクエリの後のキューに入ると、クエリの実効が待たされてしまう可能性がありましたが、ショートクエリの応答時間の改善が期待できます。

Short Query Acceleration の特長

Short Query Accelerationは、ショートクエリ用の高速レーンを提供します。

  • ショートクエリが⻑い実行クエリの後ろにつかない
  • より高いスループットと、少ない変動性
  • ワークロードのためにカスタマイズされている
  • クエリパターンを機械学習して、ショートクエリと判断すると、適切なキューに移動する
  • 透過的 – アクセラレーションの存在を意識せずに動作する

引用:Migrating Your Traditional Data Warehouse to a Modern Data Lake - ABD327

実験

Short Query Acceleration の有効化前の動作確認

まずはWLMのデフォルトの設定で、ロングクエリ(約7500万レコードコピーするクエリ)を5つ同時実行して、WLMキューに空きがない状態でショートクエリを実行します。ショートクエリは本来であれば、数秒で返ってくるはずのクエリです。しかし、ロングクエリであるクエリID:1123の終了後にショートクエリであるクエリID:1129の実行が待たされてしまうので、299秒経過した後、応答が返ってきました。

cmdb=> SELECT * FROM lineorder_cp WHERE lo_commitdate > 19969630 AND lo_commitdate < 19969730 LIMIT 1;
 lo_orderkey | lo_linenumber | lo_custkey | lo_partkey | lo_suppkey | lo_orderdate | lo_orderpriority | lo_shippriority | lo_quantity | lo_extendedprice | lo_ordertotalprice | lo_discount | lo_revenue | lo_supplycost | lo_tax | lo_commitdate | lo_shipmode
-------------+---------------+------------+------------+------------+--------------+------------------+-----------------+-------------+------------------+--------------------+-------------+------------+---------------+--------+---------------+-------------
(0 rows)

Time: 299840.975 ms (04:59.841)

Short Query Acceleration の有効化

デフォルトでは、Short Query Accelerationが有効に設定されていませんので、この機能を利用するにはWLMの設定を変更します。Redshiftのコンソールでクラスタのパラメータグループを選択して[編集]を押して、[ショートクエリアクセラレーションの有効化]のチェックボックスを選択して保存します。ショートクエリの最大実行時間(デフォルト5秒)は、必要に応じて変更してください。

設定を変更すると、WLM 設定パラメータの JSON 形式は、以下のように変更されます。short_query_queuetruemax_execution_time5000ミリ秒が追加されました。今回の検証では、設定変更後にクラスタを再起動しています。

[ {
  "query_concurrency" : 5,
  "max_execution_time" : 0,
  "query_group" : [ ],
  "query_group_wild_card" : 0,
  "user_group" : [ ],
  "user_group_wild_card" : 0
}, {
  "short_query_queue" : true,
  "max_execution_time" : 5000
} ]

補足:SQAにおけるWLMクエリスロットカウント数のベストプラクティス

Short Query Accelerationを有効にすると、すべてのユーザー定義キューでのWLMクエリスロットの合計数または並行性は15以下にする必要があります。AWS CLIまたはAmazon Redshift APIを使用してShort Query Accelerationを有効にすると、スロット数の制限が強制されません。ベスト・プラクティスとしては、システム全体の最適なパフォーマンスを維持するために、WLMクエリスロットカウントを15以下にすることを推奨しています。

Short Query Acceleration の有効化後の動作確認(1回目)

Short Query Acceleration の設定を有効化して、先ほどと同じ検証を実施しました。しかし、ショートクエリのパターンを学習していないので、設定有効化前と変わりません。

cmdb=> SELECT * FROM lineorder_cp WHERE lo_commitdate > 19936680 AND lo_commitdate < 19936780 LIMIT 1;
 lo_orderkey | lo_linenumber | lo_custkey | lo_partkey | lo_suppkey | lo_orderdate | lo_orderpriority | lo_shippriority | lo_quantity | lo_extendedprice | lo_ordertotalprice | lo_discount | lo_revenue | lo_supplycost | lo_tax | lo_commitdate | lo_shipmode
-------------+---------------+------------+------------+------------+--------------+------------------+-----------------+-------------+------------------+--------------------+-------------+------------+---------------+--------+---------------+-------------
(0 rows)

Time: 225557.928 ms (03:45.558)

教師データに相当するショートクエリを実行する

ショートクエリのパターンを学習させたいので、ロングクエリは常に1つ、ショートクエリは5つ同時実行しました。マニュアルには、どれくらいの教師データを与え、どれだけ待てば学習してくれるのか記載がありませんが、まずは同時実行5、約4000クエリを約40分間実行します。

Result Cachingにヒットすると、WLMをスキップして学習しないことが予想されます。毎回条件を変えて手作業でショートクエリを5つ同時実行するのはもはや不可能なので、簡単な負荷試験ツールを作成しました。

package jp.classmethod.di.example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.Callable;


public class ShortQueryTask implements Callable<Boolean> {

    protected static final String url = "jdbc:redshift://cm-redshift.abcdefghi.ap-northeast-1.redshift.amazonaws.com:5439/cmdb";
    protected static final String user = "cm_user";
    protected static final String pass = "85!mDVhB";

    private int threadNumber = 0;

    public ShortQueryTask(int num) {
        threadNumber = num;
    }

    @Override
    public Boolean call() throws Exception {
        boolean result = false;
        long startTime = System.currentTimeMillis();
        Random rnd = new Random(System.nanoTime());
        int startDate = rnd.nextInt(77777) + 19900000;
        int endDate = startDate + 100;

        Properties props = new Properties();
        props.setProperty("user", user);
        props.setProperty("password", pass);
        props.setProperty("ssl","true");
        props.setProperty("sslfactory","com.amazon.redshift.ssl.NonValidatingFactory");

        try (Connection conn = DriverManager.getConnection(url, props)) {
            Statement stmt = conn.createStatement();
            String _sql = String.format("SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > %d AND lo_commitdate < %d LIMIT 1;", startDate, endDate);
//          System.err.println(_sql);
            ResultSet rs = stmt.executeQuery(_sql);
            while(rs.next()){
            //  System.err.print("+");
            }
            result = true;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        System.out.println("ShortQueryTask-" + threadNumber + " | elapsed time : " + (System.currentTimeMillis() - startTime) + " ms");
        return result;
    }

}
package jp.classmethod.di.example;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class MultiQueryRunner {

    private static final int CLIENTS = 100;
    private static final int THREADS = 5;

    private static final ExecutorService executorPool = Executors.newFixedThreadPool(THREADS);

    public MultiQueryRunner() {
    }

    public static void main(String[] args) {
        int success = 0;
        int failure = 0;

        Collection<ShortQueryTask> collection = new ArrayList<ShortQueryTask>();
        for (int i = 0; i < CLIENTS; i++) {
            ShortQueryTask task = new ShortQueryTask(i);
                collection.add(task);
        }

        long startTime = System.currentTimeMillis();
        try {
                List<Future<Boolean>> list = executorPool.invokeAll(collection);
                for (Future<Boolean> f : list) {
                    int ignore = f.get() ? success++ : failure++;
                }
        } catch (Exception e) {
                e.printStackTrace();
        } finally {
                System.out.println("TOTAL SUCCESS - " + success);
                System.out.println("TOTAL FAILURE - " + failure);
                System.out.println("Total time - " + (System.currentTimeMillis() - startTime) + " ms");
                executorPool.shutdown();
        }
    }
}

上記のコードを実行すると、以下のようにログ出力されます。

ShortQueryTask-4 | elapsed time : 1622 ms
ShortQueryTask-0 | elapsed time : 2437 ms
ShortQueryTask-5 | elapsed time : 3269 ms
ShortQueryTask-3 | elapsed time : 4934 ms
ShortQueryTask-2 | elapsed time : 4965 ms
ShortQueryTask-1 | elapsed time : 4968 ms
ShortQueryTask-6 | elapsed time : 4101 ms
ShortQueryTask-11 | elapsed time : 930 ms
ShortQueryTask-9 | elapsed time : 2503 ms
ShortQueryTask-8 | elapsed time : 2979 ms
ShortQueryTask-7 | elapsed time : 3712 ms
ShortQueryTask-10 | elapsed time : 3707 ms
 :
 :

Short Query Acceleration の有効化後の動作確認(2回目)

学習してくれたかな?、、、ということで、ロングクエリ(約7500万レコードコピーするクエリ)を先行して5つ同時実行して、ショートクエリ(100クエリ)を5つ同時実行しました。従来通りだと、キューのサイズが「5」なので、ロングクエリが全て終わった後に、ショートクエリが実行されていました。

下記の図の通り、Short Query Accelerationが効果的に機能して、ショートクエリが待たされずロングクエリと並列実行していることが確認できます。また、ショートクエリの実行時間も平均2〜3秒なので処理時間の低下などもありません。キューのサイズを「5」に設定していますが最大10〜12並列で実行していたことが確認できますので大成功です。一方、ほとんどのショートクエリは、ロングクエリを待たずに処理が終了できましたが、例外的に3つのショートクエリがロングクエリの終了まで待たされていました。4000クエリ学習させても、3%のクエリはロングクエリと誤認識されていました。max_execution_timeをデフォルトの5000msよりも大きくすることで重みを調整できるのかもしれません。

Result Cachingにキャッシュされていない(SVL_QLOGのsource_queryが全てnull)という、エビデンスとして掲載しておきます。

cmdb=> select * from SVL_QLOG order by starttime desc limit 110;
 userid | query |  xid  |  pid  |         starttime          |          endtime           |  elapsed  | aborted |             label              |                          substring                           | source_query
--------+-------+-------+-------+----------------------------+----------------------------+-----------+---------+--------------------------------+--------------------------------------------------------------+--------------
    101 |  6453 | 23189 | 29679 | 2018-01-09 07:24:50.471293 | 2018-01-09 07:24:54.948186 |   4476893 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19963 |
    101 |  6451 | 23185 | 29678 | 2018-01-09 07:24:49.948207 | 2018-01-09 07:24:53.359044 |   3410837 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19946 |
    101 |  6452 | 23184 | 29677 | 2018-01-09 07:24:49.928653 | 2018-01-09 07:24:49.982292 |     53639 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19919 |
    101 |  6450 | 23177 | 29675 | 2018-01-09 07:24:45.880068 | 2018-01-09 07:24:49.44249  |   3562422 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19948 |
    101 |  6449 | 23173 | 29673 | 2018-01-09 07:24:44.92566  | 2018-01-09 07:24:49.374483 |   4448823 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19965 |
    101 |  6448 | 23169 | 29648 | 2018-01-09 07:24:44.348792 | 2018-01-09 07:24:44.401341 |     52549 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19918 |
    101 |  6446 | 23153 | 29647 | 2018-01-09 07:24:42.294379 | 2018-01-09 07:24:45.35667  |   3062291 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19935 |
    101 |  6445 | 23149 | 29646 | 2018-01-09 07:24:41.757875 | 2018-01-09 07:24:41.818262 |     60387 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19907 |
    101 |  6443 | 23145 | 29645 | 2018-01-09 07:24:41.311989 | 2018-01-09 07:24:43.863402 |   2551413 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19924 |
    101 |  6441 | 23135 | 29644 | 2018-01-09 07:24:40.758095 | 2018-01-09 07:24:40.806071 |     47976 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19907 |
    101 |  6440 | 23131 | 29643 | 2018-01-09 07:24:40.173154 | 2018-01-09 07:24:40.244755 |     71601 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19909 |
    101 |  6439 | 23127 | 29642 | 2018-01-09 07:24:39.645264 | 2018-01-09 07:24:39.703516 |     58252 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19912 |
    101 |  6438 | 23123 | 29641 | 2018-01-09 07:24:36.940653 | 2018-01-09 07:24:41.300127 |   4359474 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19972 |
    101 |  6437 | 23119 | 29639 | 2018-01-09 07:24:36.330274 | 2018-01-09 07:24:39.203011 |   2872737 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19939 |
    101 |  6436 | 23115 | 29638 | 2018-01-09 07:24:35.773597 | 2018-01-09 07:24:35.830061 |     56464 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19916 |
    101 |  6435 | 23111 | 29634 | 2018-01-09 07:24:33.115456 | 2018-01-09 07:24:36.479659 |   3364203 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19948 |
    101 |  6434 | 23107 | 29630 | 2018-01-09 07:24:32.584534 | 2018-01-09 07:24:32.646072 |     61538 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19916 |
    101 |  6433 | 23103 | 29624 | 2018-01-09 07:24:30.597547 | 2018-01-09 07:24:35.175949 |   4578402 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19976 |
    101 |  6432 | 23098 | 29623 | 2018-01-09 07:24:27.485494 | 2018-01-09 07:24:32.095192 |   4609698 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19967 |
    101 |  6431 | 23099 | 29622 | 2018-01-09 07:24:27.460055 | 2018-01-09 07:24:30.105267 |   2645212 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19921 |
    101 |  6429 | 23088 | 29620 | 2018-01-09 07:24:23.86411  | 2018-01-09 07:24:26.951243 |   3087133 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19933 |
    101 |  6428 | 23084 | 29619 | 2018-01-09 07:24:23.350164 | 2018-01-09 07:24:26.923327 |   3573163 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19948 |
    101 |  6427 | 23080 | 29617 | 2018-01-09 07:24:22.816612 | 2018-01-09 07:24:22.878321 |     61709 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19917 |
    101 |  6426 | 23076 | 29615 | 2018-01-09 07:24:20.596211 | 2018-01-09 07:24:23.41062  |   2814409 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19934 |
    101 |  6425 | 23072 | 29614 | 2018-01-09 07:24:17.944237 | 2018-01-09 07:24:22.357737 |   4413500 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19965 |
    101 |  6424 | 23068 | 29613 | 2018-01-09 07:24:17.542087 | 2018-01-09 07:24:20.140683 |   2598596 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19922 |
    101 |  6423 | 23064 | 29611 | 2018-01-09 07:24:13.548092 | 2018-01-09 07:24:17.038456 |   3490364 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19942 |
    101 |  6422 | 23060 | 29610 | 2018-01-09 07:24:13.275254 | 2018-01-09 07:24:17.519558 |   4244304 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19972 |
    101 |  6421 | 23056 | 29609 | 2018-01-09 07:24:09.725301 | 2018-01-09 07:24:12.742559 |   3017258 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19937 |
    101 |  6420 | 23049 | 29606 | 2018-01-09 07:24:08.749447 | 2018-01-09 07:24:13.095877 |   4346430 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19965 |
    101 |  6419 | 23045 | 29604 | 2018-01-09 07:24:04.305335 | 2018-01-09 07:24:09.23571  |   4930375 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19955 |
    101 |  6418 | 23041 | 29603 | 2018-01-09 07:24:03.776625 | 2018-01-09 07:24:08.32263  |   4546005 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19967 |
    101 |  6417 | 23037 | 29602 | 2018-01-09 07:24:00.946092 | 2018-01-09 07:24:03.86844  |   2922348 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19935 |
    101 |  6416 | 23033 | 29601 | 2018-01-09 07:24:00.365157 | 2018-01-09 07:24:00.426326 |     61169 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19902 |
    101 |  6415 | 23029 | 29600 | 2018-01-09 07:23:59.819784 | 2018-01-09 07:24:03.242515 |   3422731 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19948 |
    101 |  6414 | 23028 | 29599 | 2018-01-09 07:23:59.799912 | 2018-01-09 07:23:59.857123 |     57211 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19909 |
    101 |  6413 | 23021 | 29598 | 2018-01-09 07:23:59.264096 | 2018-01-09 07:23:59.322391 |     58295 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19916 |
    101 |  6412 | 23017 | 29596 | 2018-01-09 07:23:57.7795   | 2018-01-09 07:23:58.780458 |   1000958 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19920 |
    101 |  6411 | 23013 | 29595 | 2018-01-09 07:23:57.26003  | 2018-01-09 07:23:59.328003 |   2067973 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19941 |
    101 |  6410 | 23009 | 29594 | 2018-01-09 07:23:56.778329 | 2018-01-09 07:23:56.816416 |     38087 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19913 |
    101 |  6409 | 23005 | 29591 | 2018-01-09 07:23:52.948409 | 2018-01-09 07:23:57.282508 |   4334099 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19976 |
    101 |  6408 | 23001 | 29590 | 2018-01-09 07:23:52.718616 | 2018-01-09 07:23:56.265055 |   3546439 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19948 |
    101 |  6407 | 22997 | 29589 | 2018-01-09 07:23:52.463809 | 2018-01-09 07:23:52.508669 |     44860 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19913 |
    101 |  6405 | 22990 | 29588 | 2018-01-09 07:23:49.442342 | 2018-01-09 07:23:52.043546 |   2601204 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19925 |
    101 |  6404 | 22988 | 29587 | 2018-01-09 07:23:49.319247 | 2018-01-09 07:23:52.232331 |   2913084 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19939 |
    101 |  6403 | 22982 | 29586 | 2018-01-09 07:23:48.828383 | 2018-01-09 07:23:48.878367 |     49984 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19906 |
    101 |  6402 | 22978 | 29584 | 2018-01-09 07:23:45.381159 | 2018-01-09 07:23:48.346499 |   2965340 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19937 |
    101 |  6400 | 22973 | 29582 | 2018-01-09 07:23:44.876278 | 2018-01-09 07:23:48.974918 |   4098640 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19975 |
    101 |  6401 | 22974 | 29583 | 2018-01-09 07:23:44.87296  | 2018-01-09 07:23:44.93428  |     61320 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19901 |
    101 |  6399 | 22966 | 29557 | 2018-01-09 07:23:41.289948 | 2018-01-09 07:23:44.33476  |   3044812 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19931 |
    101 |  6398 | 22962 | 29556 | 2018-01-09 07:23:39.765167 | 2018-01-09 07:23:44.224508 |   4459341 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19961 |
    101 |  6397 | 22958 | 29555 | 2018-01-09 07:23:36.550619 | 2018-01-09 07:23:39.205487 |   2654868 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19921 |
    101 |  6396 | 22954 | 29554 | 2018-01-09 07:23:36.324456 | 2018-01-09 07:23:40.777505 |   4453049 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19965 |
    101 |  6395 | 22950 | 29553 | 2018-01-09 07:23:34.952797 | 2018-01-09 07:23:35.89604  |    943243 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19930 |
    101 |  6394 | 22946 | 29552 | 2018-01-09 07:23:34.461215 | 2018-01-09 07:23:34.533174 |     71959 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19918 |
    101 |  6393 | 22942 | 29551 | 2018-01-09 07:23:31.149011 | 2018-01-09 07:23:36.081644 |   4932633 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19955 |
    101 |  6392 | 22938 | 29550 | 2018-01-09 07:23:30.668058 | 2018-01-09 07:23:30.713567 |     45509 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19903 |
    101 |  6391 | 22934 | 29549 | 2018-01-09 07:23:30.120777 | 2018-01-09 07:23:30.16635  |     45573 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19902 |
    101 |  6390 | 22930 | 29548 | 2018-01-09 07:23:29.329718 | 2018-01-09 07:23:33.867924 |   4538206 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19969 |
    101 |  6389 | 22926 | 29547 | 2018-01-09 07:23:26.577623 | 2018-01-09 07:23:29.617644 |   3040021 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19931 |
    101 |  6388 | 22922 | 29546 | 2018-01-09 07:23:26.222392 | 2018-01-09 07:23:28.846429 |   2624037 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19929 |
    101 |  6386 | 22915 | 29545 | 2018-01-09 07:23:23.103574 | 2018-01-09 07:23:26.095053 |   2991479 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19971 |
    101 |  6385 | 22911 | 29544 | 2018-01-09 07:23:22.159931 | 2018-01-09 07:23:25.697656 |   3537725 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19945 |
    101 |  6384 | 22907 | 29543 | 2018-01-09 07:23:19.169335 | 2018-01-09 07:23:22.634489 |   3465154 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19949 |
    101 |  6382 | 22900 | 29540 | 2018-01-09 07:23:16.942298 | 2018-01-09 07:23:21.555966 |   4613668 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19968 |
    101 |  6381 | 22896 | 29539 | 2018-01-09 07:23:16.389867 | 2018-01-09 07:23:16.459412 |     69545 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19906 |
    101 |  6380 | 22892 | 29538 | 2018-01-09 07:23:15.896128 | 2018-01-09 07:23:15.939519 |     43391 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19915 |
    101 |  6379 | 22888 | 29537 | 2018-01-09 07:23:13.900199 | 2018-01-09 07:23:18.63462  |   4734421 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19952 |
    101 |  6378 | 22884 | 29536 | 2018-01-09 07:23:12.411923 | 2018-01-09 07:23:15.352914 |   2940991 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19939 |
    101 |  6377 | 22880 | 29535 | 2018-01-09 07:23:11.916123 | 2018-01-09 07:23:11.955523 |     39400 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19908 |
    101 |  6376 | 22861 | 29528 | 2018-01-09 07:23:09.352416 | 2018-01-09 07:28:00.746002 | 291393586 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19951 |
    101 |  6375 | 22873 | 29531 | 2018-01-09 07:23:08.671902 | 2018-01-09 07:23:13.414456 |   4742554 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19954 |
    101 |  6374 | 22869 | 29530 | 2018-01-09 07:23:07.937948 | 2018-01-09 07:23:11.446489 |   3508541 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19949 |
    101 |  6373 | 22865 | 29529 | 2018-01-09 07:23:04.677452 | 2018-01-09 07:23:07.435472 |   2758020 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19960 |
    101 |  6372 | 22861 | 29528 | 2018-01-09 07:23:04.312092 | 2018-01-09 07:23:09.351895 |   5039803 |       1 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19951 |
    101 |  6371 | 22857 | 29527 | 2018-01-09 07:23:03.263026 | 2018-01-09 07:23:08.168103 |   4905077 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19977 |
    101 |  6370 | 22853 | 29526 | 2018-01-09 07:23:02.716013 | 2018-01-09 07:23:02.782057 |     66044 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19904 |
    101 |  6369 | 22849 | 29523 | 2018-01-09 07:23:00.536051 | 2018-01-09 07:23:03.794093 |   3258042 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19935 |
    101 |  6368 | 22845 | 29522 | 2018-01-09 07:22:59.96383  | 2018-01-09 07:23:00.02624  |     62410 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19906 |
    101 |  6367 | 22841 | 29521 | 2018-01-09 07:22:59.448108 | 2018-01-09 07:22:59.498223 |     50115 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19904 |
    101 |  6366 | 22838 | 29520 | 2018-01-09 07:22:59.236562 | 2018-01-09 07:23:04.198576 |   4962014 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19965 |
    101 |  6365 | 22833 | 29519 | 2018-01-09 07:22:58.408617 | 2018-01-09 07:23:01.740162 |   3331545 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19936 |
    101 |  6364 | 22829 | 19274 | 2018-01-09 07:22:56.775202 | 2018-01-09 07:25:41.947086 | 165171884 |       0 | default                        | select * from SVL_QLOG order by starttime desc limit 30;     |
    101 |  6363 | 22828 | 29518 | 2018-01-09 07:22:55.636812 | 2018-01-09 07:22:58.715138 |   3078326 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19926 |
    101 |  6362 | 22824 | 29515 | 2018-01-09 07:22:55.036494 | 2018-01-09 07:22:58.910523 |   3874029 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19948 |
    101 |  6361 | 22820 | 29514 | 2018-01-09 07:22:53.820074 | 2018-01-09 07:22:57.880737 |   4060663 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19947 |
    101 |  6360 | 22816 | 29510 | 2018-01-09 07:22:51.101297 | 2018-01-09 07:22:55.101184 |   3999887 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19949 |
    101 |  6358 | 22809 | 29509 | 2018-01-09 07:22:50.66144  | 2018-01-09 07:22:54.55711  |   3895670 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19945 |
    101 |  6357 | 22807 | 29508 | 2018-01-09 07:22:50.503532 | 2018-01-09 07:22:50.574251 |     70719 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19903 |
    101 |  6356 | 22783 | 29478 | 2018-01-09 07:22:49.462797 | 2018-01-09 07:27:57.234723 | 307771926 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19965 |
    101 |  6355 | 22801 | 29507 | 2018-01-09 07:22:48.363099 | 2018-01-09 07:22:53.257247 |   4894148 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19973 |
    101 |  6354 | 22797 | 29506 | 2018-01-09 07:22:46.929611 | 2018-01-09 07:22:50.203191 |   3273580 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19970 |
    101 |  6353 | 22793 | 29505 | 2018-01-09 07:22:45.603989 | 2018-01-09 07:22:49.91444  |   4310451 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19946 |
    101 |  6352 | 22764 | 29474 | 2018-01-09 07:22:45.342697 | 2018-01-09 07:27:53.930329 | 308587632 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19967 |
    101 |  6351 | 22789 | 29500 | 2018-01-09 07:22:44.997805 | 2018-01-09 07:22:45.10206  |    104255 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19907 |
    101 |  6350 | 22785 | 29479 | 2018-01-09 07:22:44.560364 | 2018-01-09 07:22:47.895407 |   3335043 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19929 |
    101 |  6349 | 22783 | 29478 | 2018-01-09 07:22:44.409456 | 2018-01-09 07:22:49.462256 |   5052800 |       1 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19965 |
    101 |  6348 | 22774 | 29477 | 2018-01-09 07:22:41.599895 | 2018-01-09 07:22:46.426488 |   4826593 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19941 |
    101 |  6347 | 22770 | 29476 | 2018-01-09 07:22:40.972098 | 2018-01-09 07:22:41.050248 |     78150 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19905 |
    101 |  6343 | 22762 | 29471 | 2018-01-09 07:22:40.293033 | 2018-01-09 07:22:43.825148 |   3532115 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19924 |
    101 |  6345 | 22766 | 29473 | 2018-01-09 07:22:40.289741 | 2018-01-09 07:22:44.424409 |   4134668 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19933 |
    101 |  6346 | 22764 | 29474 | 2018-01-09 07:22:40.284981 | 2018-01-09 07:22:45.342222 |   5057241 |       1 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19967 |
    101 |  6344 | 22765 | 29475 | 2018-01-09 07:22:40.284647 | 2018-01-09 07:22:40.394369 |    109722 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19905 |
    101 |  6342 | 22763 | 29472 | 2018-01-09 07:22:40.272115 | 2018-01-09 07:22:43.963675 |   3691560 |       0 | default                        | SELECT * FROM ssbgz.lineorder_cp WHERE lo_commitdate > 19928 |
    101 |  6340 | 22743 | 29434 | 2018-01-09 07:22:18.167644 | 2018-01-09 07:28:15.79367  | 357626026 |       0 | default                        | insert into lineorder5 select * from lineorder;              |
    101 |  6339 | 22742 | 19273 | 2018-01-09 07:22:16.574951 | 2018-01-09 07:28:17.12974  | 360554789 |       0 | default                        | insert into lineorder4 select * from lineorder;              |
    101 |  6338 | 22741 | 19272 | 2018-01-09 07:22:14.629538 | 2018-01-09 07:28:12.886551 | 358257013 |       0 | default                        | insert into lineorder3 select * from lineorder;              |
    101 |  6337 | 22740 | 19271 | 2018-01-09 07:22:12.608778 | 2018-01-09 07:28:10.623632 | 358014854 |       0 | default                        | insert into lineorder2 select * from lineorder;              |
    101 |  6336 | 22739 | 19255 | 2018-01-09 07:22:10.598071 | 2018-01-09 07:27:52.192981 | 341594910 |       0 | default                        | insert into lineorder1 select * from lineorder;              |
    101 |  6325 | 22686 | 19349 | 2018-01-09 07:19:43.887564 | 2018-01-09 07:20:22.468674 |  38581110 |       1 | default                        | insert into lineorder3 select * from lineorder;              |
(110 rows)

最後に

今回の検証では、教師データとして事前にショートクエリを4000クエリ、40分間実行しましたが、実際にはもっと少なく、短時間でも良かったのかもしれません。一方、4000クエリ学習させても、3%のクエリはロングクエリと誤認識されていました。max_execution_timeをデフォルトの5000msよりも大きくすることで調整できるのかもしれません。

Redshiftには以前よりワークロードマネジメント(WLM)という機能があり、メモリ使用率や並列度を設定したキューを複数定義し、用途ごとにキューを分けて実行することが可能でした。予め用途が明らかな場合は有効な手法です。また、ショートクエリ対策にqueue hoppingという機能もありますが、これはクエリの実行時間がしきい値を超えたらロングクエリ用のキューに移行して、ショートクエリの実行を妨げるロングクエリの影響を緩和する機能です。何れの機能も専用のキューを事前に用意してキューをマイクロマネジメントしなければならず、さらにキューに割り当てられたメモリは利用されてないときは有効活用できないという課題がありました。

Short Query Accelerationは、明示的にロングクエリとショートクエリのキューを分割する必要がなく、かつショートクエリの判定に機械学習を応用することで、設定を有効にするだけで透過的に利用できるの画期的な機能ではないかと感じています。 同時に機能追加されたResult Cachingと今回、Short Query Acceleration の相乗効果で、ショートクエリの応答性能は大きく進歩しました。

この機能を利用したい場合は、上記の通り「ショートクエリアクセラレーションの有効化」して、Short Query Accelerationのベストプラクティスに従い、WLMクエリスロットカウントを15以下に設定してください。