独自のINSERTをサポートするインメモリデータベースに:今すべてのOracle構文
select * from FOO foo where foo.id IN (ids)
、ids
は、およそ7000残念ながら、Oracleの文字列の大規模なコレクションですIN節には1000要素の制限があります。
これを克服するために、私は次のいずれかです。 私はそれも動作するかどうかはわからないと私は本当にそれが一時的な
- は、動的にクエリを連結テーブルを開き、クエリを
select * from FOO foo join SOME_TEMPORARY_ID tempids on foo.id = tempids.id
に書き換えます。
私は2つのオプションのために行くことに決めました。問合せを実行する前に、Oracleに効率的なバッチ・インサートをどうにかして実行する必要があります。残念ながら、Oracleはバッチ挿入を行うために独自の構文があります。今すぐ
INSERT ALL
INTO some_table VALUES ('foo')
INTO some_table VALUES ('foo1')
INTO some_table VALUES ('foo2')
....
INTO some_table VALUES ('foo12345')
SELECT * FROM DUAL
、私は言及しなかったが、私は、このための統合テストを書きたい、理想的にH2や他のインメモリデータベースを使用します。 もちろん、H2はその構文をサポートしていません。 HSQLDBもどちらもしません。
独自のOracle構文を完全にサポートするメモリ内のデータベースを知っていますか?または少なくともこの特定の1つのINSERT ALL節?
パフォーマンスはどうですか?一時的なテーブルや7k要素のIN節を使用すると、よりパフォーマンスが向上するはずですか? – slnowak
@slnowak idsはコレクションであることに注意してください。なぜこのようなsmtを行うのはなぜですか?select * from foo foo where foo.id IN(select * from table(collection ids)) '。 idsはネストされた表です。あなたはそれにIDをプルしてクエリを実行することができます。パフォーマンスについて私はネストしたテーブルが最高で、一時的なものは2番目、条件は3番目のものだと思います。 –
構文と機能自体についてもう少し説明してください。私はそれが存在するのか分からなかった。それは多かれ少なかれ一時テーブルを作成することと同等ですか?それで、1k IN句の制限に苦しんでいないのですか? – slnowak