IN句上限

 

(8.0.29)
調べた限り上限はない模様
実際には100万件程度が上限の模様

 

前提:
CPU2コア、メモリ4G
tab1の件数=1

vim /etc/my.cnf 
max_allowed_packet = 1G
innodb_buffer_pool_size = 2G

 

: > a.sql

echo "select 1 from tab1" >> a.sql
echo "where col1 in (1" >> a.sql
for k in {1..10}; do
  for i in {1..1000000}; do
    echo ",1"
  done >> a.sql
done

echo ");" >> a.sql


show variables like 'max_allowed_packet';
show variables like 'innodb_buffer_pool_size';

source a.sql


100万件(SQLサイズ: 2.9M) 
-> 1.14 sec

1000万件(SQLサイズ: 29M) 
->
ERROR 1041 (HY000): Out of memory; check if mysqld or some other process uses all available memory;
if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space

スワップを10G追加したが、エラーは解消しなかった

 

(19c)

上限値: 1000

前提:
tab1の件数=1

: > a.sql

echo "select 1 from tab1" >> a.sql
echo "where col1 in (1" >> a.sql
for i in $(seq 1 1000); do
  echo ",1"
done >> a.sql

echo ");" >> a.sql


@a.sql

行1002でエラーが発生しました。:
ORA-01795: リストに指定できる式の最大数は1000です。

 

(14)
調べた限り上限はない模様
実際には100万件程度が上限の模様

前提:
CPU2コア、メモリ4G
tab1の件数=1

 


: > a.sql

echo "select 1 from tab1" >> a.sql
echo "where col1 in (1" >> a.sql
for k in {1..10}; do
  for i in {1..1000000}; do
    echo ",1"
  done >> a.sql
done

echo ");" >> a.sql

show work_mem;
set work_mem = '2GB';
show work_mem;

\timing 1
\i a.sql


100万件(SQLサイズ: 2.9M) 
-> 時間: 909.692 ミリ秒

1000万件(SQLサイズ: 29M) 
->
2022-08-20 10:24:51.868 JST [2968] ERROR:  invalid memory alloc request size 1476395008

 

(2019)
調べた限り上限はない模様
実際には100万件程度が上限の模様


前提:
CPU2コア、メモリ8G
tab1の件数=1


EXEC sys.sp_configure N'max server memory (MB)', N'7000'
GO
RECONFIGURE WITH OVERRIDE
GO

sp_configure 'show advanced options', 1;
go
reconfigure;
go
sp_configure 'network packet size (B)', 32767;
go


echo $null > a.sql

echo "select 1 from tab1" >> a.sql
echo "where col1 in (1" >> a.sql
for ($k=1; $k -le 10; $k++){
  for ($i=1; $i -le 1000000; $i++){ 
    echo ",1" >> a.sql
  }
}
echo ");" >> a.sql


sqlcmd -d test -b -i a.sql


100万件(SQLサイズ: 7.6M) 
-> OK

1000万件(SQLサイズ: 76.2M) 
-> 
このクエリを実行するには、リソース プール 'default' のシステム メモリが不足しています。


※ファイルサイズがLinuxの場合より大きいのはBOM付UTF-16で出力されているため