DBチューニング的な観点から本当に別名を指定するとクエリが高速になるのか「SQL テーブル名 別名 as 速度」で検索ちゃん

毎日クソコードを読んでいて思った。
ご多分に漏れずORマッパーを使用しているにおかかわらず、コードの中にSQLが埋め込まれているわけだが、
その中で一点気になった点があったのである。
それは何かというと、テーブル名にs1だのe1だのと別名がついていて可読性が損なわれているというか、かく乱させられるのに腹がたったのである。
たしかやつらの言い分はこうだ。
「別名を定義したほうがシークウェルがハヤい」と。


ぶっちゃけそんなのには反対だ。
だって、テーブルに別名って、EmproyeeInfomationという変数をeifにしてるみたいなもんでしょ?
そっちのほうが変数名が短いから"多少は"早いなんて言われたらもうどんだけ古い考え方なんだよと。
かつてあまちゃんがjsのdocumentをdに置き換えて早くなったといってたけどそんなレベルだろと。
思うわけですよ。
なので「こっちのほうが早いから」という主張をしてアホみたいに暗号みたいなSQLを書くアホを駆逐するために
徹底的に調べたいと思う。


ちなみに前準備で調べた、別名を定義して検索をして早くなるっていう論で、


select col1, col2 from teeburu;


よりも


select teeburu.col1, teeburu.col2 from teeburu;


のほうが早くなるというのには賛成。
なぜなら、どの列が指定されているのか明示的になるからだ。
しかし、


select teeburu.col1, teeburu.col2 from teeburu;


よりも


select t.col1, t.col2 from teeburu as t;


のほうが速くなるということには納得できないのである。
ではいってみよう。
基礎から理解するデータベースのしくみ(5) | 日経 xTECH(クロステック)

●テーブルの別名を利用する

 テーブルに別名をつけて、フィールド名にはその別名をつけると、SQL文の解析処理を減らすことができます。例えば、

SELECT ID, NAME FROM CUSTOMERS
WHERE SAL < 1000
よりも、
SELECT a.ID, a.NAME FROM CUSTOMERS a
WHERE SAL < 1000
のほうが高速になります。

はいダメ。


OTN Japan - 404 Error

そうですか?
たしかに数行ではたかがしれてますが実務では長いSQLも当然ありますし。
どの程度の効果があるかはシステムによっても異なると
思いますがアプリケーションから大量のSQLが発行されて
shared_poolからなるべく追い出されないようにするためにも
SQLは短いにこしたことはないと思います。

いつも書いてるけど、こういうところには質問の意図というか。
そういうものを正確に把握できてる人が少ないよね。
で、ぜんぜんダメ。


ホームページ移転のお知らせ - Yahoo!ジオシティーズ

× SELECT col_1, col2 FROM SomeTable ;
○ SELECT S.col_1, S.col2 FROM SomeTable S ;

ダメ。


SQL文の字下げルール - dondari

テーブルは必ず別名
なにかの記事で、そうすることで僅かだがパフォーマンスが上がると見かけたので始めた。*1
最近は単一テーブルのSELECTでも記述する。後になってJOINするケースはしばしばありますが、そのときに初めて別名をつけると変更箇所が増えてしまうので。

理解が浅い!
っていうか"テーブルに別名"じゃなくて"列にテーブル名付加"じゃん。
別名関係ねぇ。


■T'sWare Access Labo #52 〜クエリパフォーマンスの定石を試す(6)〜

このとき、テーブル名として、データベース内にあるテーブル名を直接指定するよりも、テーブル名を別名で定義し、その別名を使って「別名.フィールド1, 別名.フィールド2,・・・・」というようにした方がパフォーマンスがよいというのが定石の考え方です。

おお!!kt----!!!

ご覧のように、ほぼ完全に”違いはない!”という結果になっています。

おおお!!!
ついにマトモな文献を発見。
やはり仮説通りの可能性。
ただ、まぁおそらく古い文献ぽいので今は違うかもしれぬ。


ORACLE/オラクルSQLリファレンス(チューニング)

● テーブルに別名を付ける
  テーブルに別命を付けると、解析速度が向上するので、別名を付けるようにする
 ○ select a.emp_id, a.emp_name from emp a;

 × select emp_id, emp_name from emp;

ダメ。
つーか別名をつけるようにするとかいった直後つけてないSQLを書くのはどういう了見?


ヒント句の記述について - SQL> shutdown abort

SQL文内で表の別名を使用している場合、
使用している別名でヒントの指定をしないと、
ヒントが有効になりません

オプティナイザヒントか・・・
まぁ近い感じはするけど別物だな。
そもそも暗号SQLを書く人間がそんな高等なことはできないww


http://www.1keydata.com/jp/sql/sql-join.php

それは明らかに複雑になります。ここで見たテーブル別名の用途: SQL文が分かりやすくなることがあり、特に幾つかのテーブルを含むSQL文の場合。

涙目


http://www.sepia.dti.ne.jp/yonsama/help_page/reference/knowhow.html

中2. テーブル名には別名をつける
解析時にどの列がどのテーブルに属するかの判定を省略できるため高速になる

典型的ダメパターン。
「列名にはテーブル名をつける」と書くべき。


rAreSoft - はじめたばかりのデータベース - 基本

4. テーブル別名を使う。
  長いテーブル名の場合などは、別名を使いましょう。
  SQL文が短くなり、見やすくなります。

ならねーーんだよ!涙目


もーぜんぜんダメ。あとは自分で試す。


で、やってみた結果。

681 行の検索結果


・列名になにもつけない:実行時間:64 ms.
・列名にテーブル名:実行時間:31 ms.
・列名に別名:実行時間:34 ms.
・列名にすげぇ長い別名:実行時間:64 ms.(64桁に切り詰められた)

3002325 行の検索結果


・列名になにもつけない:実行時間:147202 ms.
・列名にテーブル名:実行時間:146329 ms.
・列名に別名:実行時間:152191 ms.
・列名にすげぇ長い別名:実行時間:152136 ms.

って感じになった。
仮説の通りになってるっぽいんだけどちと納得がいかない。
おそらくJOINしたときに違いが表れるんだと思うからそのへんもやりたい。
とりあえず、単一テーブルの検索に関しては別名とか関係ねーってことでFA。
わかったかクソコード量産機ども!!

*1:多分パースが早くなるのだと思われますので、現在の高性能サーバ機では微々たるものかも

うーむ

マイナビバイトの広告で石川遼氏がでてて
「続けられるバイトより続けられるバイトがいいね」ってあるんだけど、
「マイナビ」のイメージキャラクターにプロゴルファー 石川 遼選手を起用|株式会社 毎日コミュニケーションズのニュースリリース]
ゴルフはバイトなのか???

railsシェル radrails

eclipseradrailsプラグインいれてるんだけど、railsシェル の挙動が謎すぎる。
なんなんだこりゃ??
バージョンが古いのかhelpをみてコマンド入れてもそんなコマンドはないとかいわれるんですが・・・