解決したいこと
innoDBで、下記エラーが出ています。これを回避したいです。
The total number of locks exceeds the lock table size
実行しているSQL文
SQL文は下記のような感じです。
SQL
1replace INTO tbl_a( 2 str1 3 , str2 4 , updateDatetime 5 , updateNum 6 ) 7 select distinct 8 str1 9 , str2 10 , now() as updateDatetime 11 , 1 as updateNum 12 FROM 13 tbl_b
tbl_bは巨大なテーブルです。phpmyadminの表示で5億5千万レコード、テーブルサイズは727GBです。
上記SQL文のdistinct結果は、おそらく1~2GB程度になるハズです。
現在の innodb_buffer_pool_size の設定は、512MBです。
tbl_aはカラの状態で実行しています。
※直前でtruncateしています。
innodb_buffer_pool_size のサイズは、物理メモリ環境を考えると10GBくらいまで増やせますが、上記のtbl_bは現在の10倍くらいまで肥大化する想定のため、 innodb_buffer_pool_size の調整だけでは解決しきれないように感じています。
また、上記SQL文が走っている間、tbl_a、tbl_bともに、他のスレッドからinsert・update・delete等が実行されないことはアプリケーション上で保証できます。つまり、行ロックの機能自体が、今回の私のニーズとしては不要です。
考えていること
「The total number of locks exceeds the lock table size」でググると、
- innoDBでのselectでは行ロックが行われる
- 行ロックの際にメモリが使われる
- 行ロックのためにメモリが必要なので、必要なぶんだけ innodb_buffer_pool_size を増やせ
というような記述のあるサイトが多くあります。
それに対して、私は下記のように考えています。
- そもそも、私のニーズとしては行ロックが不要。メモリを極力使わない形で上記SQLを実行できないだろうか?
- innodb_buffer_pool_size は10GBまでは増やせるけど、それ以上はコスト上難しい。
何らかの形で、極力、innodb_buffer_pool_size を増やさずに、上記SQL文を正常実行できるような手段はないでしょうか。
知識のある方、ご回答をよろしくお願い致します!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/28 03:42
2018/12/29 13:21
2019/01/07 03:28