Oracle 総合 Session6

このエントリーをはてなブックマークに追加
952NAME IS NULL:2009/02/05(木) 01:58:36 ID:???
動きがおかしいところがあってOracleサポート契約してたので問い合わせたら
不具合だが隠しパラメータで対応しろと言われたんだが
そんなんで直るなら公開orパッチで対応してほしいと思うのだが。。。。

もしかしてDBが完璧過ぎると会社が儲からないのか?
953NAME IS NULL:2009/02/05(木) 08:47:18 ID:???
よくあるよくある。
ウチもマニュアルと実際の動作に食い違いがあるって、
サポートに問い合わせたら、マニュアルの誤記だってあっさり言いやがった。
マニュアルの意味ねぇっぺよ。
954NAME IS NULL:2009/02/05(木) 22:45:56 ID:???
>>935
逆に聞くけど、こういうことしたい、こういうアプリ乗せたいって質問して、
じゃあこれぐらいメモリ積んでください。なんて答えられるデータベースあるの?
ハードもセットのDB2なら答えてくれるかな?
955952:2009/02/06(金) 00:25:24 ID:???
>>953
やっぱあるのかー
マニュアルの誤記とかすぐ直せるんだから直せよと。。。
956NAME IS NULL:2009/02/06(金) 08:10:11 ID:???
Oracleに限らんけどなw
957NAME IS NULL:2009/02/11(水) 13:40:23 ID:???
元々サポート前提のビジネスモデル。
買い切りの客は相手にしてない。
958NAME IS NULL:2009/02/12(木) 01:43:57 ID:???
Oracleのスタンスは製品の品質は80%で十分。
残りの20%は客がバグ出し及びブラッシュアップしてくれるというものです。
ラリーエリソンがそう言い切ったしw
959NAME IS NULL:2009/02/15(日) 21:53:26 ID:???
>958
ラリーそんなこと言ってた?
960NAME IS NULL:2009/02/16(月) 20:10:16 ID:???
テーブルの型を指定するときは数値型のときに
有効桁数を指定できるけど、演算結果には
どうやって有効桁数を指定したらいいのかな

SELECT AVG(hoge) AS a FROM unko GROUP BY chinko;

たとえばこのとき、有効桁数10桁で a を出力したいんだけど
やりかたがわからない。
961NAME IS NULL:2009/02/17(火) 00:16:37 ID:???
>>960
SQL*Plus なら
SQL> col a for 9999999999
とかだったかな。
環境に依存させない場合は to_char する。
962NAME IS NULL:2009/02/17(火) 02:43:42 ID:???
>>961
TO_CHARだと、小数点以下いくつを切り捨て、とかしか出来ない。
整数部の桁数を調べてそれを有効桁数から引いた分を指定する
のも考えたけど、そんなクエリどうやって書くのか・・・対数つかうの?
963NAME IS NULL:2009/02/17(火) 03:27:15 ID:???
まー、よく調べもしないで、、、。
964NAME IS NULL:2009/02/17(火) 08:42:03 ID:ONMV5oZt
質問させて頂きたく。

Aデータファイル:auto extend(on)自動拡張で拡張中
Bデータファイル:auto extend(off)作りたてで空きいっぱい

A,Bが同じ表領域で新しいextendが作られる場合は
どちらに作られるのでしょうか?

素人な質問で恐縮ですが、
何卒。。。
965960:2009/02/17(火) 14:47:58 ID:???
とりあえず、Oracle側では出来ないことがわかったので
スクリプト側で対処することにしました。
ありがとうございました。
966NAME IS NULL:2009/02/17(火) 23:10:36 ID:???
SELECT FOR UPDATE NOWAITを発行して20分くらい反応が無いのですが、コレは単純に検索に時間がかかっているという判断でいいのでしょうか?
約1億レコードのなかから90レコード程度だヒットする条件なのですが、時間がかかるかかる。

