数十万件のデータをバッチ処理を行っているのですが、パフォーマンスが悪く困っています。
その原因となりそうな部分について質問します。

テーブルAに複合索引を作ります。
create unique index uk_A on A(AA,AB,AC,AD);
このテーブルに検索をかけます。そのときにWhere句に書く列の順序は、パフォーマンスには関係ないのでしょうか?
select max(AD) from A where AA=1 and AB=2 and AC=3;
としたときと
select max(AD) from A where AC=3 and AB=2 and AA=1;
としたときの、パフォーマンスの違いです。

このバッチ処理の中で、Aのテーブルに多数のデータを追加するために、コストベースにはできません。また、このSQL文は、プロシージャの中で使用しています。

範囲検索の場合のことは、講習でもあったのですが、等価結合のことは出てきませんでした。

どなたかご存知の方宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Oracle7.2とかの時代では、そんなこともあったかもしれませんが、現在は、賢いので、Where句に書いてある順番には、影響されません。



数十万件から、抜いた件数が、かなり多い場合、インデックスがあることが邪魔をすることがあります。
それは、インデックス自体がテーブルである関係上、ほとんどのレコードにヒットしてしまう場合は、インデックスを読む分をプラスするのと、テーブル本体を全件なめるのとでは、後者の方がいいことがあるためです。

また、相手にするレコードが多い場合、必然的にネットワークやミドルウェアが扱うデータ量が増え、Oracle自体の検索スピードより、その部分のボトルネックが影響している場合もありますので、ストアドプロシージャを使って、DB側で処理するようにすると改善する場合もあります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>Oracle7.2とかの時代では、そんなこともあったかもしれませんが、現在は、賢いので、Where句に書いてある順番には、影響されません。
CBOでは、順番は関係ないと聞いていたのですが、RBOでも関係ないのですか・・・それは、複合索引だけの話になるのでしょうね。

>数十万件から、抜いた件数が、かなり多い場合、インデックスがあることが邪魔をすることがあります。
そうですね。一応、そのことは検討したのですが、今回の場合は、数十万件中ヒットするのは、最大でも10件程度なので、BTree索引が効果的だと判断して、普通に索引を作成しました。(カーディナリティは0.01%以下)

>ストアドプロシージャを使って、DB側で処理するようにすると改善する場合もあります。
質問の中にも書かせていただきましたが、このSQLはプロシージャの中で使用しています。

参考にさせていただきます。

お礼日時:2001/02/09 08:18

where AC=3 and AB=2 and AA=1;


なのに、
create unique index uk_A on A(AA,AB,AC,AD);
でいいのですか?
今のWHERE句ならインデックスにADは不要なのでは?

逆にWHERE句にADのパラメータを付加した状態で
試した場合は如何ですか?

この回答への補足

>where AC=3 and AB=2 and AA=1;
>なのに、
>create unique index uk_A on A(AA,AB,AC,AD);
>でいいのですか?
そこを質問したいのです。EXPLANを見ると、質問の2つのSQL文両方で、uk_AのRangeScanになっています。ただ、ルールベースでは、Where句は右から評価されると聞いたような気がするので、どちらのほうがいいのかを聞きたいのです。

>今のWHERE句ならインデックスにADは不要なのでは?
そのとおりです。このSQL文だけなら、インデックスにADは必要ありません。変則的な使い方ですが、この一意索引を、主キーの代わりに使っています。そのためにこの一意索引には、必ずADを入れなければならなくなっています。AA、AB、ACだけの索引を作ってもいいのですが、ディスク領域の無駄だと思い、作っていません。ただ、現状により近い状態をお知らせしたかったので、質問と関係ないかもしれませんが、入れさせていただきました。

>逆にWHERE句にADのパラメータを付加した状態で
>試した場合は如何ですか?
SQLの結果として、max(AD)をとっているので、指定するとちょっと結果が変わるような・・・。試してみたほうがよいでしょうか?

補足日時:2001/02/08 17:35
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「複合機」は英語でなんと言う?

コピー、FAX、プリンタ、スキャナが一体となったいわゆる「複合機」のことを英語では、なんというのでしょうか?

Aベストアンサー

こちらにあるように、" Multifunction Products " として分類しています。
 一般的には、" ALL-IN-ONE *** " ( ALL-IN-ONE INKJET PRINTERS 等)と称しています。



http://www.usa.canon.com/opd/controller?act=OPDCategoryIndexAct&fcategoryid=2159

Qfrom...where を from...join..on にするには

以下のSQL文は from ... where ... で書かれていますが
これを from ... join ... on ... で書き直したいのですが可能でしょうか?

