оптимизировать код pymssql - PullRequest
0 голосов
/ 27 апреля 2010

Я вставляю записи на сервер sql из python, используя pymssql. Для выполнения запроса базе данных требуется 2 миллисекунды, но при этом она вставляет 6 строк в секунду. Единственная проблема на стороне кода. как оптимизировать следующий код или какой самый быстрый способ вставить записи.

def save(self):
    conn = pymssql.connect(host=dbHost, user=dbUser, 
                           password=dbPassword, database=dbName, as_dict=True)
    cur = conn.cursor()

    self.pageURL = self.pageURL.replace("'","''")

    query = "my query is there"               
    cur.execute(query)

    conn.commit() 
    conn.close()

Ответы [ 2 ]

4 голосов
/ 27 апреля 2010

Похоже, вы создаете новое соединение для каждой вставки. Вероятно, это основная причина замедления: создание новых соединений обычно происходит довольно медленно. Создайте соединение вне метода, и вы увидите значительное улучшение. Вы также можете создать курсор вне функции и повторно использовать его, что будет еще одним ускорением.

В зависимости от вашей ситуации вы также можете использовать одну и ту же транзакцию для более чем одной вставки. Это немного меняет поведение - так как транзакция должна быть атомарной и либо полностью успешной, либо полностью неудачной - но фиксация транзакции обычно медленная операция, потому что она должна быть уверенной, что вся операция прошла успешно.

3 голосов
/ 27 апреля 2010

В дополнение к великому совету Томаса,
Я бы посоветовал вам взглянуть на executemany()*, например, :

cur.executemany("INSERT INTO persons VALUES(%d, %s)", 
    [ (1, 'John Doe'), (2, 'Jane Doe') ])

... где второй аргумент executemany() должен быть последовательностью строк для вставки.

Это поднимает еще одну мысль:
Возможно, вы захотите отправить запрос и параметры запроса в виде отдельных аргументов либо execute(), либо executemany(). Это позволит модулю PyMSSQL решать любые проблемы с цитированием.

*executemany(), как описано в Python DB-API :

.executemany(operation,seq_of_parameters)
Подготовьте операцию базы данных (запрос или команда), а затем выполнить его против все последовательности параметров или сопоставления найдено в последовательности seq_of_parameters.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...