夏椰の東屋

- お遊び記録 -

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  108  : 記事  1  : コメント  3974  : トラックバック  30

ニュース


落書きしてね♪

IAM
僕がとった写真です。
ご自由にお使いください。

フィードメーター - 夏椰の東屋 track feed
広告


記事カテゴリ

書庫

日記カテゴリ

Other Site From Kaya

同じ結果を返すSQLでも、

パフォーマンスに差が出たりすることは、ご存知かと思います。

今日はその一番わっかりやすい例を出したいと思います。

?

?

以下はT1というテーブルの構成列です。

ID VAL

このテーブルからIDが1のものについて、IDと合算したVALの値を取得する場合

2種類のSQLが出てきたりします。

1) SELECT ID, SUM(VAL) FROM T1 WHERE ID = 1 GROUP BY ID ;

2) SELECT ID, SUM(VAL) FROM T1 GROUP BY ID HAVING ID = 1;

この2つのSQL、期待した動作としてはどちらも正しいのですが、

2)については、駄目だしされます。

さて、なぜでしょう?

?

?

これはSQLトレースを取って見るとわかりやすいので、

上記2パターンでとったSQLトレースの内容を提示してみます。

#今回はわかりやすかったのでOracle10gでの実行計画です。

1)のトレースは以下のものになります。

================================================================================

SQL> select sum(val) from t1 where id = 1 group by id ;

実行計画
----------------------------------------------------------
Plan hash value: 2965048539
-----------------------------------------------------------------------------
| Id? | Operation??????????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |
-----------------------------------------------------------------------------
|?? 0 | SELECT STATEMENT???? |????? |? 3529K|??? 87M|? 3706?? (8)| 00:00:45 |
|?? 1 |? SORT GROUP BY NOSORT|????? |? 3529K|??? 87M|? 3706?? (8)| 00:00:45 |
|*? 2 |?? TABLE ACCESS FULL? | T1?? |? 3529K|??? 87M|? 3706?? (8)| 00:00:45 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
?? 2 - filter("ID"=1)
Note
-----
?? - dynamic sampling used for this statement

統計
----------------------------------------------------------
????????? 0? recursive calls
????????? 0? db block gets
????? 12723? consistent gets
????????? 0? physical reads
????????? 0? redo size
??????? 437? bytes sent via SQL*Net to client
??????? 384? bytes received via SQL*Net from client
????????? 2? SQL*Net roundtrips to/from client
????????? 0? sorts (memory)
????????? 0? sorts (disk)
????????? 1? rows processed

================================================================================

2)のトレースは以下のものになります。

================================================================================


SQL> select sum(val) from t1 group by id  having id = 1;

実行計画
----------------------------------------------------------
Plan hash value: 2966258745
----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |  7058K|   175M|  4864  (30)| 00:00:59 |
|*  1 |  FILTER             |      |       |       |            |          |
|   2 |   HASH GROUP BY     |      |  7058K|   175M|  4864  (30)| 00:00:59 |
|   3 |    TABLE ACCESS FULL| T1   |  7058K|   175M|  3659   (6)| 00:00:44 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("ID"=1)
Note
-----
   - dynamic sampling used for this statement

統計
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      12723  consistent gets
          0  physical reads
          0  redo size
        437  bytes sent via SQL*Net to client
        384  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

================================================================================

?

?

この2つの違いはどこにあるでしょうか?

?

?

1)ではテーブルアクセス時にID=1でフィルターがかかっているのがわかります。

#  |*? 2 |?? TABLE ACCESS FULL? | T1?? |? 3529K|??? 87M|? 3706?? (8)| 00:00:45 |
#???? 2 - filter("ID"=1)

#? この2行でテーブルアクセス時にID=1でフィルターをかけているとわかります。


2)ではGROUP BYした後にID=1でフィルターがかかっているのがわかりますね。

#??? |*? 1 |? FILTER???????????? |????? |?????? |?????? |??????????? |????????? |
#??? 1 - filter("ID"=1)
#??? |?? 2 |?? HASH GROUP BY???? |????? |? 7058K|?? 175M|? 4864? (30)| 00:00:59 |
# この3行でグループ化の後にID=1でフィルターをかけているのがわかります。

?

?

?

・・・ということはですよ。

2)のSQLは全件読み取ってID毎にグループ化してから必要なデータを探し出していますね。

よって、どちらが早くて良いSQLかと問われたら・・・・1)のSQLとなりますね。

?

この様にして"SQLの動作の違い"が見え始めると、

実はオプティマイザといわれているものがどのように動いているのか、

どのようにSQLが実行されていくのかが見えるようになってきます。