select X.col1, U.col1

from TABLE_X as X ,TABLE_U as U

where U.REC_NO = (select B.REC_NO
from TABLE_A as A, TABLE_B as B
where A.ITME = B.ITEM
and X.DATA = A.DATA
fetch first 1 row only )

むずかしくしているのは、fetch first 1 row only なのですが
これがないと where句のかっこのなかのselect文は複数の結果を返します
しかし、その複数の結果はすべて同じものになることがデータ上保証されています

fetch first を除いて select distinct としても同じ結果となりますが
パフォーマンスがひどく低下してしまいます。

以下のSQL文は from ... where ... で書かれていますが
これを from ... join ... on ... で書き直したいのですが可能でしょうか?

select X.col1, U.col1

from TABLE_X as X ,TABLE_U as U

where U.REC_NO = (select B.REC_NO
from TABLE_A as A, TABLE_B as B
where A.ITME = B.ITEM
and X.DATA = A.DATA
fetch first 1 row only )

むずかしくしているのは、fetch first 1 row only なのですが
これがないと w...続きを読む

Aベストアンサー

on句は結合条件でfetch firstは抽出条件なのでwhere句をon句にする単純な書き直
しはできないと思います。やるとしたら副選択のselect文をfrom句に書いて一時テーブルとしてfetch firstをdistinctにするしかないような気がします

select X.col1, U.col1
from
(select distinct B.REC_NO
from TABLE_A as A, TABLE_B as B
where A.ITME = B.ITEM
and X.DATA = A.DATA) as Z
inner join TABLE_X as X on ...
inner join TABLE_U as U on ...

fetch first にくらべて distinct なので遅いような気がしますが
実際には副選択がないためにそための内部的に作られる一時表が軽くなるのでこちらのほうが速いと思います。

Q英語 複合関係詞

we will elect【】we believe is trustworthy.
アwhoeverイwhomeverウthose whoエof whom

文構造そのものが分からず困っています。
自力での理解は下記の通りなんですが...
---------------------------------------------
(1)元の二文に戻す
(We will elect anyone+We believe anyone is trustworthy)
(2)ダブってしまうanyoneをwhoに変えて連結
(We will elect anyone who we believe is trustworthy.)
(3)anyone who=whoeverだから選択肢アが正解になる。
---------------------------------------------
全くの見当違いでしょうか?その場合は
正しい理解の仕方を教えて頂けると助かります。

Aベストアンサー

完璧です。
複合関係詞にいわゆる連鎖関係詞が絡んでいます。
we believe が挿入という説明をする人が多いですが、
とにかく、believe に対する目的格でなく、is に対する主格で whoever を選ぶ。

QWHERE句でOR ANDを使うと抽出が変

SQLのwhere句について教えてください。Table_AとTable_Bはjoinされています。
下記の条件で、値を抽出したいです。型はintです。

Field1は必ずNULL
Field2は値が1~14のどれか。それ以外にはマッチしない
Field3は0か3のどちらかにマッチ。
Field4は2,3,4,8に以外にマッチ。
Field5は0,6のどちらかいにマッチ。
Field6はNULLを抽出
Field7はNULLを抽出

よって、下記のSQLを書きました。しかしながら、Field1~Field3まで抽出を
かけた時に、1万件だったのが、Field1~Field5までを含めると、1万2000件に
なってしまいます。なぜだかわかりません。何が間違っているかお教え
頂けないでしょうか?また正しいwhere句以下の条件はどのように正しく書けばいいのでしょうか?

WHERE
`TABLE_A`.`Field1` IS NULL AND
`TABLE_B`.`Field2` = 1 or
`TABLE_B`.`Field2` = 2 or
`TABLE_B`.`Field2` = 3 or
`TABLE_B`.`Field2` = 4 or
`TABLE_B`.`Field2` = 5 or
`TABLE_B`.`Field2` = 6 or
`TABLE_B`.`Field2` = 7 or
`TABLE_B`.`Field2` = 8 or
`TABLE_B`.`Field2` = 9 or
`TABLE_B`.`Field2` = 10 or
`TABLE_B`.`Field2` = 11 or
`TABLE_B`.`Field2` = 12 or
`TABLE_B`.`Field2` = 13 or
`TABLE_B`.`Field2` = 14 or
`TABLE_B`.`Field3` = 0 or
`TABLE_B`.`Field3` = 3 or
`TABLE_B`.`Field4` <> 2 or
`TABLE_B`.`Field4` <> 3 or
`TABLE_B`.`Field4` <> 4 or
`TABLE_B`.`Field4` <> 8 or
`TABLE_B`.`Field5` = 0 or
`TABLE_B`.`Field5` = 6 or
`TABLE_B`.`Field6` is NULL or
`TABLE_B`.`Field7` is NULL

