2010-06-02 6 views
0

J'ajoute des données de vba excel en utilisant adodb dans une base de données MySQLdevrais-je créer un index pour cela?

Tout fonctionne très bien mais est lent. l'ensemble du processus prend environ 5 secondes.

Je crois que la raison pour laquelle il est lent parce que je suis filtrer:

Dim rowid_batchinfo As String 
rs.Filter = "datapath='" + dpath + "' and analystname='" + aname + "' and reportname='" + rname + "' and batchstate='" + bstate + "'" 
If Not rs.EOF Then 
    rowid_batchinfo = rs.Fields("rowid") 
    cn.Execute "delete from batchinfo where rowid=" + rowid_batchinfo 
    cn.Execute "delete from calibration where rowid='" + rowid_batchinfo + "'" 
    cn.Execute "delete from qvalues where rowid='" + rowid_batchinfo + "'" 
End If 

je ne sais pas exactement processus qui est à blâmer, mais je suis assumign le delete where me dilatoire. l'une des tables compte environ 500 000 lignes, l'autre environ 300 000 et les 5 000 autres.

ici est la deuxième partie:

With rs 
    .AddNew ' create a new record 
    ' add values to each field in the record 
    .Fields("datapath") = dpath 
    .Fields("analysistime") = atime 
    .Fields("reporttime") = rtime 
    .Fields("lastcalib") = lcalib 
    .Fields("analystname") = aname 
    .Fields("reportname") = rname 
    .Fields("batchstate") = bstate 
    .Fields("instrument") = instrument 
    .Update ' stores the new record 
End With 
' get the last id 
Set rs = cn.Execute("SELECT @@identity", , adCmdText) 
capture_id = rs.Fields(0) 
'MsgBox capture_id 
rs.Close 
Set rs = Nothing 

cette partie ajoute les données. Je pense que c'est relativement rapide, mais je ne peux pas être sûr.

donc pour les instructions de suppression, peut-être que je devrais créer un index? Cependant, dans ce cas, il faudra probablement du temps pour créer l'index et il faudrait que je l'abandonne pour le recréer à chaque fois que j'en ai besoin.

quelqu'un sait comment je peux faire fonctionner ce code plus rapidement?

Répondre

1

Je ne vois pas pourquoi vous auriez besoin de supprimer l'index. Il suffit de le créer une fois sur le rowid s'il n'est pas déjà défini comme clé primaire sur chacune de ces tables, auquel cas il est déjà indexé. Enfin, au lieu de supprimer puis de réinsérer des données, vous pourriez éventuellement faire une mise à jour qui serait globalement plus rapide.

+0

merci. Je ne sais pas grand chose sur les index, à quelle fréquence se mettent-ils à jour? –

+1

Chaque fois que vous insérez ou supprimez une ligne, les index des tables affectées seront ajustés. De plus, si vous mettez à jour une colonne qui participe à un index et modifiez sa valeur sur une ligne, l'index correspondant sera également mis à jour. – Khorkrak

1

un index sur rowid pour toutes les tables aiderait

+0

à quelle fréquence? à chaque fois? combien de temps faut-il pour créer et supprimer un index? –

+1

une fois et c'est tout, MySQL pourra alors utiliser l'index – SQLMenace

Questions connexes