You don't say what database it is, but I'd be tempted to generate a .sql file and run it through the database's CLI command instead of using DBI.
On Wed, Mar 2, 2011 at 12:22 PM, Dan Cutler <dcut...@dsm.net> wrote: > Hi all! > > I am seeking some advice. > > I need to be able to drop several thousand (more like .25 million) tables > from a database using DBI. > > I've got a simple script that works but it is quite slow... > > The SLOW typical version: > while (my @rows = $sth->fetchrow_array) { # Get the list of tables to > drop from the a simple SQL query. > my ($tablename) = @rows; > $dbh->do("drop table $db.$tablename") or die $sql->errstr; > } > > My next attempt: > $dbh->do("drop table1; drop table2; ... drop tableN;") > -- fails! Apparently I can't do multi-statements ?? > > My next attempt: > $sth = $dbh->prepare("DROP TABLE ?") or die $sth->errstr; > $sth->bind_param_array(1,\@list_of_tables_to_drop); > my $result = $sth->execute_array({}) or die $sth->errstr; > > Also fails! I've tried many variations of the execute_array function (with > and without bind_param_array()), with and without { ArrayTupleStatus => \my > @tuple_status }). Maybe I just don't really get how to specify the params? > - Tried Google + documentation - I'm still confused! > > The real question (before I try to determine my code issue): > > What is the best typical approach when trying to get non-select statements > to run faster? Am I going down the right path? > > Thanks all! > > --Dan > > BTW, DBI version is 1.615 using DBD::Teradata driver. > -- Check out my LEGO blog at http://www.brickpile.com/ View my photos at http://flickr.com/photos/billward/ Follow me at http://twitter.com/williamward