2010-04-27 4 views
0

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

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() 

ответ

4

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

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

+0

@Thomas Спасибо, что работает. Я уже пробовал внешний метод подключения, но скорость все еще была низкой. если для свойства autocommit установлено значение True, то скорость будет улучшена. – developer

2

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

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.

+0

спасибо за подсказку – developer

 Смежные вопросы

  • Нет связанных вопросов^_^