NOWAITをつけたのでロックされているようなら直ぐに反応があると思うのですが…
967NAME IS NULL:2009/02/17(火) 23:24:12 ID:???
FOR UPDATE無しなら?
968NAME IS NULL:2009/02/17(火) 23:46:51 ID:???
>>962
961 だけど、意図してる有効桁数って少数点以下も含んで
かつ整数部の桁数で少数部の桁数が変化するの?
有効桁数5桁として "0.1234" や "5678.9" にもなるし、
"0.0012345" もアリってこと?
むしろ、スクリプトでも何でも、どうやって対処したのか知りたい
んだけど。

整数部が上限3桁として、小数部も含めて5桁なら
substr( to_char( col, '999.99990' ), 1, 6)
とかかな。(必ず切り捨てにはなるけど)
969NAME IS NULL:2009/02/18(水) 00:00:30 ID:???
あっ、trim も入れないと駄目だなきっと。
970NAME IS NULL:2009/02/18(水) 01:34:40 ID:???
>>968
そうです。 123456で有効桁数5桁なら123450です。

1.2345E+5 にしないのは顧客のうんこ仕様ですが。
971NAME IS NULL:2009/02/18(水) 02:08:14 ID:???
>>970
それを有効桁数と言うのかは置いておいて、理解できない要求仕様だw
Oracleだけで実現するなら、FUNCTION作って、case式で書式返すと
かですかね。
972NAME IS NULL:2009/02/18(水) 10:00:05 ID:???
>>967
無しでも応答なしは一緒ですね…

ctrlCで中断できなくなり、コンソールを落としたらトランザクションが残ってしまいそうでそれもできず…
どうしたらいいのでしょう?
973NAME IS NULL:2009/02/18(水) 13:49:41 ID:???
>>972

実行計画見てちゃんと有効な索引が使用されているか確認。
974NAME IS NULL:2009/02/19(木) 00:56:33 ID:???
>>970
ならテーブルの定義でだってできないじゃん、そんなの。

有効桁数をAとしたとき、

floor(x/10^(floor(log10(x))+1-A))*10^(floor(log10(x))+1-A)

たぶんこれでできると思うけど、Oracleにはlogがないんだよな。
975NAME IS NULL:2009/02/19(木) 01:55:30 ID:???
まー、よく調べもしないで。
976NAME IS NULL:2009/02/21(土) 09:58:20 ID:???
>お前みたいな理屈っぽいのはOracle向かないよ。
>すべてを捨てて大らかな気持ちを持つことが
>Oracleを扱うエンジニアとしての第一歩さ。
こんにちは。APEX調べろと言われて調べ始めたのですが、
『ウッハー、読みにくいマニュアルっ。氏ねよ、ハゲッ!』とか
八つ当たりにきたのですが、心が満たされた思いがしました。
がんがります。
977NAME IS NULL:2009/02/24(火) 07:39:02 ID:???
1億レコードの中から90レコードを更新したい
という状況で俺なら

a)自己責任で検証できる環境にインポートする。
b)想定時間内に応答がない時点で、SHUTDOWN ABORTしてしまう。
c)SELECT ROWID FROM TABLE WHERE〜として何秒で90行返却されるか確定する。
d)cを情報源としてROWIDを用いたUPDATE文を90個作成して
 90回実行した時に何秒かかるか確定する。
 これより速い処理は、なかなか難しいので妥協点を知りたい。
e)もし、cが途中で止まるならSELECTが悪い。
  索引が必要か、サーバの性能不足や、なんらかのトラブルを抱えている。
  EXPLAIN PLANしてHASH JOINが利用されているなら、/*+ RULE */の
  ヒント文を入れてHASH JOIN以外を利用するようにしてみる。
