Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [JAVA+MYSQL]: velocità di esecuzione

    ciao.
    una domanda:
    è più veloce eseguire update e/o delete all'interno di un for (ad esempio)
    codice:
    for (...)
    {
    altre operazioni
    query di update
    altre operazioni
    query di delete
    }
    in "altre operazioni" eseguo query di select...
    ah... dimenticavo... il punto è che la query di update/delete all'interno del for non si ripetono solo una volta, ma possono ripetersi più volte perchè all'interno di while di risultati di query di select )

    oppure è meglio che nel for mi memorizzo tutto da qualche parte (stringa o file) e li eseguo insieme (per insieme non intendo tutto con una query perchè non mi sembra possibile nel caso di update o delete, ma intendo ad esempio prendere una delle update/delete memorizzate ed eseguirla, prendere la succesiva ed eseguirla e cosi via...

    come mi consigliate? ho bisogno di tanta tanta tanta tanta velocità!!! :master:
    oppure avete altri suggerimenti?
    grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Dipende da quello che devi fare: niente di vieta di cancellare anche un milione di record in un colpo solo... per esempio, tramite un oculato utilizzo della clausola WHERE. Se ci posti un po' di query che vengono prodotte in quei cicli for vediamo se si può ottimizzare qualcosina.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    questo è il codice, ma non so se ci capirai qualcosa, a volte fatico anch'io a capire ciò che ho scritto...
    codice:
    long numeroID=0;
    numeroID=this.trovaIdMax();
    ResultSet rs=null;
    PreparedStatement ps=null;
    PreparedStatement ps2=null;
    PreparedStatement ps3=null;
    PreparedStatement ps4=null;
    			
    String query="select * from persona where id_persona=?;";
    ps=connessione.prepareStatement(query);
    String update="update scritto set id_persona=? where id_persona=?;";
    
    String delete="delete p.* from persona p where id_persona=?;";
    ps3=connessione.prepareStatement(delete);
    			
    String query2="select id_persona,ptype,name from persona where name=?;";
    ps4=connessione.prepareStatement(query2);
    ResultSet res=null;
    			
    			
    String controlla="select id_articolo,id_persona from scritto where id_persona=?;";
    String del="delete s.* from scritto s where id_persona=? and id_articolo=?;";
    PreparedStatement ps5=null;
    PreparedStatement ps6=null;
    PreparedStatement ps7=null;
    
    ResultSet rs5=null;
    ResultSet rs6=null;
    			
    			
    ps2=connessione.prepareStatement(update);//-----
    ps5=connessione.prepareStatement(controlla);//--
    ps6=connessione.prepareStatement(controlla);//--
    ps7=connessione.prepareStatement(del);//--
    for (long i = 1 ; i < numeroID ; i++)
    {
    	String ivalue=String.valueOf(i);
    	ps.setString(1,ivalue);
    	rs=ps.executeQuery(); //select * from persona where id_persona=?;
    	while (rs.next())
    	{
    		String nomecorrente=rs.getString(2);
    		ps4.setString(1,nomecorrente);
    		res=ps4.executeQuery(); //select id_persona,ptype,name from persona where name=?;
    		while (res.next())
    		{
    			String name=res.getString(3);
    			Long idcorrentelong=Long.parseLong(res.getString(1));
    			String type=res.getString(2);
    			if(idcorrentelong!=i && type.equals("author"))
    			{
    
    				if (nomecorrente.toLowerCase().equals(name.toLowerCase()))
    				{
    					ps5.setString(1,String.valueOf(i));
    					rs5=ps5.executeQuery();
    					ps6.setString(1,String.valueOf(idcorrentelong));
    					rs6=ps6.executeQuery();	
    					while (rs6.next())
    					{
    						String art2=rs6.getString(1);
    						String idp=rs6.getString(2);
    									
    						while (rs5.next())
    						{
    							String art=rs5.getString(1);
    							if (art.equals(art2))
    							{
    								ps7.setString(1,idp);
    								ps7.setString(2,art2);
    								ps7.executeUpdate();
    								ps3.setString(1,String.valueOf(idp));
    								ps3.executeUpdate();
    							}
    						}
    					}//end while rs6
    								
    				}
    				else
    				{
    					ps2.setString(1,String.valueOf(i));
    					ps2.setString(2,String.valueOf(idcorrentelong));
    					ps2.executeUpdate();
    					ps3.setString(1,String.valueOf(idcorrentelong));
    					ps3.executeUpdate();
    				}		
    			}//end main if								
    		}
    	}
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ecco, bravo, non c'ho capito niente
    Posta solo le query, in SQL, niente, non serve a questo punto. Vorrei capire che cosa vuoi fare, anche perché il dramma lì è proprio l'implementazione...
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    mi dici anche come posso cancellare più record in un solo botto (che però differiscono dalla clausola where)?
    se si può fare questa cosa, riesco gia a velocizzare...
    per "in un solo botto" intendo tipo come la insert
    codice:
    insert into tabella values (x,y,z),
    (a,b,c),
    (s,d,f);

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    PEr esempio è lecito avere una query del genere:

    DELETE FROM tabella WHERE id=1 OR id=2 OR id= 10

    o anche

    DELETE FROM tabella WHERE id < 100 AND id > 50
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    ok nel prox post spiego un po cio che devo fare...
    sto scrivendo...
    ma la stessa cosa posso fare anche per le update? (tipo tutto in un botto?)

  8. #8
    allora...
    ho questo problema
    ho 2 tabelle Persona e Scritto
    persona(id_persona,name,ptype)
    scritto(id_persona,id_articolo)

    mi ritrovo in persona dei nomi duplicati con differenti id
    questa cosa non mi piace.

    quindi essendoci un vincolo di integrità referenziale tra scritto(id_persona) e persona(id_persona), devo prima modificare i valori in scritto e poi in persona.
    mi spiego:
    devo confrontare tutti i valori
    quindi faccio questa query per prendermi un qualsiasi id
    select * from persona where id_persona=?

    poi devo prendermi il nome dell'id scelto
    quindi
    select id_persona,ptype,name from persona where name=?;

    ora c'è if(idcorrentelong!=i && type.equals("author")
    qui verifico che gli id della persona che sto cercando siano entrambi author e che abbiano differenti id


    ora saltiamo la parte che dice
    if (nomecorrente.toLowerCase().equals(name.toLowerCas e())) perchè probabilmente lo toglierò perchè ho trovato il bug che mi ha costretto a fare l'if... (nel caso in cui decidessi di non togliere questo if commenterò anche questa parte)
    andiamo all'else

    devo aggiornare i campi in scritto quindi
    update scritto set id_persona=? where id_persona=?;
    poi devo eliminare da persona quindi
    delete p.* from persona p where id_persona=?;

    credo di aver scritto tutto... spero di essere stato chiaro!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    ah... dimenticavo una cosa importantissima...
    le tabelle hanno molti molti molti molti record, superiore al milione...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.