Maison > Questions et réponses > le corps du texte
今天下午和同事发生因为判断数据是否在数据库中已存在产生分歧.简易代码如下:
//观点一,先取出数据库中已存在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
En fait, la première chose que vous devez estimer est la quantité réelle de données. Si l'ID est de type Long et que la quantité de données est de 100 W, elle ne sera que de 8 octets * 100 W = 7,629 mégaoctets.
Le second est absolument nécessaire, interrogez chaque identifiant en boucle.
天蓬老师2017-04-18 10:56:26
Méthode 2 recommandée, mais cette requête sera plus rapide :
SELECT id FROM table WHERE id IN (?, ?, ?, ...)
Notez que différentes bases de données ont des restrictions sur les paramètres ?
Il est préférable de ne pas dépasser 1 000. Si vous devez déterminer 10 000 ID, utilisez 10 requêtes de ce type.
黄舟2017-04-18 10:56:26
Il devrait être préférable d'utiliser la méthode mentionnée par @aunt Yellow et d'effectuer des requêtes par lots. Lorsqu'il existe de nombreux identifiants, demandez-vous si vous pouvez les vérifier avec d'autres méthodes par lots ? Par exemple, prenez tous les id
pendant une période donnée à la fois et améliorez légèrement la méthode 1 pour y parvenir.
Il semble que la méthode 1 et la méthode 2 soient extrêmes, donc une bonne solution devrait être une combinaison des deux.
怪我咯2017-04-18 10:56:26
Il est recommandé d'utiliser la méthode consistant à récupérer d'abord l'ID de la base de données, puis à le comparer en mémoire, ce qui peut réduire l'accès à la base de données.
PHP中文网2017-04-18 10:56:26
Peut-il être segmenté en mémoire ? Cela peut réduire l'utilisation de la mémoire