が含まれています。SQL Developerを使用してOracleストアドプロシージャを変更する。再書き込みNOT INですが、サブクエリにはカンマ区切りの文字列(ID)
入力:カンマ区切りのID。 (例: 'P23、P37、P39、P45') 編集:入力が文字列であることに注意してください。ではなく、文字列の配列です。また、文字列は4つ以上のIDにすることもできます。約200にまで上がる可能性があります。
これらの入力IDを持たないテーブルを探してみたいです。
以下は遅すぎます。ちょうど約300行のデータ(表内)ですが、約20秒かかります。だから私は書き直したい。どのように行うかについてのヒントを教えてください。
ID_Arrayは 'P23、P37、P39、P45'です。
SELECT * FROM StudentInfo
WHERE StudentClass = 'Primary5A'
AND StudentID NOT IN
(
SELECT REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) StudentID
FROM DUAL
CONNECT BY REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) IS NOT NULL
)
AND Height <= 150;
すでにご存じの方もいらっしゃいます。次
SELECT REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) StudentID
FROM DUAL
CONNECT BY REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) IS NOT NULL
は4行の表(?テーブルのような構造)にID_Arrayをオンにします:
+-----+
| P23 |
| P37 |
| P39 |
| P45 |
+-----+
ハードID: 'AND StudentID NOT IN(' P23 '、' P37 '、' P39 '、' P45 ')と高さ<= 150'の場合、どれくらい時間がかかりますか?両方の実行計画は何を示していますか?あなたのステータスは最新ですか? –
テーブルではなく文字列で操作しているので、カンマで区切られた文字列を分割するさまざまな方法にはほとんど違いがありません。私は、アレックスが提案したように、何か間違っていると思います。 – Ben
文字列をハードコードします。実行計画:カーディナリティ:184、コスト:191、_real_データ。それは、StudentInfoの完全なテーブルスキャンを持っています。以下の回答を使用すると、両方の実行計画が非常に低い(コスト:5など)。 – user3454439