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

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

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

Re[2]: SQLを一本化するには?


(過去ログ 57 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■32321 / inTopicNo.1)  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について、中庸な、きれいな(個人差ありますが)、平均的な、よくまとまった、という指針を得る
良い手だてがイマイチ思い浮かばず、場違いかとは思いつつ質問させて頂きました。



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

引用返信 編集キー/
■32322 / inTopicNo.2)  Re[1]: SQLを一本化するには?
□投稿者/ はつね (942回)-(2009/02/04(Wed) 23:03:24)
No32321 (ホカペ愛好家 さん) に返信
> ORACLEのPL/SQLについての質問です。
> 主に以下の2点で悩んでいます。
>
>   ・SQLの共通部分をまとめられない(同じコードが散在してしまう)
>   ・条件分岐を利用してまとめると、大層遅くなってしまう

.NET全般ということでクライアント側から文字列としてSQL文を投入してという
前提であれば、文字列の共通部分の管理手法などが使えると思います。
要は、実際に投入するSQL文での重複などは気にせず、SQL文を組み立てるとき
に共通部分を一元化するというイメージです。


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

サブクエリ部分を定数文字列として定義しておいたり、そこを返すプロパティ
を定義しておいたらどうでしょうか。

引用返信 編集キー/
■32324 / inTopicNo.3)  Re[2]: SQLを一本化するには?
□投稿者/ まさる (64回)-(2009/02/05(Thu) 00:36:46)
まさる さんの Web サイト
「PL/SQLで」ということであれば、EXECUTE IMMEDIATE や、OPEN カーソル FOR などを使い、動的SQLとして実行してはいかがですか。
引用返信 編集キー/
■32330 / inTopicNo.4)  Re[1]: SQLを一本化するには?
□投稿者/ Jitta on the way (269回)-(2009/02/05(Thu) 07:56:28)
No32321 (ホカペ愛好家 さん) に返信
> 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回書きたくない


これだけなら、ビューにしておくとか。
引用返信 編集キー/
■32391 / inTopicNo.5)  Re[2]: SQLを一本化するには?
□投稿者/ ホカペ愛好家 (2回)-(2009/02/05(Thu) 21:05:10)
お返事ありがとうございます。


>文字列の共通部分の管理手法などが使えると思います。

アプリ側で切り貼りすれば、使い回しも自由自在ということですね。
是非とも活用したいと思います。


> 動的SQLとして実行してはいかがですか。

調べてみると、動的SQLならばPL/SQL内で「切り貼り」した物を実行出来ちゃうのですね。
細かく変わる条件の対応などにもPL/SQL側で対応出来るとなれば
「アプリ側でSQL作って投げちゃ駄目!」という場合でも心配しなくて済みますね。


> ビューにしておくとか。

恥ずかしながら、そもそもビューにするという考えがありませんでした。
いろいろな場所で同じようなことをしているのであれば、テーブルのように扱えるビューにすることで
SQLの読みやすさだけではなく、扱いやすさにも大きく貢献しそうですね。



この3つを取っかかりにして、方々を整えてみたいと思います。
お三方ともアドバイスありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -