性能の改善方法とは

このQ&Aのポイント
  • 以下の(1)のSQLと(2)のSQLで性能が全然違います。原因は明示的に「1」を取得するようにしているからなのですが、改善する方法はないでしょうか?
  • (1)SQL(遅い) SELECT 1, /*+ INDEX(T_UKERUI T_UKERUIP1) */ T.NO_UKE FROM T_UKE T ,M_OFF O ,M_KAI K WHERE T.CD_OFR = O.CD_OFR AND T.CD_KAIIN = K.CD_KAIIN AND T.CD_STS IN (3, 4) AND T.CD_SHIP = 0001 AND T.NO_ADDNO = 0
  • (1)SQL(速い) SELECT /*+ INDEX(T_UKERUI T_UKERUIP1) */ T.NO_UKE FROM T_UKE T ,M_OFF O ,M_KAI K WHERE T.CD_OFR = O.CD_OFR AND T.CD_KAIIN = K.CD_KAIIN AND T.CD_STS IN (3, 4) AND T.CD_SHIP = 0001 AND T.NO_ADDNO = 0
回答を見る
  • ベストアンサー

性能の改善について

以下の(1)のSQLと(2)のSQLで性能が全然違います。原因は明示的に「1」を取得するようにしているからなのですが、改善する方法はないでしょうか? (1)SQL(遅い) SELECT 1, /*+ INDEX(T_UKERUI T_UKERUIP1) */ T.NO_UKE FROM T_UKE T ,M_OFF O ,M_KAI K WHERE T.CD_OFR = O.CD_OFR AND T.CD_KAIIN = K.CD_KAIIN AND T.CD_STS IN (3, 4) AND T.CD_SHIP = 0001 AND T.NO_ADDNO = 0 (1)SQL(速い) SELECT /*+ INDEX(T_UKERUI T_UKERUIP1) */ T.NO_UKE FROM T_UKE T ,M_OFF O ,M_KAI K WHERE T.CD_OFR = O.CD_OFR AND T.CD_KAIIN = K.CD_KAIIN AND T.CD_STS IN (3, 4) AND T.CD_SHIP = 0001 AND T.NO_ADDNO = 0

  • Oracle
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。 せっかくINDEXを指定しているのに、意味が無くなってますね・・・。 (TABLE ACCESS FULL です・・・) SELECT /*+ INDEX(T_UKERUI T_UKERUIP1) */ 1, T.NO_UKE ではないですか? (^^ゞ

toshi_200578
質問者

補足

回答ありがとうございます。 「1」にもインデックスを指定しておけばよいのですね。1つ質問ですが、ひょっとして SELECT /*+ INDEX(T_UKERUI T_UKERUIP1) */ 1,     /*+ INDEX(T_UKERUI T_UKERUIP1) */ T.NO_UKE ってやらなくても1つだけでよいのですか? 今は全ての列にコメントを書いています..。

その他の回答 (1)

回答No.2

こんにちは。 >>今は全ての列にコメントを書いています..。 ??? 1回でいいですよ。 (^^ゞ

toshi_200578
質問者

お礼

あちゃ。やっぱりそうですか。。 すいません単純なことで。。 ありがとうございましたm(_ _)m

関連するQ&A

  • パフォーマンスについて

    次の2つのSQLで10秒前後の開きがあります。 原因は「CD_STS」なのですが、理由がわかりません。 データは700万件あります。 インデックスは「NO_UKE」と「CD_STS」につけています。インデックスは全部で5つあります。 なぜこれほど違いがでるのでしょうか? 原因がわかったのでお客さんに説明したいのですが理由がわからなくて困っています。。 考えられそうな理由があればお願いいたします。 ■即■ select CD_STS from T_STS where CD_KAIIN = 50 and FL_DEL = 0 and NO_UKE = 10 and (CD_STS <= 7 and CD_STS >= 7) ■10秒前後かかる■ select CD_STS from T_STS where CD_KAIIN = 50 and FL_DEL = 0 and NO_UKE = 10 and CD_STS = 7

  • パフォーマンスについて

    現在1つのSQLで10秒程度かかります。 データが700万件あるのでそれが原因というのもありますが、それにしても遅いです。 以下のSQLです。 select CD_STS from T_STS where NO_UKE = '20000' and CD_STS = '07' インデックスに「NO_UKE」と「CD_STS」で作成しています。 なにかいい方法はありませんか?

  • 目的のインデックスが使用されない・・。

    以下のSQLではインデックス1を使用してほしいのですがインデックス2が使われています。 インデックス1を使用されるように変更する方法を 教えてください。 インデックス1:「NO_UKE」「CD_STS」 インデックス2:「CD_STS」 select CD_STS from T_STS where NO_UKE = 10 and CD_STS = 7

  • SQL文のEXISTSについて

    DBはmysql5.0を使っています。 以下のSQL文を、EXISTSを境に2つに分解することはできないでしょうか?? SELECT ROUND(SUM(IFNULL(T.DAIKIN,0) - IFNULL(T.TESURYO,0))/10000,1) INTO v_PRICE2 FROM TORIHIKI AS T WHERE T.TORIHIKI_KBN = '1' AND EXISTS (SELECT * FROM TORIHIKI AS T2 WHERE T2.TORIHIKI_DATE >= F_DATE AND T2.TORIHIKI_DATE <= T_DATE AND T2.TORIHIKI_KBN = '2' AND T2.KEHAI_CD = LPAD(v_SOBA_CD,5,'0') AND T2.KAIIN_SBT = v_KAIIN AND T.SEIRI_NO = T2.SEIRI_NO AND ROUND((IFNULL(T2.DAIKIN,0) + IFNULL(T2.TESURYO,0))/10000,1) >= p_MIN AND ROUND((IFNULL(T2.DAIKIN,0) + IFNULL(T2.TESURYO,0))/10000,1) < p_MAX );

  • 特定カラムの値を変更したいのですが

    お世話になります。DB初心者です。 現在 、PostgreSQLのphpPgAdminを使っていまして 以下のようなDBがあり kaiin_no  t_name   t_chiket -------+-------+---------- 1001    太郎     なし 1002    次郎     なし 1003    三郎     なし 1004    四朗     あり 1005    五朗     あり 以下のようなSQLで目的のデータを表示できるのは解ったのですが SELECT "kaiin_no","t_name","t_chiket" FROM "public"."store_table" WHERE "kaiin_no" IN ('1001','1002','1003'); kaiin_no '1001','1002','1003' の t_chiket を 「なし」 から 「あり」 に変更すする方法をご教授いただけますでしょうか? お手数をおかけしますがよろしくお願いいたします。

  • phpPgAdminを使ってデータの更新

    PostgreSQLのphpPgAdminを使ってデータの更新をしようと思うのですが 特定の kaiin_no を選んで その t_tiket の値を '取扱っている' に更新したいのですが 文法エラーが出ます。 文: update "store_table" set "t_tiket" = '取扱っている' where "kaiin_no" = ('100','101','103'); SQL エラー: ERROR: operator does not exist: character = record LINE 1: ...t_tiket" = '取扱っている' where "kaiin_no" = ('100... ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. phpPgAdmin では、= や ( ) 、" の使い方に特徴があるようなのです。 WHERE kaiin_no IN ('100','101','103'); とすべきなのでしょうか? ご存知の方がいらっしゃればご教示くださいませ。

  • PostgreSQLのphpPgAdminを使って

    お世話になります。 PostgreSQL8.4.8のphpPgAdmin3.5.3を使ってデータを削除する際に 先ずデータをSELECT で表示させて確認後、 SQL編集 で SELECTを DELETE に書き換えて実行しましたが以下エラーが出ます ≪一覧確認用≫一覧表示はできました。 SELECT "kaiin_no","tenpo_no","tenpo_name" FROM "public"."store_table" WHERE "kaiin_no" IN ('1234',2222'); ≪削除用≫SELECT  → DELETEに変更 → 実行 → 以下エラー DELETE "kaiin_no","tenpo_no","tenpo_name" FROM "public"."store_table" WHERE "kaiin_no" IN ('1234',2222'); ≪エラー内容≫ ERROR: syntax error at or near "," LINE 1: SELECT COUNT(*) AS total FROM (DELETE "kaiin_no","tenpo_no",... ^ 文: SELECT COUNT(*) AS total FROM (DELETE "kaiin_no","tenpo_no","tenpo_name" FROM "public"."store_table" WHERE "kaiin_no" IN ('1234','2222')) AS sub 文法エラーのようなのですが 一覧が出来ているのに なぜ削除が出来ないのか 初心者で恐縮ですが ご教示頂ければ幸いです。

  • sedに関する質問

    ★以下のファイルがあるとします。 SQL> select count(*) from koumoku where no = 1052 and mid =2; COUNT(*) ---------- 7 SQL> select count(*) from koumoku where no = 1053 and mid =3; COUNT(*) ---------- 4 SQL> select count(*) from setumei where no = 1054 and mid =2; COUNT(*) ---------- 9 SQL> select count(*) from setumei where no = 1055 and mid =7; COUNT(*) ---------- 5 SQL> select count(*) from imi where no = 1056 and mid =2; COUNT(*) ---------- 9 SQL> select count(*) from imi where no = 1057 and mid =6; COUNT(*) ---------- 3 ★ここでsedコマンドを利用して、 koumoku COUNT(*) ---------- 7 koumoku COUNT(*) ---------- 4 setumei COUNT(*) ---------- 9 setumei COUNT(*) ---------- 5 imi COUNT(*) ---------- 9 imi COUNT(*) ---------- 3 のように取り出したいのですが、方法が分からないので、 誰か教えてもらえますか?宜しくお願いします。

  • PL/SQLでログを確認したい。

    以下のPL/SQLで取ってきた値をログか何かで確認したいのですが、いい方法がありますか? 想像では5行目あたりにログはきだす記述をするのかなと思うのですが、方法がわかりません。 どなたか教えてください。 -------------------------------------------- 1select count(*) into vn_CNT from t_ukerui 2 where no_toi = :new.no_toi 3 and no_uke = :new.no_kyaku 4 and no_gyo = 1; 5 6if ( vn_CNT > 0 ) then 7 --------------------------------------------

  • 暗号化されない

    MySQLとPHP4でカード番号を暗号化しようとしています。16桁の数値で暗号化が一文字となっていたり復号化できていないようです。教えてください。 暗号化 UPDATE kaiin SET vmem_card_no= aes_encrypt('1111-1111-1111-1111','happy') where vmem_no=9; $result = mysql_query($sql,$db) or die("失敗しました"); 復号化 SELECT AES_DECRYPT(card_no,'happy') FROM kaiin where kaiin_no =9; $result = mysql_query($sql,$db) or die("失敗しました"); if($row = mysql_fetch_array($result,MYSQL_ASSOC)){  print "card_no=".$row['card_no']."<hr>"; }どこかおかしいでしょうか?教えてください。

    • ベストアンサー
    • MySQL