Parag Kalra wrote:
Ok I increased the ora_array_chunk_size size as shown below (I hope its correct)

# Connecting to database
my $dbh = DBI->connect("dbi:Oracle:$dbname", $uname, $passwd,{
      PrintError => 0,
      RaiseError => 0,
      ora_array_chunk_size => 1000000
  } ) or die "Could not connect to the database\n";

Also removed the section to drop and create table from all the 3 scripts. Here are the new results with same set of records:

sqlldr conv    - 27 seconds
DBD::Oracle - 37 seconds
sqlldr direct  - 02 seconds

The bottom line is sqlldr if used in direct mode is incomparable but DBD::Oracle is almost as efficient as sqlldr used in conventional mode


I agree with that. I can see that the extra time perl is using most likely has to do with getting the tuples back to perl. This is good stuff as it shows that DBD::Oracle is comparable or at least close in processing time to SQLLDR. Or course with Perl you get a complete language so your potential for processing is much greater.

I do have a question about sqlldr does it keep a record of the 'failed' inserts or does it just report at the end. In DBD::Oracle we get a set of Tuples that we can recheck for errors is there
comparable in SQLLDR??

Cheers
John


Cheers,
Parag



On Sun, May 2, 2010 at 5:27 PM, Jeffrey Seger <j...@jeffseger.com <mailto:j...@jeffseger.com>> wrote:

    I think you have to keep the time reading records and setting up the
    arrays in the comparison, as SQLLDR has to read and parse too.  I do
    agree that this could be sped up by changing the chunk size though.

    I'd also take out dropping and re-creating the table, or at the very
    least, time that operation separately.  If you are calling TRUNCATE in
    your SQLLDR script, then call TRUNCATE in your Perl script as well.




    On Sun, May 2, 2010 at 7:58 PM, John Scoles <sco...@pythian.com
    <mailto:sco...@pythian.com>> wrote:
    > That seems about right a millon records in less than a min is
    very fast.
    >
    > This could be spead up a bit by setting 'ora_array_chunk_size'
    to a larger
    > value than the default 1000.
    >
    > If you can run it again with 10000 and 100000 or even 1000000 to
    see what we
    > get.
    >
    > I couldn't tell from your code but you are only testing the time
    it takes to
    > do the insert and not the time to set up the arrays??
    >
    > cheers
    > John SColes
    >
    > On Sun, May 2, 2010 at 7:44 PM, Parag Kalra
    <paragka...@gmail.com <mailto:paragka...@gmail.com>> wrote:
    >
    >> Ok here is the thing.
    >>
    >> This afternoon I coded few scripts and created a test setup to
    validate the
    >> benchmarking results of the various tools and following are the
    results:
    >>
    >> Environment Settings
    >> Operating System: Windoze XP SP3  (sorry couldn't test it Nix
    as it is a
    >> prod box)
    >> Database: Oracle 10g 10.2.0.1.0
    >> Perl: 5.10.1
    >> DBD-Oracle: 1.21
    >> Total records used for testing: 1048576
    >>
>> Time of insertion taken by sqlldr in conventional mode - 35
    >> seconds
    >> Time of insertion taken by sqldr in direct mode -
    >> 06 seconds
    >> Time of insertion taken by DBD::Oracle using the array
    interface - 46
    >> seconds
    >>
    >> PFA the Perl script used for testing. Let me if any of you
    interested in
    >> viewing the sqlldr control scripts.
    >>
    >> Cheers,
    >> Parag
    >>
    >>
    >>
    >> On Sun, May 2, 2010 at 12:27 PM, Jeffrey Seger
    <j...@jeffseger.com <mailto:j...@jeffseger.com>> wrote:
    >>
    >>> My experience is that DBD::Oracle using the array interface is
    >>> comparable performance-wise to SQLLDR in conventional path mode.
    >>> However, SQLLDR can also be called in direct path mode, which
    is even
    >>> faster, but you should really know what you are doing before using
    >>> that.  It has implications beyond the performance aspect that
    you need
    >>> to be aware of.
    >>>
    >>> If you want/need/understand using direct path, then SQLLDR is
    the way
    >>> to go.  If you want better integration with the rest of your
    program
    >>> then DBD::Oracle is the way to go.
    >>>
    >>> On Sun, May 2, 2010 at 4:20 AM, Parag Kalra
    <paragka...@gmail.com <mailto:paragka...@gmail.com>> wrote:
    >>> > Hi All,
    >>> >
    >>> > I want to know which one of these algorithm would be the
    most optimized
    >>> > solution to insert large number of records and Why:
    >>> >
    >>> > 1. Preparing an Insert query once and executing it with
    place holders
    >>> for
    >>> > the entire set of records
    >>> > 2. Executing Oracle's sqlldr command and uploading the same
    set of
    >>> records
    >>> >
    >>> > Cheers,
    >>> > Parag
    >>> >
    >>>
    >>>
    >>>
    >>> --
    >>> "Champions do not become champions when they win the event,
    but in the
    >>> hours, weeks, months and years they spend preparing for it. The
    >>> victorious performance itself is merely the demonstration of their
    >>> championship character." -T. Alan Armstrong
    >>>
    >>> "The Ow that can be expressed is not the true Ow." - Ao Tzu
    >>>
    >>
    >>
    >
    > --
    > Miss MySQL Conference 2010?  No problem.
    > Access Pythian speaker session videos at http://bit.ly/mysql2010
    >
    >



    --
    "Champions do not become champions when they win the event, but in the
    hours, weeks, months and years they spend preparing for it. The
    victorious performance itself is merely the demonstration of their
    championship character." -T. Alan Armstrong

    "The Ow that can be expressed is not the true Ow." - Ao Tzu



Reply via email to