FC2ブログ
 

Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


--年--月--日

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


2008年12月22日

HASH

SQLでテーブルをJOINする際には、テーブルの結合方法として
NEST LOOP結合、MERGE結合、HASH結合の3つがあるのですが、
どうもORACLEのオプティマイザはNESTED LOOPSを使いたがる
傾向があるようで・・・。

何も指定しないとほとんどNESTED LOOP。これってどうなんで
しょう?私が使っている環境だけ?

同じ件数同士のテーブルを結合する際は一般にHASHの方が速い
ということが言われますが、(MERGEはORDER BYの分、不利だ
とも・・・)ヒントは

SELECT /*+ USE_HASH(TABLE_A TABLE_B) +*/
・・・

てな具合に指定します。
ただし、注意が必要なのは「同じ件数同士」でも

1.テーブル自体の件数が同じ
2.where条件適用後の件数が同じ

ではまるで違います。ここで言うところの「同じ件数」は2.の
ほうなので、「HASHのほうが速いはずだよ。きっと。」と、ヒン
トを指定。すると30秒かかっていたSELECT文が0.5秒に。
ところが・・・同じSQLが異なる環境で「遅い。」という結果が。

SQLDeveloperで実行プランを見ると、HASHですねえ。確かに。
はあ、1分もかかってます。こりゃだめですねえ。
そんじゃまあ、ヒント、変えてみますか。どうなるの?

あ!っという間に終了。0.5秒です。NESTED LOOPだわ。やっぱり。
しかしまてよ。指定しないほうがいいんじゃないか。という考え
がよぎり、ノーヒントで実行。実行プランはNESTED LOOP。0.5秒。
とりあえず、オプティマイザまかせにしよう、ということに。

「転ばぬ先の杖」だったはずが「蛇足」になってしまいました。
ヘタにヒント使うと思わぬしっぺ返しをくらいます。

ちなみに私はNESTED LOOP信者です。
[ posted by H.K ]

この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/402-94624aa6
この記事にトラックバックする(FC2ブログユーザー)











上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。