SQLのwhere句について教えてください。Table_AとTable_Bはjoinされています。
下記の条件で、値を抽出したいです。型はintです。

Field1は必ずNULL
Field2は値が1~14のどれか。それ以外にはマッチしない
Field3は0か3のどちらかにマッチ。
Field4は2,3,4,8に以外にマッチ。
Field5は0,6のどちらかいにマッチ。
Field6はNULLを抽出
Field7はNULLを抽出

よって、下記のSQLを書きました。しかしながら、Field1~Field3まで抽出を
かけた時に、1万件だったのが、Field1~Field5までを含めると、1万2000件に
なって...続きを読む

Aベストアンサー

条件が
Field1は必ずNULL
かつ
Field2は値が1~14のどれか。それ以外にはマッチしない
かつ
Field3は0か3のどちらかにマッチ。
かつ
Field4は2,3,4,8に以外にマッチ。
かつ
Field5は0,6のどちらかいにマッチ。
かつ
Field6はNULLを抽出
かつ
Field7はNULLを抽出
であれば

WHERE
(`TABLE_A`.`Field1` IS NULL) AND
(`TABLE_B`.`Field2` >= 1 AND
`TABLE_B`.`Field2` <= 14) AND
(`TABLE_B`.`Field3` = 0 or
`TABLE_B`.`Field3` = 3) AND
(`TABLE_B`.`Field4` <> 2 AND
`TABLE_B`.`Field4` <> 3 AND
`TABLE_B`.`Field4` <> 4 AND
`TABLE_B`.`Field4` <> 8) AND
(`TABLE_B`.`Field5` = 0 or
`TABLE_B`.`Field5` = 6) AND
(`TABLE_B`.`Field6` is NULL) AND
(`TABLE_B`.`Field7` is NULL)
と書きます。

質問者さんが書いたWHERE文は

Field1は必ずNULL
かつ
Field2は値が1~14のどれか。それ以外にはマッチしない
または
Field3は0か3のどちらかにマッチ。
または
Field4は2以外にマッチ。
または
Field4は3以外にマッチ。
または
Field4は4以外にマッチ。
または
Field4は8以外にマッチ。
または
Field5は0,6のどちらかいにマッチ。
または
Field6はNULLを抽出
または
Field7はNULLを抽出
に一致する。

特に
Field4は2以外にマッチ。
または
Field4は3以外にマッチ。
または
Field4は4以外にマッチ。
または
Field4は8以外にマッチ。
は「無条件」と同一になります。何が来ても条件が真になるのを理解できますか?

また、各フィールドの条件を「または」で連結しているので、フィールド条件を1~3から1~5に増やすと「または」により条件が広がるので、一致レコードが増えます。

「1が赤」かつ「2が白」または「3が青」(フィールド条件が1~3)
から
「1が赤」かつ「2が白」または「3が青」または「4が黒」または「5が緑」(フィールド条件が1~5)
に変えれば、『「4が黒」または「5が緑」』の条件に一致するレコードが増えます。

「4が黒」の物が無条件に増え、「5が緑」の物が無条件に増えます。なので
>Field1~Field3まで抽出を
>かけた時に、1万件だったのが、Field1~Field5までを含めると、1万2000件に
>なってしまいます。
となるのが「当たり前」です。

ORは、条件を「絞り込む」のではなく、条件を「緩和」させます。

条件を絞り込むにはANDを使います。

なお
「2でも3でも4でも8でもない」

(`TABLE_B`.`Field4` <> 2 or
`TABLE_B`.`Field4` <> 3 or
`TABLE_B`.`Field4` <> 4 or
`TABLE_B`.`Field4` <> 8)
ではありません。

「2でも3でも4でも8でもない」

「2でない、かつ、3でない、かつ、4でない、かつ、8でない」
だと言う事を理解しましょう。

もし
「2でない、または、3でない、または、4でない、または、8でない」
と書くと、これは
「何でもよい」
と言う意味になります。

1がくると
「2でないは真、または、3でないは真、または、4でないは真、または、8でないは真」
で、全体は真になります。

2がくると
「2でないは偽、または、3でないは真、または、4でないは真、または、8でないは真」
で、全体は真になります。

3がくると
「2でないは真、または、3でないは偽、または、4でないは真、または、8でないは真」
で、全体は真になります。

