From: Andrew Libby Date: 2006-10-31T06:51:00+09:00 Subject: Re: Active Record speed Robert, Jaccob you two nailed it. Thanks a bunch. It's subtle, the difference between a list and an array especially with a perl background. Thanks! Andy Jacob Fugal wrote: > On 10/30/06, Andrew Libby wrote: >> I come from a Perl DBI and JDBC world, and would like to use >> prepared statements. So I've gotten the underlying Mysql >> connection (using ActiveRecord::Base.connection.raw_connection). > > My guess is that prepared statements are indeed the source of your > performance problems. IIRC, ActiveRecord does not cache prepared > statements by default (and if there's an option for it, I do not know > of it) so you're essentially calling prepare once for each INSERT! For > most Rails applications this is a space for improvement but not a show > stopper. For importing loads of data, it's simply unacceptable. > >> When I have code like >> >> stmt = conn.prepare(%Q/ >> INSERT INTO sometable (t1,t2,t3,t4) >> VALUES (?,?,?,?) >> /) >> >> bind_params = [1,2,3,4] >> >> stmt.execute(bind_params) >> >> I get an error on the execute statement. It claims I need >> to send it 4 parameters. > > Unlike in perl (which I'm assuming you're used to from the symptoms > here), arrays and lists are not *quite* the same thing in Ruby. When > you call stmt.execute(bind_params), you are not passing a list of four > parameters to execute (as you might expect), but just one parameter > that is an array. Fortunately, Ruby does provide a mechanism for > "splatting" an array into a list of parameters: > > stmt.execute(*bind_params) # note the star > > Let us know if this takes care of it for you! > > Jacob Fugal > -- Andrew Libby Tangeis, LLC Innovative IT Management Solutions alibby@tangeis.com