• 締切済み

キャッシュを使わずにSELECTを投げたい

SELECTのSQLのパフォーマンスチューニングを行なっています。 例えば、A,B,Cと3本の候補があってA,B,Cの順に速度を見たいとき B以降はAによるキャッシュを利用して実行するはずなので、 この3つの実行速度がうまく比較できません。 (頻繁に投げられるSQLではないので、アプリ側から投げられるときは キャッシュにのっていない想定です) SQLを投げるたびに ALTER SYSTEM FLUSH BUFFER_CACHE ; でキャッシュをクリアすれば、3つを比較できるのでしょうが、 運用上の問題でそれもできません。 理想としては SELECT /*+ NOT_USE_CACHE*/ … のようにヒント句や alter sessionなどでキャッシュを使わずにSQLを投げたいのですが、 どのようにしたら実現できるでしょうか? 環境は 9iと11gの環境がありますので、 それぞれで最適な方法がございましたらご教授ください。 よろしくおねがいします。

  • Oracle
  • 回答数3
  • ありがとう数1

みんなの回答

回答No.3

1つ確認ですが、SQL-AとSQL-BとSQL-C、それぞれの処理速度を厳密に比較したいという事ですよね? であれば、それぞれのSQLを実行する前に、DBを再起動する必要があると思います。 SQLを実行すれば、どうしてもデータはキャッシュにのってしまいます。 なので、DBを再起動して、完全にまっさらな状態にする必要があります。 「運用上それが出来ない」となれば、その環境と同じ環境を別に用意して、そこでテストを行うしか無いと思います。 ちなみに、No1の回答者さんが示したURLは、OracleBIを使用している場合の説明ですね。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

「システムのキャッシングの無効化」を行った場合、該当のSQL内でのキャッシングも無効になる影響は考えられませんか。 例えば、インデックスのRANGEスキャンを行う場合、通常ならルートやブランチブロックはキャシュされますが、キャッシングを全面的に無効にするとDISKアクセスが頻発する気がします。

  • utun01
  • ベストアンサー率40% (110/270)
回答No.1

7.6.1.1 システムのキャッシングの無効化 http://docs.oracle.com/cd/E28389_01/bi.1111/b63029/querycaching.htm#i1018704 この辺は如何でしょうか。 ALTER SYSTEM FLUSH BUFFER_CACHE; が使えない理由が、キャッシュを後で使うから、とかであった場合、 この方法で一時的にキャッシュ無効化⇒後で有効化でいける気がします。