f)もし、dが途中で止まるなら排他がかかっている。
g)1行1行の更新に時間がかかっているなら、
REDOログのファイルスタンプ、サイズと、
UNDOTBSの空き容量を調べて、
サイズが不足しているようならaに戻って環境を整備する。
978NAME IS NULL:2009/02/24(火) 23:36:41 ID:???
まぁ、c)が帰ってこないって書いてあるけどな。
979NAME IS NULL:2009/03/02(月) 23:36:19 ID:???
たいがいの問題は、お金で速い鯖買えば解決できる。
980NAME IS NULL:2009/03/03(火) 15:47:08 ID:???
5〜6時間かかるSQLを速くしてくれ、と頼まれた。
SQLは単なる検索で、1000万件クラスの表を5つ〜6つくらい結合して、
SELECTしてくるだけの簡単な処理。
Xeon2.0Ghz x 2にメモリ2GBのOracle10gで決して遅くはないと思う。
メモリやらディスク構成も特に変なところは無さそう。
ついでに多重実行は無しで常に接続ユーザは1人。

索引張ることも検討してみたけど、必要な列には全て張ってあって、
実行計画見たら、ほぼ全件舐めるもんだから、FULLアクセス頻発。

渡されたSQLの実行コストを見てみたら、100,000オーバー。
但し、SQLの方は変えるつもりは無いとのこと。
これはDBサーバ側のチューニングで何とかなるもんなんかね。

上司は単純にサーバ新調で何とかしようと考えてるっぽいけど、
どう考えても劇的に速くなるわけ無さそうなんだけど。。。
981NAME IS NULL:2009/03/03(火) 17:52:55 ID:???
>>980
結合しなければおk
982NAME IS NULL:2009/03/03(火) 18:32:34 ID:???
ああ作成したプログラムの仕様で、一度に投げられるSQLは1つまでらしいんだ。
索引が有効に働く程度のサイズくらいに、
データを絞り込んでやったら?とか言ったら、
不機嫌そうに、「そんな機能は無いです」だと。
983NAME IS NULL:2009/03/03(火) 19:15:04 ID:???
>>980
マテビューは?
984NAME IS NULL:2009/03/03(火) 19:38:41 ID:???
マテリアライズドビューは明日の提案・報告書に盛り込むつもりなんだけど、
こいつが作ったツールって、入力条件から動的にSQLを生成するツールなんですよね。
で、マテビュー使えないか、って以前に打診したら、
検索条件も結合条件も変わるから一概に使えるとは言えない、とか言ってた様な気が。
汎用的な検索ツールですからっ、とか言ってたけど、
どうせ現場で使うのってその中の数パターンなんだから、
典型的な奴で遅い奴だけでもマテビュー使えないか、とか考えてみます。
985NAME IS NULL:2009/03/03(火) 19:51:11 ID:???
>>984
厳しいですね。
参考までに,検索結果は概ね何件くらいですか?
986NAME IS NULL:2009/03/03(火) 21:04:22 ID:???
query rewrite すれば。
987NAME IS NULL:2009/03/03(火) 21:15:31 ID:???
>>980
SQLを変えるつもりが無い時点で、
取りうる方策は、かなり限定されてしまうね。


雑談。
過去経験では、コストベースオプティマイザで
HASH JOINが選択された場合に
想定外に性能が悪い場合があって
調べてみたら一時表領域を浪費しまくってた。
こりゃORACLEのバグくさい、と思って
サポートセンターに行ってPSRをダウンロードして
Release Noteに書いてあるBug Fixを調べたら、
HASH JOINには、結構そんなバグがある。

SQLを実行した時に、なぜか遅くて
一時表領域をバカ食いしてる時には、思い出して。
その時、俺は忙しくてPSR適用とか無理だったんで
/*+RULE*/をSQLに書いて逃げたよ。10gR2での話。