?

今あなたの目の前にあるSQLクン、

実は自分の頭の中で想像している動作と違う動きをしているかも知れませんよ?

?

そんなときは実行計画をとってみて、

どういう処理しているの?って見てあげると楽しいかと思います♪

?

投稿日時 : 2006年11月30日 1:33

コメント

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 9:29 ひろえむ
おお。

確かに、このあたりのSQLによるパフォーマンスチューニングってまとまった資料があんまりないんですよね(^^)

インデックス云々はあったりしますが・・・。

勉強になります。

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 10:35 夏椰
確かにインデクスの"使われ方"、"作り方"について目がいきやすいかもしれません。


ただ その前提にある
"効率がよいSQL"
ってDBMSやバージョンにより
それぞれ違う部分があるので
難しいってか面倒かもしれませんね。
#解析や計画の立て方次第だから


ただ 不変的ものもあるので
知ってほしいとは思いました♪


実は今回の投稿をするにあたり、
最初はSQLServer2005で結果とっていたんですが
頭が良いのか
あまり差異がでてくれなくて
ORACLEに切り替えました(爆)

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 11:44 επιστημη
毎回「へー」とか「ほー」とか「あぁ?」とか感じながら読ませてもろてます。

データベースとはとんと御縁がないもんだから、7割がたワケわかんないながらもなんかこー通じるものがあるなーと感じてます。

今回のはぶっちゃけ「いかに速く対象物の候補を減らすか」なのよね? ね?
# 論理式のshort-cutを思い起こしておりまする

夏椰さんをスピーカに迎えて「サルならわかるSQL」ちゅーのを
わんくま勉強会でイッパツお願いしたいっすゼヒゼヒ。


# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 12:16 ひろえむ
サルです、私w

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 12:42 επιστημη
だそうです。おねがいしますわんわん。

# チャイナドレスで是非!という声が各所から上がっている模様。
# そんときゃ「極上ジャスミン茶」およびスピーカに似つかわしく「東方美人」を振舞いますので


# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 13:33 刈歩 菜良
> 「サルならわかるSQL」
え~、サルしかわかんないのぉ。
って、わたくしもさるでござるから、無問題!
ってことで私も一票!

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 14:07 backdoor
以前ORACLEのSEの方から「当社のSEでは考えられないような(めちゃくちゃな)チューニングをして考えられないパフォーマンス出しているユーザさんがいらっしゃる」ことを聞きました。

もしかして夏椰のことでしょうか?

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 14:46 επιστημη
>> 「サルならわかるSQL」
> え~、サルしかわかんないのぉ。

「サルでもわかるSQL」だとわかんなかったとき凹むやん。


# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 14:53 backdoor
敬称付け忘れました。m(__)m

もしかして夏椰さんのことでしょうか?



# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 16:04 夏椰
>えぴ様
簡単にいっちゃうと
重いグループ化処理の前に対象データ件数絞れや!
って事です。
プログラムもSQLもパズルだと私は思ってます。

だから組み合わせを考えるのが楽しい♪

#各所って何処っすか?(^-^;


>ひろえむ様
自分より大きいサルはへこみますぅ(笑)

>かるぼさん
いや問題ありますよ(笑)
私は猿語しゃべれにゃ(爆)


>backdoorさん
こんにちは。書き込みありがとうございます。

残念ながら私ではないと思いますよ。
繋がりもっていませんから(^-^)

それに私は趣味で複雑なSQLを書いたりはしますが
仕事はメンテナンス+可読性重視なんで
基本的にバリバリチューニングが必要なものを出しませんから。

#呼び捨て気になってなかったです(笑)
#普段(リアル)は常に呼び捨てですし♪

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 16:43 επιστημη
> 簡単にいっちゃうと
> 重いグループ化処理の前に対象データ件数絞れや!

ナトーク。
もちーと突っ込むと、SQLServerくんはその遅い方([2])食わすと勝手に([1]みたく)組み替えて早くしちゃうってこと?
それともそーゆー"おぷちまいず"をやんなくてもネが早いの?

> #各所って何処っすか?(^-^;

そらもー←方面とか↑方面とか任意のε近傍で。


# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 17:13 ひろえむ
趣味で複雑なSQLってのもすごいな(^^;;;

>自分より大きいサルはへこみますぅ(笑)
サルというよりゴリラかorz

じゃ、ゴリラでもわかるSQLで・・・w

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 17:27 夏椰
>えぴ様
そーです。
SQLServerでの実行計画には差異がありませんでした。

それを良しとするか悪しとするかは意見の分かれるところで………
#想定通りになってくれない!!
#って辛かったりしますから(笑)


>ひろえむ様

わかりました。
発想をひねり
「ゴメスでもわかる」でいかがでしょう?(爆)
#ゴメス=ゴメス チェンバリン
#チンパン ニュース チャンネルの司会者

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 17:51 επιστημη
うぇーい、やる気だやる気だ > 「ゴメスでもわかるSQL」
# 次回は2月だよねー、茶の用意をしなくっちゃ♪


# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 20:03 中博俊
最近複雑なテーブル組み合わせについていけない中です。
最近JOINは10個くらいが限度で、テーブル変数に入れてしまいます。
あれ、違う話になっている。(^^

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 20:24 夏椰
>えぴ様

うわっしまったΣ(^-^;
いや やる………んすかぁ?(笑)

何喋るかわからんとですよ(笑)

>中様
10個で十分ですよ(^-^;
ってか10個も繋ぐ要件や設計が気になります(笑)

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 21:24 επιστημη
やるっしょ。

パフォーマンス炸裂の最初の一歩・・・・夏椰?

# だーれがうまいことを言えと


# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/11/30 21:34 ひろえむ
ゴメス・・・(^^;;
それはホントに解ったんですか!?(^^;;;;
心配で夜も眠れません。 いや、寝ますが(^o^;

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/12/01 9:18 夏椰
おはようございます。

>えぴ様

私から"何か"を引き出したい方がいるのか気になる今日この頃
って状態です(笑)

スピーカーしたことねぇしなぁ?
できるんやろか(笑)

>ひろえむ様
ごもっとも?
といえば解ったような気がする!!(爆)
#だめっすか すみましぇん

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/12/01 11:14 Oganc
Ognac猿です。
 客先のOracle8iでは明らかな差がでました。
ということは Having句の存在はなくても支障がないってことですよね
世の教科書では Having句は Group句並みの重みで扱ったりしてます。
その影響なのか,記述標準にHavingを規定している所もあります。
大きな声で改善を叫ぼっと


# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/12/01 11:40 夏椰
having自体に存在意義はあると思います。

ただ グループ化→集計した結果に対し条件つけたい
とかはですが。

# having max(val) > 100 とか


例みたいにwhereに書けるのをhavingに書くのはよろしくないよん
ってことですわ(o^_^o)

# re: パフォーマンス差異の最初の一歩・・・・かな? 2006/12/02 11:47 ぽぴ王子
選別してからグループ化するか
グループ化してから選別するか

の違いですよね。
先にグループ化してから選別したほうがいい場合もあるので、having句はそれだけに使用すべきと。
そのためのものですし。

> ゴメスでもわかるSQL

やっぱりセッションの締めはみんなして「ごもっともー!」なんでしょうか。

SQLに限らず、こないだVSUG DAYで田中さんと話し合ったのだけど「なぜそうなるのか」を知ってると
知らないとではぜんぜん違うよね、と。
さすがにRDBの概念にまでさかのぼれとかは言わないけれど(笑)自分が書いているSQLがどういう風に
動いているのかぐらいは知っておいてほしいなと。
という僕も、10年ぐらい前にORACLEの出張セミナ(Microsoft Onみたいなの)で教えてもらって
いろいろ意識するようになったクチですけども。

# 早い話。KISSの精神を忘れちゃイケナイって事だと思う 2007/01/12 18:48 Aileron
物事は単純に考えろ
単純に行えって事だと思う。

あるIDのデータの合計値を出したいって処理の際に

まず、あるIDのデータ郡を取り出し
取り出したデータ郡の合計値を作り出す。

これを

全てのIDのデータ郡において、合計値を作り出し
あるIDのデータ郡に対しての合計値だけを抜き出す

ってな事をしたら遅いだとか、早い以前に
処理内容として何かオカシイ。

SQLも、プログラム言語なのだから
ロジックを考え、構築し行えって事何だと思う。

だから、パフォーマンスと言うよりか

KISSとかの精神を忘れたら、
パフォーマンス等にも影響が出るんだよ。

っていう良い例な感じに思えた。

# re: パフォーマンス差異の最初の一歩・・・・かな? 2007/01/12 22:38 夏椰
こんばんは。
コメントありがとうございます。


KISSとかの精神がわからないのですが、

理解して楽しく使っていただきたいなぁと思ってます。


SQLでややっこしいのは
同じSQLでもデータ量などによって
動作が変わることかも?と思ったりします。
ある程度推測はできますけど、絶対ではない事も多いし。

確実にコントロールできないのが嫌な要因かもしれません。

#他にもたくさん要因がありそうですが………


"楽しい"って 言ってくれる人がいたら嬉しいなっ(o^_^o)

# BfXygoADWXIqjusD 2011/12/26 22:59 http://www.discreetpharmacist.com/ita/index.asp
Yet, much is unclear. Could you describe in more details!...

# LsbEacBkQKqx 2011/12/27 5:55 http://www.hansensurf.com
Stupid article..!

# ahyiaKPPiwfEBCNIcCD 2011/12/27 6:00 http://www.hansensurf.com
Excellent! Got a real pleasure..!

# dwculmRuGxd 2011/12/28 2:52 http://www.seokiwi.com
Yeah? I read and I understand that I do not understand anything what it is about:D

# sMEQPLbgPCfkjvtMe 2011/12/28 6:39 http://www.seokiwi.com/
The topic is pretty complicated for a beginner!...

# AgAiSlcHeetpWgt 2012/01/14 2:50 http://www.avidelectrical.com.au/
comment4

# buy stromectol pills 2021/09/28 20:00 MarvinLic
stromectol covid https://stromectolfive.com/# ivermectin 6

# ivermectin 6mg dosage 2021/11/01 7:33 DelbertBup
ivermectin iv http://stromectolivermectin19.com/# ivermectin buy australia
ivermectin 18mg

# ivermectin oral 0 8 2021/11/02 10:43 DelbertBup
ivermectin lotion cost http://stromectolivermectin19.online# ivermectin 50ml
ivermectin 80 mg

# prednisone tablets 2.5 mg https://prednisonesnw.com/#
50mg prednisone tablet 2021/11/13 9:44 Prednisone
prednisone tablets 2.5 mg https://prednisonesnw.com/#
50mg prednisone tablet

# cheap generic pills 2021/12/04 15:21 JamesDat
https://genericpillson.com/# generic ed pills from canada cytotec

# sildenafil citrate tablets 100 mg 2021/12/06 20:42 JamesDat
http://viasild24.com/# how to take sildenafil 20 mg

# sildenafil 20 mg tablet uses http://viasild24.online/
2021/12/07 19:28 Nyusjdh
sildenafil 20 mg tablet uses http://viasild24.online/


# how many sildenafil 20mg can i take 2021/12/11 12:01 JamesDat
http://iverstrom24.online/# stromectol what is it

# bimatoprost 2021/12/11 17:27 Travislyday
http://plaquenils.com/ plaquenil cost

# buy bimatoprost 2021/12/12 12:10 Travislyday
https://stromectols.com/ ivermectin usa price

# bimatoprost generic 2021/12/13 7:58 Travislyday
http://plaquenils.online/ plaquenil singapore

# careprost bimatoprost for sale 2021/12/14 22:53 Travislyday
http://baricitinibrx.com/ baricitinib coronavirus

# bimatoprost generic best price 2021/12/16 12:07 Travislyday
http://baricitinibrx.com/ baricitinib price

# stromectol cream 2021/12/18 11:46 Eliastib
dpezde https://stromectolr.com ivermectin 6mg dosage

# clomid generic name https://clomidt.com
clomid 50mg 2022/01/03 19:24 Clomid
clomid generic name https://clomidt.com
clomid 50mg

# stromectol 6 mg dosage 2022/02/17 22:05 JamesGaf
https://stromectolst.com/# ivermectin nz
stromectol cream

# ivermectin otc 2022/02/20 16:28 Jamesscons
https://stromectolis.com/# oral ivermectin cost

# stromectol generic name 2022/02/21 14:28 Jamesscons
https://stromectolis.com/# stromectol tablet 3 mg

# generic doxycycline https://doxycyline1st.com/
generic doxycycline 2022/02/26 8:26 Jusidkid
generic doxycycline https://doxycyline1st.com/
generic doxycycline

# buy furosemide online https://buylasix.icu/
lasix for sale 2022/06/25 1:11 LasixRx
buy furosemide online https://buylasix.icu/
lasix for sale

# nabp approved canadian pharmacies https://noprescriptioncanada.com/
canadian prescription drug prices 2022/12/16 23:47 NoPrescript
nabp approved canadian pharmacies https://noprescriptioncanada.com/
canadian prescription drug prices

# Get warning information here. Read information now.
https://edonlinefast.com
Prescription Drug Information, Interactions & Side. Drug information. 2023/02/17 12:20 EdOnline
Get warning information here. Read information now.
https://edonlinefast.com
Prescription Drug Information, Interactions & Side. Drug information.

# buy meds online https://pillswithoutprescription.pro/# 2023/05/16 11:34 PillsPro
buy meds online https://pillswithoutprescription.pro/#

Post Feedback

タイトル
名前
Url:
コメント