最近は、会社などの組織において仕事の指示をする場合に、単に上司が命令をするだけでは組織は動かないと言われています。部下に仕事をしてもらうには--そう、まさにこの「してもらう」の気持ちこそが本質なのですが--「命令」ではなく「依頼」の形を取ることで、お互いに気持ちよく仕事をすることができ、より良いチームとなるのです。
この世の中の流れは近年、ソフトウェアの世界にも強く適用されるようになってきました。ソフトウェアに於いても、常に、より中立的な立場での対応が求められてきています。
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レとの距離を近づけるのに役に立ってくれそうです。
あとは、すごく頑張って抽出/集計して結果を返してくれたのに、いつも貰いっぱなしなのが気になっているので、THANK YOU 構文とかあると、よりMySQレとの良い関係を築けそう。
— 坂井 恵(SAKAI Kei) (@sakaik) 2021年4月1日
追記3
澤田さんが PostgreSQL に実装してくれました! PLEASE句がないとインデックスを使ってくれないというのが特に新奇性! みんな、DBMSにちゃんと感謝してるんですね!
面白い!!
— Masahiko Sawada (@masahiko_sawada) 2021年4月1日
PostgreSQLにもPLEASE句実装してみた。PLEASE句がないと1秒待たされるし、インデックスを使ってくれなくなります。 https://t.co/3xS3dikU4M pic.twitter.com/khfnM2PWG4
さらに、THANK YOU 文まで実装!
たしかにその通りですね!!
— Masahiko Sawada (@masahiko_sawada) 2021年4月1日
いつも頑張ってくれているPostgreSQLにお礼を言うために実装しました! pic.twitter.com/jjWPI2nsKC
追記4
MySQレ について、「マイエスキューレ」という声がありますが(それはそれでイタリアではきっとそう呼ばれているのだろうと信じることにして)、実はMySQLだったというタネアカシ:-)
ちなみに、そろそろ種明かししますけど、あのマイエスキューレに見えるやつ。実は MySQL だったって気づいていましたか? 物事は立体的に考えると真実が見えてくるという教訓が、そこにはあります。 pic.twitter.com/KZVD1Wa9Cj
— 坂井 恵(SAKAI Kei) (@sakaik) 2021年4月1日
追記5
オープンソースじゃないので Oracle database では無理だろうと思っていたら、中家さんが PL/SQL を使って遊んでくれました。pleaseをつけないと、ちゃんと遅くなってくれます!(・・・って、やりたいの、それだったっけ(笑)。付けると速くしたいんじゃなかったっけw)
差がわかりにくいけど、こんなのでよければ一応できたぽいです。ヒント句が表示されているのは単なるデバッグメッセージの消し忘れです。 pic.twitter.com/WnW5Sgl54e
— HiroyukiNakaie (@HNakaie) 2021年4月1日
そしてソースコード。
実現優先で非常に手抜きですがソース pic.twitter.com/ldLvC8WfVp
— HiroyukiNakaie (@HNakaie) 2021年4月1日
追記6
なんと、Spark SQL にも PLEASE句が! PLEASEつけないと DISTINCT しちゃうとか、極悪(笑)。
そうか、PLEASEつけないと 100件までしか出力しない、みたいな抗議行動も考えられるのか、とヒントをもらいました。
追記7
SQL Serverでのトライ! RDBMS本体側を書き換えることはできないので、TDSのProxy を噛まして、そのProxyで変換(PLEASE句の除去)やウェイトの挿入などを行っているようです。
Proxy でクエリを書き換えるという実装(遠い目)
— Masayuki Ozawa (@Masayuki_Ozawa) 2021年4月1日
SQL Server で PLEASE を実装してみる https://t.co/x4Cz1DMcEg
追記8
Redis にまで!!
RDBMSに、プログラムに、コンピュータに対して、単に命令するばかりでなく、感謝を込めて「お願い」する文化が少しずつ広がっていて、嬉しいです!
Redisにもplease getコマンド実装しました。 pic.twitter.com/MHFqbKHacu
— maru (@maruloop) 2021年4月1日
追記9
「4/1に間に合わなかったけど」と、SQLite3 への実装(パッチ)も公開されました。大丈夫です、まだエイプリルフール5日目です!
祭に乗り遅れてしまったけど書きました。 / “4/1に間に合わなかったけどSQLite3にPLEASE句を追加するパッチを書きました” https://t.co/8zoarqj9jY
— mattn (@mattn_jp) 2021年4月4日
追記10
みなさんのTwitterでのやりとりが面白かったので、これは後生まで記録に残しておくべき!と、Togetterにまとめました。
togetter.com
たくさんの人に見ていただけて、トゥギャッター編集部さんの「本日のイチオシ」に選んでいただきました。みんなの開発パワー、すごい!
@sakaikさんのまとめ https://t.co/bKvwlAjirh を本日の編集部イチオシに選ばせていただきました!作成ありがとうございます、素晴らしい技術力ですね!
— トゥギャッター編集部 (@tg_editor) 2021年4月4日
特集ページでも紹介しています。https://t.co/dJHzBtMsCO みてね!
追記11
それぞれの方が今回試みた技術的知見をそのままにしておくのは勿体ないということで、勉強会(発表会)が開催されることになりました。いや、べつにそんな大層な話じゃなくて「おもしろいからやろーぜー」というノリです。私も皆様の時間を奪った責任を取って1枠目で少しだけお話をさせていただきます。
connpass.com