質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

1471閲覧

Oracle SQLの速度改善

Program_

総合スコア11

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2020/06/03 06:46

前提・実現したいこと

TABLEに膨大な量のデータがあり、その中から該当のデータ「1件」を抽出したいのですが、
量が多いため読み込みに相当な時間が掛かります。
普段から心掛ける内容であると承知していますが、恥ずかしながらここに至るまで、
困った事が無く気にしていませんでした。

基礎的な部分しか学習できておらず、足りていない箇所も多々あると思いますが、ご助力お願い致します。

該当内容

[ 対象のTABLE ] 日時      |   氏名 |パス| ファイル  |種類 |項目1|項目2 ---------------------------------------- 2020/4/10 10:00 |東京 太郎 |XXX |参加者リスト.pdf |1 |ーーー|=== 2020/4/20 10:30 |大阪 花子 |XXX |編集済データ.pdf |1 |ーーー|=== 2020/4/30 12:30 |福岡 次郎 |YYY |リスト1.pdf |1 |ーーー|=== 2020/5/15 15:00 |仙台 三郎 |ZZZ |リスト2.pdf |1 |ーーー|=== ・ ・ ・ ・ 2020/3/10 15:00 |名古屋 五郎|XXX |リスト3.pdf |1 |ーーー|===
[ 抽出したいデータ ] 【パスがXXX】で【日時が直近】のデータを抽出 日時      |   氏名 |パス| ファイル  |種類 |項目1|項目2 ---------------------------------------- 2020/4/20 10:30 |大阪 花子 |XXX |編集済データ.pdf |1 |ーーー|===
[ 利用したSQL ] SELECT B.日時 ,B.氏名 ,B.ファイル名 FROM TABLE B WHERE B.パス = 'XXX' AND B.日時 =(            SELECT MAX(A.日時)             FROM TABLE A             WHERE A.パス = 'XXX'             GROUP BY A.パス           )

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toyotaku

2020/06/03 06:55

テーブルの索引はどのようになっていますか?
guest

回答3

0

ベストアンサー

直接値を指定したSQLで時間が掛かっている状態では意味がありませんので、先ずは以下の様なSQLでの実行時間を確認して下さいい。

SQL

1SELECT B.日時 2 ,B.氏名 3 ,B.ファイル名 4 FROM TABLE B 5 WHERE B.パス = 'XXX' 6 AND B.日時 = TO_TIMESTAMP('2020/4/20 10:30', 'YYYY/MM/DD HH24:MI')

上記では、少なくとも(パス、日時)のインデックスが必要です。

上記インデックスがあれば、質問のSQLでも大丈夫(サブクエリー内のGROUP BY A.パス は不要)では無いかと思いますが、パスのカーディナリティ次第では、以下のSQLの方が高速かもしれません

SQL

1[ 利用したSQL ] 2SELECT B.日時 3 ,B.氏名 4 ,B.ファイル名 5 FROM TABLE B 6 WHERE B.パス = 'XXX' 7 AND B.日時 =( 8           SELECT MAX(A.日時) 9            FROM TABLE A 10            WHERE A.パス = B.パス 11          )

投稿2020/06/03 10:18

sazi

総合スコア25300

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Program_

2020/06/09 04:39

質問後のアクションが遅くなり申し訳ございません。 インデックスとして取れるものが無い状態だったため、無理やり作って読み込ませました。 「パスのカーディナリティ」については認識の甘い部分が多く、今後意識していこうと思います。 ありがとうございました。
sazi

2020/06/09 04:46

インデックスを追加したら改善した、という事で宜しいですか?
guest

0

以下の情報を質問に追加してください。

TABLEに膨大な量のデータがあり、その中から該当のデータ「1件」を抽出したいのですが、

量が多いため読み込みに相当な時間が掛かります。

何件のデータがあるテーブルで、実際にかかっている時間は?

テーブルの情報 CREATE TABLE, CREATE INDEX, データはINSERT文で https://teratail.com/help/question-tips#questionTips3-7 の [コード] に変更してください。

Oracle EXPLAIN PLAN を使って実行計画を取得する も追加してください。

インラインビューの中の

GROUP BY A.パス

の1行は不要では?

投稿2020/06/03 07:06

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Whereの条件にサブクエリ突っ込まずに、その部分をまるごとWithにしてinner joinしてみては如何でしょうか。

投稿2020/06/03 07:00

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問