4がくると
「2でないは真、または、3でないは真、または、4でないは偽、または、8でないは真」
で、全体は真になります。

どうです?「何が来ても無条件に真になる」のが判りますか?

条件が
Field1は必ずNULL
かつ
Field2は値が1~14のどれか。それ以外にはマッチしない
かつ
Field3は0か3のどちらかにマッチ。
かつ
Field4は2,3,4,8に以外にマッチ。
かつ
Field5は0,6のどちらかいにマッチ。
かつ
Field6はNULLを抽出
かつ
Field7はNULLを抽出
であれば

WHERE
(`TABLE_A`.`Field1` IS NULL) AND
(`TABLE_B`.`Field2` >= 1 AND
`TABLE_B`.`Field2` <= 14) AND
(`TABLE_B`.`Field3` = 0 or
`TABLE_B`.`Field3` = 3) AND
(`TABLE_B`.`Field4` <> 2 AND
`TABLE_B`.`Field4` <> 3 AND
`TABLE_B`.`Fie...続きを読む

Q複合関係代名詞について

私は今高1で、英語の授業で複合関係代名詞、複合関係副詞についてならいました。

例文です。


Whoever calls on me, tell them I am out.
 (誰がたずねてきたとしても、私は出かけていると伝えてください。)


譲歩の副詞節を作る複合関係代名詞、複合関係副詞を用いる場合、その複合関係代名詞、副詞

を含む節の最後に , は絶対必要ですか?

解答お願いします。

Aベストアンサー

別に複合関係代名詞に限った話ではないですが、,を入れてもらった方が読みやすいですよね。
そういう考えでいいと思いますよ。
ああ、ここで関係詞節が終わって主節に移るんだなとわかりますから。
(話し言葉ではカンマは見えないので、短くポーズを置きます)

Tell them I am out whoever calls on me. と関係詞節が後半に回ればカンマは不要です。
whoever~と言い出せば、そこから関係詞節だよという明確なサインになりますので。

QBETWEEN A AND B

検索条件でBETWEEN A AND Bを使いたいのですが、
例えば、データが10件登録されています。
社員NO が 0番~9番まで登録されています。

BETWEEN文で 3番以降のデータを取り出したのですが
どうしたらいいでしょうか

Aベストアンサー

普通はそうのような場合はBETWEENは使いません。

SELECT 社員No FROM テーブル名
WHERE 社員No >= 3

WHERE 社員No > 2
とします。

無理やり、使うのなら
SELECT 社員No FROM テーブル名
WHERE 社員No BETWEEN 3 AND MAX(社員No)
でしょう。

Q日本語と英語。。。

こんにちわっ!くだらない質問だと思うけどつきあってください!
今の年になって言うのも恥ずかしいんですけど、日本語の『コンプレックス』って
どういう意味なのでしょうか?
確か英語では『複雑』や『複合』、『建築物の複合体』とかだったような・・・。
よろしくお願いします!

Aベストアンサー

こんにちわ

インターネットで調べると
コンプレックス 確かに複雑、複合などの意味もありますが、劣等感 という意味のcomplex という意味もちゃんとありますです

inferior complex とかinferiority complex
で劣等感となります

complex は辞書でひくと
【形】 複合の、複雑な、込み入った、入り組んだ、面倒{めんどう}な、手間{てま}のかかる
【名-1】 コンプレックス、強迫観念{きょうはく かんねん}、固定概念
【名-2】 複合体{ふくごう たい}、合成物{ごうせいぶつ}、建築物{けんちくぶつ}の集合体{しゅうごうたい}、集合施設{しゅうごう しせつ}、複合施設{ふくごう しせつ}、総合施設{そうごう しせつ}、総合{そうごう}ビル、コンビナート
【名-3】 《化》錯体

となります。

ほとんど日本語と同じ意味と考えていいのではないでしょうか?

Q【Access抽出方法】 表A-表B=表C は?

Accessを使って2つの表からデータを抽出する方法を
教えてください。

やりたいことは引き算です。
 表A - 表B = 表C

表Aには全取引会社がリストとして入っています。
表Bには得意先の会社だけが入っています。
表Aの中に入っている会社から表Bの得意先以外の
会社だけを表Cとして出したいのですが、
どうするのでしょうか?

実は今、これを手作業で1つ1つ検索削除をやってます。
どなたかお助けください!

Aベストアンサー

テーブルが取引先と得意先
キーが会社CDとすると

SELECT 取引先.*
FROM 取引先 LEFT JOIN 得意先 ON 取引先.CD = 得意先.CD
WHERE (得意先.CD) Is Null;

取引先全レコードと得意先レコードをキーで結びつけて
そのうち得意先レコードがない(null)のレコードを選択する。

Q複合機について

私は今HP (ヒューレット・パッカード)の複合機を使っています。
かなり前(5,6年)の複合機なので買い換えようとおもっています。
買おうと思っている複合機はphotosmart wireless b110aですが、
photosmart wireless b110aには英語の文章が書かれた物をスキャンし、ワードファイル等に変換できる機能はついてますか?

ちなみに私がいま持っている複合機ではできました。
回答よろしくお願いします。

Aベストアンサー

ヒューレットパッカードのwebを見る限りでは、ついていないみたいですね。
http://h50146.www5.hp.com/products/printers/inkjet/aio/b110a/soft/#2

あくまでも検索した結果ですが、
EPSONのPX-403Aなら「読んde!!ココ パーソナル」が付いているので、その機能(OCR = Optical Character Reader)は付いているのですが、
価格・性能などで質問者様の要望にこたえられる製品かどうかまでは分かりません。
http://kakaku.com/item/K0000226300/

質問者様がおっしゃっている機能は「OCR」というものですので、メーカーや掲示板で問い合わせる際に、「OCRは付属しているか?」と聞くといいと思います。

あくまでも参考まで

Qaccess 自動採番 「10-AA-0001」にするには。

宜しくお願いします。

仕様環境:access(2002-2007)

自動で番号を割り振る機能を作っています。
(以前に似た質問をしたのですが、前より理解度が上がったので、ご了承くださいm(__)m)

・・・
まずテストDBなので、テーブルは「案件」一つだけです。
フォームも簡易的な単票形式で簡単なものです。
番号は他のテキストボックスに何か挿入する前の
「挿入前」のイベントを遣っています。

そこで、ご相談です、

まず自動採番で「AA-0001」というものが作れました。
また別フォームに移動し、他のテキストボックスを入力しようとすると
「AA-0002」になりました、以降も~0003、~0004となり成功しました。

そこで更に付け加えたいと思っています。
それは、
「2010-AA-0001」にしたいと思っています。
ご覧の通り、「2010」は「年」です。
更には完成系として「10-AA-0001」と言う風に「年」にあたる、2010の「10」だけ、
抜き出したいと思っており、来年には自動的に2011の「11」にしたいと思っております。
date関数なのかなー、とは何となく思っているのですが、いろいろ工夫してみたのですが、
うまくいきません。

これはマクロでは無理でしょうか?

フォームをVBAに変換したものとマクロを記載させて頂きます。
よろしくお願いします。

'------------------------------------------------------------
' Form_BeforeInsert
'
'------------------------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)
On Error GoTo Form_BeforeInsert_Err

If (DCount("見積り番号", "案件") = 0) Then
見積り番号 = "AA-0001"
Exit Sub
End If
見積り番号 = Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA-" & "0000")


Form_BeforeInsert_Exit:
Exit Sub

Form_BeforeInsert_Err:
MsgBox Error$
Resume Form_BeforeInsert_Exit

End Sub

・・・・
マクロの場合

    条件                     アクション
----------------------------------------------------------
1行目 DCount("見積り番号","案件")=0   値の代入
   アイテム: [見積り番号]
   式:    "AA-0001"
----------------------------------------------------------
2行目 ...                      マクロの中止
----------------------------------------------------------
3行目                       値の代入
   アイテム: [見積り番号] 
   式:    Format(DMax("Right(見積り番号,4)","案件")+1,"AA-" & "0000")
----------------------------------------------------------

・・・・   

こんな感じです、
(単体のテーブルを作り、他のテーブルと組み合わせるつもりです)

また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、
調べても(google)出てきません、これは何か違いがあるのでしょうか?

教えてください、宜しくお願いします。

宜しくお願いします。

仕様環境:access(2002-2007)

自動で番号を割り振る機能を作っています。
(以前に似た質問をしたのですが、前より理解度が上がったので、ご了承くださいm(__)m)

・・・
まずテストDBなので、テーブルは「案件」一つだけです。
フォームも簡易的な単票形式で簡単なものです。
番号は他のテキストボックスに何か挿入する前の
「挿入前」のイベントを遣っています。

そこで、ご相談です、

まず自動採番で「AA-0001」というものが作れました。
また別フォームに移動し、...続きを読む

Aベストアンサー

(1)
はずしていたらごめんです。

見積り番号 = Right(Format(Date, "yyyy", 2), 2) & "-" & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA

-" & "0000")

(2)
>また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、

私も知りません。ヘルプにも出てきません。
逆にどこにあります?


人気Q&Aランキング