私は以下を使用していますが、これまで見てきた限り、パフォーマンスに影響はありません。
import psycopg2
import psycopg2.extras
local_conn_string = """
    host='localhost'
    port='5432'
    dbname='backupdata'
    user='postgres'
    password='123'"""
local_conn = psycopg2.connect(local_conn_string)
local_cursor = local_conn.cursor(
    'cursor_unique_name',
     cursor_factory=psycopg2.extras.DictCursor)
実行時をテストするために、コードで次の出力を作成しました(そして、多くの行を解析しています。30.000.000以上)。
Parsed 2600000 rows in 00:25:21
Parsed 2700000 rows in 00:26:19
Parsed 2800000 rows in 00:27:16
Parsed 2900000 rows in 00:28:15
Parsed 3000000 rows in 00:29:13
Parsed 3100000 rows in 00:30:11
私は何も「コピー」しないことに言及しなければなりません。しかし、私は行をリモートのPostGreSQLからローカルのPostGreSQLに移動しています。その過程で、30.000.000 +は通常のクエリでは処理するには少なすぎるため、データのインデックスを作成するためにさらにいくつかのテーブルを作成します。
注意:時間は上向きにカウントされており、クエリごとではありません。
それは私のcursor創造の仕方に関係していると思います。
編集1:
私はクエリを実行するために以下を使用しています:
local_cursor.execute("""SELECT * FROM data;""")
row_count = 0
for row in local_cursor:
    if(row_count % 100000 == 0 and row_count != 0):
        print("Parsed %s rows in %s" % (row_count,
                                        my_timer.get_time_hhmmss()
                                        ))
    parse_row(row)
    row_count += 1
print("Finished running script!")
print("Parsed %s rows" % row_count)
これmy_timerは私が作成したタイマークラスであり、parse_row(row)関数はデータをフォーマットし、ローカルDBに転送し、データがローカルDBに移動されたことが確認されると、最終的にリモートDBから削除します。
EDIT2:
約4.000.000のクエリを解析した後でも、DB内の100.000行ごとに解析するのに約1分かかります。
Parsed 3800000 rows in 00:36:56
Parsed 3900000 rows in 00:37:54
Parsed 4000000 rows in 00:38:52
Parsed 4100000 rows in 00:39:50