Rumah > Soal Jawab > teks badan
今天下午和同事发生因为判断数据是否在数据库中已存在产生分歧.简易代码如下:
//观点一,先取出数据库中已存在ID存入内存,再进行判断
//数据太多情况,内存爆炸
DateTable dt = ExcuteSQL('SELECT ID FROM TABLE');
//List为数据集,已经去重
foreach(var item in List){
//观点二,在for循环中根据ID查询是否已存在
//for循环执行数据库?没这么干过
DateTable dt = ExcuteSQL(string.format('SELECT ID FROM TABLE WHERE ID = {0}',item.ID));
//判断是否在dt中存在
...
bool ISContain
...
//不存在
if(!ISContain){
//加入事物SQL列表
SQLList.Add('INSERT INTO ........');
}
}
//执行事物
....
迷茫2017-04-18 10:56:26
Malah, perkara pertama yang perlu anda anggarkan ialah jumlah data sebenar Jika ID adalah jenis Long dan jumlah data ialah 100W, ia hanya akan menjadi 8bait * 100W = 7.629 megabait.
Yang kedua sangat diperlukan, tanya setiap ID dalam satu gelung.
天蓬老师2017-04-18 10:56:26
Kaedah 2 yang disyorkan, tetapi pertanyaan ini akan menjadi lebih pantas:
SELECT id FROM table WHERE id IN (?, ?, ?, ...)
Perhatikan bahawa pangkalan data yang berbeza mempunyai sekatan pada parameter ?
Sebaik-baiknya tidak melebihi 1,000. Jika anda perlu menentukan 10,000 ID, gunakan 10 pertanyaan sedemikian.
黄舟2017-04-18 10:56:26
Sepatutnya lebih baik menggunakan kaedah yang disebut oleh @auntyellow dan bertanya secara berkelompok. Apabila terdapat banyak ID, pertimbangkan sama ada anda boleh menyemaknya dalam kaedah kelompok lain? Sebagai contoh, ambil semua id
untuk satu tempoh masa sekali gus dan perbaiki sedikit kaedah 1 untuk mencapai ini.
Rasanya kedua-dua Kaedah 1 dan Kaedah 2 adalah melampau, jadi penyelesaian yang baik haruslah gabungan kedua-duanya.
怪我咯2017-04-18 10:56:26
Adalah disyorkan untuk menggunakan kaedah pertama mengambil ID daripada pangkalan data dan kemudian membandingkannya dalam ingatan, yang boleh mengurangkan akses pangkalan data.
PHP中文网2017-04-18 10:56:26
Bolehkah ia dibahagikan kepada ingatan ini boleh mengurangkan penggunaan memori