ルールベースだと、Nested Loops Join、Sort Merge Join
のどちらかしか選択されないんだ。
988NAME IS NULL:2009/03/03(火) 21:18:56 ID:???
>>980
実行計画が最適なのかどうか、ボトルネックがディスクなのかCPUなのか、
といった肝心なところを見ていないような。
989NAME IS NULL:2009/03/03(火) 21:31:16 ID:???
検索結果は一番大きいテーブルで1000万件、
それに紐付く子テーブルが300万件くらいづつですね。
実行計画は調べてて、表結合した結果をユニオン/インターセクトしたりしたところで、
ディスクソートが発生して遅くなってて、CPUはあんま使ってないことから、
検索条件をもっと絞り込めば、多分大丈夫なんだけど、
実行するSQLが不定型なんで、個別にSQLの最適化するのが嫌、
とか言って、突っぱねられてる状態です。
ついでに運用環境だから、試しに索引張ってみるとかはNGって上司に念押しされてて、
確証のある方法しかDBへの変更は入れられません。

query rewriteとruleヒントは一度試してみます。

まぁ多分、最悪夜間にSQLを流して帰る運用になりそうなふいんきですが。。。
990NAME IS NULL:2009/03/03(火) 22:05:47 ID:???
雑談。

Core 2 Quad搭載のノートPCを買ったんです。25万円也。

会社にある開発用のサーバ(>>980と同等のスペック)は
秒間に70回のOLTP的なトランザクション処理を
実行出来て、まあまあ速いと思っていたけど、
新しいノートPCは、秒間に220回もこなしやがります。
ちなみに10gR2です。ライセンスはトライアルを使用。

ミニタワーで組めば、6万円程度だと思います。
そのミニタワーで運用できるか?と言えば、不可でしょうけど、
3倍速くなるのがハッキリしてるのなら
200万円のサーバでも、安い!と誰でも判断すると思います。

まあ、そんなこんなで、私は半年に1台ずつPCを
買い換えてるんです。同僚からは、変人と思われてます。
991NAME IS NULL:2009/03/04(水) 00:22:38 ID:???
まぁハード買っても安いから良いんだけど、
ハードの増強効果よりもSQL/アプリのチューニングの方が、
効果大だと思うんだけどなぁ。
最近だと人件費の方が高く付くのかねぇ。
まぁ980の事例がどうなるかは判らんけど。
992NAME IS NULL:2009/03/04(水) 00:44:30 ID:???
DBを全部メモリに載せちゃえばって感じだけどな。
まあ消えるから、頻繁なバックアップ必須だけど。
993NAME IS NULL:2009/03/04(水) 21:05:07 ID:???
メモリを16GBとか搭載したら、そう思うよね。
で、調べてみた。

Oracle TimesTen In-Memory Database
4,500,000円 (1プロセッサ当たり)

高い。高すぐる。
Enterprise Edition前提だし、
顧客を納得させる自信が無い。
994NAME IS NULL:2009/03/04(水) 21:17:02 ID:???
995NAME IS NULL:2009/03/05(木) 00:18:05 ID:???
>>994
おつ
996NAME IS NULL:2009/03/05(木) 15:08:50 ID:???
ラムディスクならもっと安くできるだろ。サポート外だろうけど。
997NAME IS NULL:2009/03/05(木) 19:27:37 ID:???
>>996
ttp://www.insight-tec.com/mailmagazine/ora3/vol355.html
RAMDISKじゃなくてSSDの検証結果ですけど、
たぶんRAMDISKでも、更新系の処理の高速化の
効果しか見込めないような感じがします。

次の文を読んで、ORACLEもなかなかやるなあ、と思いました。
==============================================================
ソート処理の高速化を期待して一時表領域の SSD 化を検証してみまし
たが、ソートに関しては sort_area_size を限界まで(一時的に)拡張するこ
との方がより効果的でした。
さらに、Select の場合も、Oracleのキャッシュが効いていて SSD のメリッ
トを十分に感じることはできませんでした。
==============================================================
998NAME IS NULL:2009/03/05(木) 23:37:46 ID:LtriKPII
998 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
999NAME IS NULL:2009/03/06(金) 00:13:25 ID:???
 
1000NAME IS NULL:2009/03/06(金) 00:46:58 ID:???
1000ついでに、980の事の顛末だけど、
結局アプリ側の改修は一切行わないってことではねつけられて、
サーバの増強ということになりました。
まぁ予算が出るんなら別に文句は言わないけどさ。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。