関連するQ&A

  • セレクト文について

    sqlのセレクト文について質問させて下さい。 フィールドのレコードに、a,b,c,d,eと登録されているデータから、"c"のデータだけをセレクト対象にしたい場合、どのようにsqlを書けばよいのでしょうか? 通常のセレクト文だと、WHERE句に、(フィールド名 = '値')などで格納されている値とデータの比較ができるかと思うのですが、上記のような場合はどのように指定するのでしょうか? フィールドを無駄に増やし過ぎないよう、カテゴリごとに配列をjoinでまとめたものをDBへ登録しているのですが、この場合だとイメージしているようなことは無理なんでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • Selectの処理速度改善について

    先日、PL/SQLの開発について、こんな質問を受けました。 「SQLを組むさい、処理速度を速めるためにやっていることは?」 と。 で、ちょっと考えて 「Selectなら、Indexを考慮してSelect文を作成し、実行します。 処理時間がかかる場合は、実行計画などをみて、 Select文にヒント句をつけて、処理速度を改善します。」 と答えました。 答えたあと、質問者された方は、なんだかがっかりした感じでしたが、 私の回答は不適切だったのでしょうか? それとも、どういう回答が良かったのでしょうか? よろしくお願いします。

  • selectの書き方を教えてください

    Oracleで以下のデータから1)、2)の条件でコードをselectしてくるには どのようなSQL文を書けばよいでしょうか。 [DATA] code date status  0001 3-15 A 0001 3-15 B 0001 3-15 C 0002 3-15 A 0002 3-15 B 0003 3-15 B 0004 3-15 A 0005 3-15 C 1)3-15においてstatusがAとBを持つcodeを返したい  →0001,0002が返ってきてほしい 2)3-15においてstatusにCを持つがそれ以外(A,B)は持たないcodeを返したい  →0005が返ってきてほしい 単純なものなのかもしれませんが、 どうか、お力添えのほど、よろしくお願いいたします。

  • Access にて DISTINCROW を使用した INSERT SELECT

    お世話様です。 Access2003 VBAにて、DoCmd.RunSQLを使用してSQL文を流す際、 普通のINSERT-SELECT文はOKですが、 そのSELECT文にDISTINCROW句を使用していると、 数百件程度のSELECT結果しかINSERTできません。 本当は数千件のSELECT結果をINSERTしたいのですが、 これを実行した場合、エラーにもならず、1レコードもINSERTされません。 ためしに、DINSTINCTROWではなく、SQL文を変更してDISTINCTにしてみたところ、 2000件以上でもINSERTできました。 DISTINCROW句を使用して数千件でもINSERTできる方法はあるでしょうか? ちなみにSELECT単体ですと、DISTINCTROWを使用していながら、 数千件でも結果を表示できます。 SQL例: str_SQL = " INSERT INTO 結果テーブル(フィールド1, フィールド2, フィールド3)  SELECT DISTINCTROW A.項目1, A.項目2, B.項目1  FROM テーブル1 A, テーブル2 B  (WHERE句はあってもなくても現象変わらず)  ORDER BY A.項目4 ASC, A.項目5 ASC " DoCmd.RunSQL (str_SQL) よろしくお願いいたします。

  • sql select文の作り方で困っています

    C#2010で作ったアプリ から sql サーバー2008のデータベースにselect文を発行する際に困っています 検索キーワードが3つあるのですが、3つのキーワードの組み合わせでselect文を発行したいのですが、種類がたくさんできてしまい 困っています 例えば、検索キーワード A、B、Cの3つとすると、以下の組み合わせで7種類ものselect文を作るのが煩わしいです GetData(A) GetData(B) GetData(C) GetData(A,B) GetData(A,C) GetData(B,C) GetData(A,B,C) これらを1つのselect文でさばくには、どうすれば良いでしょうか? ご指導よろしくお願いいたします

  • IN句に副問合わせを使う場合と使わない場合

    お世話になります。 SQLについての質問です。 RDBMSはSymfowareです。 IN句に副問い合わせを指定するSQLと その副問い合わせの結果を直接IN句に記載したSQLで 結果が異なってしまいます。 こういうことってありますでしょうか。 以下のようなSQLです。 (1) SELECT * FROM T1 WHERE T1.column_A IN ( SELECT T2.column_A FROM T2 WHERE T2.column_B='XXXX' ) 上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。 (2) SELECT * FROM T1 WHERE T1.column_A IN ('A','B','C','D') この(1)、(2)のSQLの結果が異なってしまいます。 私の環境では(1)では0件、(2)では2件ヒットします。 なぜこのようになるのかわかる方がいらっしゃいましたら ご教授ください。 ちなみに、DBを操作して、副問い合わせのSELECT文の結果を 'A'、'B'とすると同じ結果が得られます。 副問い合わせのSELECT文の結果が3件以上になると(1)のSQLの 結果は0件になってしまいます。 RDBMSの障害でしょうか・・・? それとも、IN句に副問い合わせを使用する場合、 その副問い合わせの結果は2件以下にする必要がある なんてルールがあったりするのでしょうか。

  • select句副問い合わせ 値の個数が多すぎます

    SQL初心者です。 ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。 解決法をご教授願います。 同一テーブルの同一項目を複数項目として取得したいのです。 SELECT (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.CCC), (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.FFF) FROM C_MST CMST WHERE CMST.A_RYAKU = '123'

  • 通番を振りたい

    select a,b,sum(c) from test group by a,b このようなSQLで以下のような検索結果が 取れたとします。 A,A,10 A,B,20 A,C,30 B,C,10 B,C,20 ここで質問ですが、select句の'a'毎に以下のように 通番を振りたいと思います。これを実現するには どのようにSQLを書けばいいでしょうか? A,A,10 1 A,B,20 2 A,C,30 3 B,C,10 1 B,C,20 2

  • あるDBから別のDBのテーブルをselectしたい

    mysqlのデータベースAとBが存在するとして、 Aをuseしている状態で、Bのデータベースのテーブルをselectするには、どのような構文でSQLを実行すればよいでしょうか。

    • ベストアンサー
    • MySQL
  • SELECT のWHEREに別のSELECT

    SELECT のWHEREに別のSELECTの結果を当てはめることは可能でしょうか? ただし、引用テーブルは同じテーブルとします。(DDD) 例 SELECT * FROM DDD WHERE B = (SELECT B FROM DDD WHERE C=1) 再起SQLとはまた違うのでしょうか?