これを試してください:
id2 = csv.reader(open(os.path.join(perf_dir,id_files[1])))
h = tuple(next(id2))
create = '''CREATE TABLE id2 (%s varchar, %s int PRIMARY KEY, %s int)''' % h
insert = '''INSERT INTO id2 (%s, %s, %s) VALUES (%%s, %%s, %%s)''' % h
...
cr.executemany(insert, id2)
すべての行に対して1回だけsqlコマンドを渡します。追加のSQLコマンドを発行することによるパフォーマンスのオーバーヘッドに加えて、SQL文字列自体のサイズ(バイト単位)が、テスト対象の実際のデータのサイズよりも小さい可能性があることに注意してください。
配列なしでid2をジェネレーターとして使用すると、データセット全体をメモリにロードすることも回避できます。