時代に即したMySQレの新機能:PLEASE句

 最近は、会社などの組織において仕事の指示をする場合に、単に上司が命令をするだけでは組織は動かないと言われています。部下に仕事をしてもらうには--そう、まさにこの「してもらう」の気持ちこそが本質なのですが--「命令」ではなく「依頼」の形を取ることで、お互いに気持ちよく仕事をすることができ、より良いチームとなるのです。


 この世の中の流れは近年、ソフトウェアの世界にも強く適用されるようになってきました。ソフトウェアに於いても、常に、より中立的な立場での対応が求められてきています。

 MySQレも例外ではなく、最近の修正ではレプリケーションの master-slave を source-replica と呼ぶように変更したり、blacklist を blocklist に変更したりなどの話題を目にした方も多いと思います。
 これら一連のポリティカリーにコレクトな対応に今回新たに加わったのが、冒頭で紹介した「依頼」の構文です。例を見てみましょう。まずシンプルなSELECT文である、

SELECT * FROM t1;

という命令。これは現代のポリティカルコレクトネス的にはアウトです。人間だからといってコンピュータに一方的に「命令」するのは、よろしくありません。MySQレの最新バージョンでは、この問題に対応しています。

SELECT * FROM t1 PLEASE;

命令ではなく、依頼。これが新しいデータベースの活用法です。

PLEASE句は、先頭に配置することもできます。

PLEASE UPDATE t2 SET c1=100 WHERE id=1;

命令ではなく、依頼。
ちょっとした気遣いで、依頼する側もされる側も気持ちよく仕事ができるのです。

 ある実験によると、PLEASEを付けて一ヶ月間運用を続けたシステムは、そうでないシステムと比べて、約6%のパフォーマンス向上が得られたとのことです(モーツァルトを聴かせて運用しているMySQレの性能が3%ほど高いという話と似ていますね)。

 コンピュータと人間とが共に気持ちよく過ごせる社会へ向けて、MySQレも進化し続けているのですね。頼もしいことです。



.


 なお、蛇足ながら本日4月1日でございますことを付記し、本アーティクルをおしまいとしたいと思います。
Please DO NOT believe this article.

[MySQL]


.

追記

 yoku0825 さんが、MySQL で実際に動くパッチを書いてくださいました。
blog.gmo.media

  • PLEASE句をエラーとせずに受け入れること
  • PLEASE句がついていないぶっきらぼうな「命令」には1秒間のサボタージュをしてから結果を返すこと
  • PLEASE句がついていないぶっきらぼうな「命令」にはwarningを出すこと。エラーコードにもこだわり
  • PLEASE句が書いていない場合にはエラーにするための SQL_MODE ("STRICT_PLEASE_MODE")の追加

の対応が為されているようです。バイナリは配布せず、ソースコードのパッチのみの公開。MySQL 5.6 をベースにしたのは、ビルドの速さ(トライ&エラーを繰り返しやすい)を重視して、かな。(MySQL 8.0 のビルドには結構時間がかかる)

 久々に、「才能の無駄遣い」と絶賛したくなるようなワザを目の当たりにしました。徐々にできあがっていく様子を yoku0825さんのtwitterで伺ったりしていくのは、面白かったです。

追記2

 あとは、結果を返してくれたことに対してお礼を言える THANK YOU 構文の実装が待ち望まれます。実装されれば、かなり MySQレとの距離を近づけるのに役に立ってくれそうです。



追記3

 澤田さんが PostgreSQL に実装してくれました! PLEASE句がないとインデックスを使ってくれないというのが特に新奇性! みんな、DBMSにちゃんと感謝してるんですね!

 さらに、THANK YOU 文まで実装!

 

追記4

 MySQレ について、「マイエスキューレ」という声がありますが(それはそれでイタリアではきっとそう呼ばれているのだろうと信じることにして)、実はMySQLだったというタネアカシ:-)



追記5

 オープンソースじゃないので Oracle database では無理だろうと思っていたら、中家さんが PL/SQL を使って遊んでくれました。pleaseをつけないと、ちゃんと遅くなってくれます!(・・・って、やりたいの、それだったっけ(笑)。付けると速くしたいんじゃなかったっけw)

 そしてソースコード。



追記6

 なんと、Spark SQL にも PLEASE句が! PLEASEつけないと DISTINCT しちゃうとか、極悪(笑)。
そうか、PLEASEつけないと 100件までしか出力しない、みたいな抗議行動も考えられるのか、とヒントをもらいました。

miyakelp.hatenablog.jp

追記7

 SQL Serverでのトライ! RDBMS本体側を書き換えることはできないので、TDSのProxy を噛まして、そのProxyで変換(PLEASE句の除去)やウェイトの挿入などを行っているようです。

blog.engineer-memo.com

追記8

 Redis にまで!!
RDBMSに、プログラムに、コンピュータに対して、単に命令するばかりでなく、感謝を込めて「お願い」する文化が少しずつ広がっていて、嬉しいです!




追記9

 「4/1に間に合わなかったけど」と、SQLite3 への実装(パッチ)も公開されました。大丈夫です、まだエイプリルフール5日目です!




追記10

 みなさんのTwitterでのやりとりが面白かったので、これは後生まで記録に残しておくべき!と、Togetterにまとめました。
togetter.com

たくさんの人に見ていただけて、トゥギャッター編集部さんの「本日のイチオシ」に選んでいただきました。みんなの開発パワー、すごい!



追記11

 それぞれの方が今回試みた技術的知見をそのままにしておくのは勿体ないということで、勉強会(発表会)が開催されることになりました。いや、べつにそんな大層な話じゃなくて「おもしろいからやろーぜー」というノリです。私も皆様の時間を奪った責任を取って1枠目で少しだけお話をさせていただきます。
connpass.com