Re: [psycopg] speed concerns with executemany() - Mailing list psycopg

From Adrian Klaver
Subject Re: [psycopg] speed concerns with executemany()
Date
Msg-id 6946356a-7451-7032-9011-e054f013a3a3@aklaver.com
Whole thread Raw
In response to Re: [psycopg] speed concerns with executemany()  (mike bayer <mike_mp@zzzcomputing.com>)
Responses Re: [psycopg] speed concerns with executemany()  (Daniele Varrazzo <daniele.varrazzo@gmail.com>)
List psycopg
On 01/01/2017 11:14 AM, mike bayer wrote:
>
>
> On 12/24/2016 12:00 AM, Adrian Klaver wrote:
>> On 12/23/2016 06:57 PM, Christophe Pettus wrote:
>>>
>>>> On Dec 23, 2016, at 18:55, Adrian Klaver <adrian.klaver@aklaver.com>
>>>> wrote:
>>>> Alright that I get. Still the practical outcome is each INSERT is
>>>> being done in a transaction (an implicit one) so the transaction
>>>> overhead comes into play. Or am I missing something?
>>>
>>> Nope, not missing a thing.  The theory (and it is only that) is that
>>> when they do the .executemany(), each of those INSERTs pays the
>>> transaction overhead, while if they do one big INSERT, just that one
>>> statement does.
>>
>> Just ran a quick and dirty test using IPython %timeit.
>>
>> With a list of 200 tuples each which had 3 integers INSERTing into:
>> test=> \d psycopg_table
>>  Table "public.psycopg_table"
>>  Column |  Type   | Modifiers
>> --------+---------+-----------
>>  a      | integer |
>>  b      | integer |
>>  c      | integer |
>>
>>
>> The results where:
>>
>> sql = "INSERT INTO psycopg_table VALUES(%s, %s, %s)"
>>
>> Without autocommit:
>>
>> In [65]: timeit -n 10 cur.executemany(sql, l)
>> 10 loops, best of 3: 12.5 ms per loop
>>
>>
>> With autocommit:
>>
>> In [72]: timeit -n 10 cur.executemany(sql, l)
>> 10 loops, best of 3: 1.71 s per loop
>
>
> please ensure you run this test with statements passing over a real
> network connection and not localhost.  makes a significant difference.

Same code across network, client in Bellingham WA, server in Fremont CA:

Without autocommit:

In [51]: %timeit -n 10 cur.executemany(sql, l)
10 loops, best of 3: 8.22 s per loop


With autocommit:

In [56]: %timeit -n 10 cur.executemany(sql, l)
10 loops, best of 3: 8.38 s per loop



>
>
>
>
>
>>
>>
>>>
>>> --
>>> -- Christophe Pettus
>>>    xof@thebuild.com
>>>
>>
>>


--
Adrian Klaver
adrian.klaver@aklaver.com


psycopg by date:

Previous
From: mike bayer
Date:
Subject: Re: [psycopg] speed concerns with executemany()
Next
From: Adrian Klaver
Date:
Subject: Re: [psycopg] Solving the SQL composition problem