読者です 読者をやめる 読者になる 読者になる

MySQL5.7で一瞬だけ入ったSELECT構文内の句

mysql manual

 昨日の日記で、DDLとかDMLの説明をちゃんとマニュアルで読みましょう、という事を書きました。SELECT文のページを見ていると、なにやら面白いことが分かったので、紹介します。開発が進むソフトウェアって生きているんだなと感じさせてくれる出来事です。

本日見るのは、SELECT文の文法について書かれた、このページ。
MySQL :: MySQL 5.7 Reference Manual :: 13.2.9 SELECT Syntax


 ここには、SELECT文のありとあらゆるオプション句について書かれています。以下の構文が紹介されていますね。

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [MAX_STATEMENT_TIME = N]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
      [PARTITION partition_list]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]


 これを、MySQL 5.6 と比べると、1行、5.7で加えられている句があります。
[MAX_STATEMENT_TIME = N]
です。
これは、指定されたミリ秒数をタイムアウトとする指定なのですが、興味深いのは、マニュアルに Note として記述された部分。

Note
This option was added in MySQL 5.7.4. It was removed in MySQL 5.7.8 in preference to the MAX_EXECUTION_TIME() optimizer hint. See Section 8.9.3, "Optimizer Hints"

MySQL 5.7.4 で加えられたのだけど、5.7.8 で外したよ、とのことです。 5.7.4といえば、まだ MR14の段階。5.7.8 は RC-2 の段階となります(5.7.9がGA)。試行錯誤を繰り返しながら開発が進んでいく様子には、わくわくしますね。



 ついでに、この句が除外された、5.7.8 のリリースノート(チェンジログ)も見てみましょうか。

MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.8 (2015-08-03, Release Candidate)

・The max_statement_time system variable was renamed to max_execution_time. The Max_statement_time_exceeded, Max_statement_time_set, and Max_statement_time_set_failed status variables were renamed to Max_execution_time_exceeded, Max_execution_time_set, and Max_execution_time_set_failed.

The MAX_STATEMENT_TIME option for SELECT statements was removed because its functionality is now available using the more general optimizer hint syntax (see Optimizer Hints). Statements that begin like this:

SELECT MAX_STATEMENT_TIME = N ...

Should be rewritten to begin like this:

SELECT /*+ MAX_EXECUTION_TIME(N) */ ...

There are some minor implementation differences between the two. MAX_STATEMENT_TIME was not permitted in non-top-level SELECT statements such as subqueries, or in stored programs, and produced an error. MAX_EXECUTION_TIME() is permitted in those contexts, but is ignored. (Bug #21306646, Bug #21306392, Bug #21306319)


 ヒント句で書いてね、ということですね。