C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 57 を表示中)
■32321 / )  SQLを一本化するには?
□投稿者/ ホカペ愛好家 (1回)-(2009/02/04(Wed) 21:37:11)

分類:[.NET 全般] 

ORACLEのPL/SQLについての質問です。
主に以下の2点で悩んでいます。

  ・SQLの共通部分をまとめられない(同じコードが散在してしまう)
  ・条件分岐を利用してまとめると、大層遅くなってしまう

たとえば「サブクエリが全く同じ2つのSQL文」「ORDER BY だけが変わるSQL文」「同じ内容を返す複数のカーソル」
…といったものです。


(共通部分をまとめたい例)


    INSERT INTO baz SELECT f.f1, b.b1 FROM foo f (SELECT b1, b2 FROM bar) b;  --サブクエリ部分は同じなので
    INSERT INTO qux SELECT f.f2, b.b2 FROM foo f (SELECT b1, b2 FROM bar) b;  --2回書きたくない


素人考えですが、テキスト置換やシンタックスシュガーに類する物のように思えるので、
何か手がありそうなのですが…。



(条件分岐で一本化した例)

    --2回書くのは嫌だなあ…
    IF a = 1 THEN
      INSERT INTO fuga SELECT wan.kuma, hoge.piyo FROM wan, hoge ORDER BY hoge.piyo, wan.kuma;
    ELSE 
      INSERT INTO fuga SELECT wan.kuma, hoge.piyo FROM wan, hoge ORDER BY wan.kuma, hoge.piyo;
    END IF;


    --1回だけど遅いなあ…
    INSERT INTO fuga 
      SELECT wan.kuma, hoge.piyo 
      ORDER BY
        CASE a WHEN 1 THEN hoge.piyo ELSE wan.kuma  END,
        CASE a WHEN 1 THEN wan.kuma  ELSE hoge.piyo END;


CASE文を並べれば一本化出来るのですが、事前に確定するような条件であっても
一行毎に条件を計算してしまってパフォーマンスが悪い…なんて書き込みを見たりして頭を抱えています。
「絞り込み条件はともかく、過剰な条件分岐をSQLに持ち込むべきではない」「複数のSQLに分けるべき」とも。


通常のプログラム言語ならライブラリソースやら何やらを量読めば指針がつかめるのだと思いますが、
PL/SQLについて、中庸な、きれいな(個人差ありますが)、平均的な、よくまとまった、という指針を得る
良い手だてがイマイチ思い浮かばず、場違いかとは思いつつ質問させて頂きました。



上記の問題に対するアドバイスの他、情報源や書籍など何でも構いません。
的を射ない厚かましい質問で申し訳ありませんが、差し支えなければ、どうかご教示ください。

返信 編集キー/


管理者用

- Child Tree -