- ベストアンサー
DBMS_STATSのdegree句について
DBMS_STATSのdegree句についてご存じの方、教えて下さい。 1.degree句を設定すると対象テーブルの統計情報取得処理がn並列で 稼働し、処理時間の短縮が図れるということでしょうか。 2.適切な並列数はどのように設定すればよいでしょうか。 多ければいいというものではないですよね。 以上、よろしくお願い致します。
- namidame_dion
- お礼率80% (94/117)
- Oracle
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> 1.degree句を設定すると対象テーブルの統計情報取得処理がn並列で > 稼働し、処理時間の短縮が図れるということでしょうか。 その認識で間違いないと思います。 > 2.適切な並列数はどのように設定すればよいでしょうか。 > 多ければいいというものではないですよね。 10g以上で特に理由がなければ、DBMS_STATS.AUTO_DEGREEやDBMS_STATS.DEFAULT_DEGREEを 指定することで、CPU数や初期化パラメータの設定値から適切な多重度を自動的に設定して くれるかと思います。 多重度を設定するとパラレル・クエリと同様にパラレル・スレーブ・プロセスが生成する ため、極端に大きくするとオーバーヘッド(複数のスレーブ・プロセス間の同期など)が 大きくなるかと思います。
関連するQ&A
- oracle10g統計情報取得の確認方法
Oracle 10gで統計情報が取得されたことを確認するSQL文を教えてください。 統計情報の取得方法としては、 Primary Key、Indexを再作成した後、DBMS_STATS.GATHER_SCHEMA_STATSを使用して統計情報を取得しております。 よろしくお願いします。
- ベストアンサー
- Oracle
- GROUP BY 句を 2つ組み合わせる方法
【質問】 GROUP BY 句を 2つ組み合わせて、集計の集計を行う方法ってありますか? 下記対象SQLで集計を行うとメインのF_在庫履歴には、商品コードがあり、計算値の金額が 正常に出力されません。 一度、GROUP BY 句に商品コードを追加し、商品コード単位の金額合計値を取得後、 その合計値のSQLから、下記の様に、営業所単位の金額合計値を求める手法はありますでしょうか。 よろしくお願いします。 ●対象SQL SELECT TO_NUMBER(SUBSTR(S.処理対象年月日,1,6)) AS 処理対象年月 , S.内部CD AS 部CD , S.管理営業所CD AS 営業所CD , 631 AS 科目CD , (SUM(S.前月末在庫数) + SUM(S.仕入数) - SUM(S.仕入返品数) + SUM(S.移動入庫数) + SUM(S.調整入庫数) - SUM(S.売上数) + SUM(S.売上返品数) - SUM(S.移動出庫数) - SUM(S.調整出庫数) - SUM(S.仮売上数量) - SUM(S.工事出庫数量)) * MAX(DISTINCT S.在庫原価) * -1 AS 金額 FROM F_在庫履歴 S WHERE S.処理対象年月日 = W処理対象年月日 GROUP BY S.内部CD,S.管理営業所CD, TO_NUMBER(SUBSTR(S.処理対象年月日,1,6));
- ベストアンサー
- その他(プログラミング・開発)
- adoのWHERE句 クエリだとフィルタされない
エクセルvbaなのですが、 adoのWHERE句は、テーブルじゃないとダメなのでしょうか? と言うのも、 rs.Open "Q_カテゴリ WHERE 分類 like '%A%'" だと、エラーにならないのですが、抽出もされずに全レコードが対象になってしまいます。 しかし、 rs.Open "T_カテゴリ WHERE 分類 like '%A%'" にすれば、抽出された後のレコード数が取得されます。 エラーにならない事から、オブジェクトは存在してる事は確かなはずですが なぜかフィルタできません。 なぜでしょうか?
- ベストアンサー
- Visual Basic
- DBの表の内容を全取得したい(PDO)
DBおよびPG初心者です。 単語や説明に不備がありましたらご指摘下さい。 DB内の各テーブルをブラウザで視覚的に確認するために 選択したテーブルの内容を取得したいと思っております。 DB各種に汎用的に使えるPDOモジュール(?)を使用。 ■ DBMS上にあるDB数と各々のDB名を取得(配列に格納される?) するにはどのように記述すればよいでしょうか。 ■ DB内のテーブル数と各々のテーブル名を取得(配列に格納される?) するにはどのように記述すればよいでしょうか。 ■ テーブルのカラム数はcolumnCount()で取得することができたのですが、 それぞれのフィールド名はどのように取得すればよいのでしょうか。 ご教示の程よろしくお願い致します。
- 締切済み
- PHP
- 統計の方法の選択
特定の疾患を対象とした群間の比較を行う場合の統計方法についての質問です。 対象とされる群は、調査を行った年度ごとの特定の疾患「A」を有する患者群、とします。 n数は各年度ごとに異なります。 各群において、「A」の危険因子とされる疾患「B」を有する割合が増加しているか、減少しているか、変わらないのかを評価する場合、統計は何を用いるのが正しいのか、またどのようにデータを処理して求めれば良いのかご教示ください。 1.各年度ごとの疾患「A」を有する6つの群のn数 (大体150から300くらいです) 2.各年度ごとの「B」を有する者の数bと、そのパーセンテージ(100*b/n) (パーセンテージは50%から70%くらいです) が、わかっている条件です。 よろしくお願いします。
- 締切済み
- 数学・算数
- コストベース・オプティマイザについて。
オプティマイザには、 1)ルールベース・オプティマイザ(RBO) 2)コストベース・オプティマイザ(CBO) があります。 RBO は、決められたアクセスパスの優先順位に従って 実行計画を選択することが分かりました。 CBO は、最適なアクセスパスを選択する為に、 オプティマイザ統計を取得し、実行計画のコストを 見積もることが分かりました。 ★このオプティマイザ統計に関して、質問があります。 オプティマイザ統計は、ANALYZE や DBMS_STATS パッケージを 使用することで取得する統計情報ということが分かりました。 しかし、統計情報を取得することでどのように実行計画が 改善されるのか、この部分のイメージが掴めません。 ================================================================ 例えば、表の統計情報を取得すると、以下のようになりました。 SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT 2 ,AVG_ROW_LEN 3 from user_tables where table_name='EMP'; NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN ---------- ------ ------------ --------- ---------- ----------- 15 5 0 0 0 35 ================================================================ それぞれのカラムの意味は以下であることが分かりました。 《上記のカラムの説明》 NUM_ROWS = 行数 BLOCKS = 使用ブロック数 EMPTY_BLOCKS = 未使用ブロック数 AVG_SPACE = 空き領域の平均サイズ(bytes) CHAIN_CNT = 行連鎖・行移行の行数 AVG_ROW_LEN = 行の平均長(bytes) 上記の統計情報を取得することで、どのように実行計画を定めているのでしょうか。 統計情報を取得することで、どのような意味があるのでしょうか。 宜しければ、教えて頂きたいと思います。
- ベストアンサー
- Oracle
- 大量にデータを更新するテーブルの統計情報について
大量にデータを更新するテーブルの統計情報の取得タイミングについてついて質問があります。 該当のテーブルはワークテーブルでテーブルの1/3程の大量データを毎回delete,insert,selectの順番で処理をおこなっています。 大量のデータを毎回更新しているのでselect文の際に統計情報が古いため実行計画が正しくなく処理が遅くなる可能性があるのでは無いかと心配しております。 統計情報は、取るべきでしょうか?取る場合は何時のタイミングで取るべきでしょうか? Oracle 9iを使用しています。 宜しくお願い致します。
- ベストアンサー
- Oracle
- 統計情報の取得=コミットですか?
いつもお世話になっております。 あるシステムの処理で 大量データ挿入⇒統計情報の取得⇒挿入したデータを基にファイル作成 という処理を行っております。 ファイル作成時に失敗した際に、ロールバック処理を行うように 設定しているのですが、既にデータが挿入されてしまっています。 初心者でいまいち統計情報の取得が良く分かっていないのですが、 統計情報を取得するSQL文を流した時点でトランザクションは コミットされるのでしょうか? よろしくお願い致します。
- ベストアンサー
- Oracle
- プログラムの考え方とDBの扱いかたについて
技術的な質問ではなく、考え方についての質問です。 こっちを立てるとあっちが立たずのような状態で困ってます。 どのカテゴリで質問するか悩んだのですが、直近の投稿数が多いのでC言語のところで質問させて頂きます。 ご教示ください。 現在こういうバッチプログラムがあります。 バッチA > (1)外部から前日分の確定データリストを取得 > (2)データリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDB(テーブルA)に格納 ※1つのプログラムで3つの処理を行ってます 今度、データリストの取得先に外部2が追加されます。 仕様が同じであれば、バッチAと同様のものを作ればいいのですが、 外部2の場合、1か月の間データが確定されないという仕様があります。 前日分のデータが確定するのは、 1カ月後までの間に取得するデータリストにキャンセルデータが無かった場合です。 1.そこでこのように考えました。 バッチA > 外部2から1カ月分のデータリストを取得 > 取得データから、1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する > (2)データリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDBに格納 2.でも、毎日1か月分のデータを取得して抽出処理を行うのは負担になるし、 毎日ほぼ同じデータを取得するのはあほらしいと思い、以下のように考えました。 バッチA > 外部2から前日分のデータリストをDB(テーブルB)に格納 > DBから1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する > (2)データリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDB(テーブルA)に格納 3.今度はそもそもバッチ分けた方がいいんじゃないかと思い、以下のように考えました。 バッチ1 > 外部2から前日分のデータリストをDB(テーブルB)に格納 バッチA > DBから1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する > (2)抽出したデータリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDB(テーブルA)に格納 4.さらに、キャンセルデータの処理も別バッチにすれば、 バッチAでの処理がわかりやすくなるじゃないかと思い、以下のように考えました。 バッチ1 > 外部2から前日分のデータリストをDB(テーブルB)に格納 バッチ2 > DB(テーブルB)から1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する > 抽出したデータのキャンセルデータのレコードをDB(テーブルB)から削除 バッチA > (1)DB(テーブルB)から前日分のデータリストを取得 > (2)データリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDB(テーブルA)に格納 ここまで考えてどうするのがスマートなのかよくわからなくなってきてしまいました。 3か4でいこうと思うのですが、3の時にバッチAで抽出処理をするのはいまいちって思ってます。 それで4にしようと思ったのですが、 テーブルBは取得データをそのままの状態で入れておくって当初考えてたので、 それをあとからレコード削除したりするのもどうなんだろうと思ってます。 確定したデータと未確定のデータが混在するのもなんだか腑に落ちません。 それだったら、新たにテーブルCを作って、確定データを突っ込んでおくってことも考えたのですが、 そうなると、バッチA最後に格納しているテーブルAと何も変わらないようなものがもう一つできてしまいます。 どういうのがスマートというか良い考え方なのでしょうか。
- ベストアンサー
- C・C++・C#
お礼
とても、わかりやすくご説明いただき、納得して理解することができました。 ありがとうございました。