はじめに
SQLを勉強し始めたころからよく見るIN句について
1つのIN句では最大1000件まで指定できる
ORで結合を繰り返すことで1000件以上のデータも取得することが可能ですが
ふとIN句の結合を繰り返すと最大何件まで取得できるのだろうかと気になったので
以下のSQLのようにIN句を結合して検証してみた。
SELECT
column_A
FROM
TABLE_A
WHERE
column_A IN ('1',・・省略・・,'999','1000')
OR column_A IN ('1001',・・省略・・,'1999','2000')
OR column_A IN ('2001',・・省略・・,'2999','3000')
・
・
・
ORを繰り返していく
・
・
・
環境
Oracle Database 19c
MySQL 5.7.12
結論
■ORACLE
IN句で指定できるデータの件数は65,535件
■MySQL
MySQLではIN句の最大数は恐らく存在してない
※max_allowed_packetで指定しているデータサイズがSQLの最大サイズになるため
最大サイズになるまでIN句を結合可能でした。
max_allowed_packetのサイズを大きくしての検証はしません!許してください!
検証手順
■ORACLE
65,535件まではOK
65,536件(2の16乗)のときに
「エラー(ORA-00913: 値の個数が多すぎます)」が発生する
EXPLAIN PLAN FOR
select
column_A
from
(select 'hoge' as column_A from dual) TABLE_A
where
--1~10000
column_A in ('1',・・省略・・,'999','1000')
OR column_A in ('1001',・・省略・・,'1999','2000')
・
・
・
省略 単純にORで繰り返す
・
・
・
--65001~65500
OR column_A in ('65001',・・省略・・,'65499','65500')
--65501~65535
OR column_A in ('65501',・・省略・・,'65534','65535')
--以下のコメントを外して実行すると「エラー(ORA-00913: 値の個数が多すぎます)」が発生する
-- OR column_A in ('65536')
;
■MySQL
最大件数を調べるときにIN句の結合を繰り返すと以下のエラーがでました
「SQL : #08S01Got a packet bigger than 'max_allowed_packet' bytes」
MySQLだとIN句の最大ではなく「max_allowed_packet」の設定によって
SQL全体のサイズに影響されるようです。
EXPLAIN
select
TABLE_A.column_A
from
(select 'hoge' as column_A from dual) TABLE_A
where
TABLE_A.column_A in ('1',・・省略・・,'999','1000')
OR TABLE_A.column_A in ('1001',・・省略・・,'1999','2000')
・
・
・
省略 単純にORで繰り返す
・
・
・
実行環境のmax_allowed_packetの4MBまで繰り返して以下のエラーがでた
「SQL : #08S01Got a packet bigger than 'max_allowed_packet' bytes」
;
おわり
最後まで読んで頂いてありがとうございます。
こんなSQLを実装することなんて無いだろうから無駄な知識が1つ増えました