Ошибка: увеличение записи реестра MaxLocksPerFile через Python - PullRequest
0 голосов
/ 27 июня 2018

Я выполняю довольно завершенное обновление запроса MS Access из Python:

 qry = '''
        UPDATE H500_ODFlows INNER JOIN H500_UPDATE ON 
        (H500_ODFlows.Product = H500_UPDATE.Product) 
        AND (H500_ODFlows.Dest = H500_UPDATE.DestCode) 
        AND (H500_ODFlows.Orig = H500_UPDATE.OrigCode) 
        SET H500_ODFlows.Pieces = [H500_UPDATE].[Pieces],
        H500_ODFlows.Weight = [H500_UPDATE].[Weight], 
        H500_ODFlows.Cons = [H500_UPDATE].[Pieces], 
        H500_ODFlows.DeadWeight = [H500_UPDATE].[DeadWeight], 
        H500_ODFlows.DoNotRead = [H500_UPDATE].DoNotRead,
        H500_ODFlows.[_OrigCountryCode] = [H500_UPDATE].[_OrigCountryCode],
        H500_ODFlows.[_DestCountryCode] = [H500_UPDATE].[_DestCountryCode]
    '''

try:
    crsr.execute(lb.cleanqry(qry))
    cnxn.commit()
    print('Updating was successful.')
except Exception as err:
    print('Updating failed. See the error.' + str(err))

но получите следующую ошибку:

(файл 'HY000', '[HY000] [Microsoft] [ODBC Microsoft Access Driver] превышено количество блокировок Увеличьте запись реестра MaxLocksPerFile. (-1033) (SQLExecDirectW) ')

Я следовал инструкциям, чтобы увеличить MaxLocksPerFile, но это не помогает. Более того, запрос выполняется в MS Access вполне нормально, но не через Python. Любой совет?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Поскольку вы заметили: Запрос выполняется в MS Access вполне нормально, но не через Python. Одной из возможных причин этого является то, что хранимые запросы Access более эффективны, чем запросы уровня приложения, называемые запросами, поскольку механизм лучше сохраняет и кэширует план выполнения. На прикладном уровне (Python, VBA и т. Д.) При обработке строкового оператора SQL ядро ​​Jet / ACE не успевает спланировать наилучшее выполнение.

Поэтому рассмотрим следующее:

  1. Добавьте все необходимые индексы к JOIN переменным соответствующих таблиц.
  2. Сохраните ваш запрос UPDATE как сохраненный запрос в базе данных. Здесь процесс сохранения проверяет синтаксис, рассчитывает и оптимизирует план и кэширует статистику.
  3. Запустить сжатие и восстановление в базе данных для обновления статистики.

Затем выполните запрос в Python как сохраненный процесс с помощью команды CALL:

# SET AUTOCOMMIT PREFERENCE IN CONNECTION
cnxn = pyodbc.connect(..., autocommit=True)
...
crsr.execute("{CALL myUpdateQuery}")
0 голосов
/ 27 июня 2018

Попробуйте выполнить запрос с autocommit на . Таким образом, базе данных не нужно будет держать все эти блокировки открытыми, но можно просто зафиксировать все во время выполнения запроса.

 qry = '''
        UPDATE H500_ODFlows INNER JOIN H500_UPDATE ON 
        (H500_ODFlows.Product = H500_UPDATE.Product) 
        AND (H500_ODFlows.Dest = H500_UPDATE.DestCode) 
        AND (H500_ODFlows.Orig = H500_UPDATE.OrigCode) 
        SET H500_ODFlows.Pieces = [H500_UPDATE].[Pieces],
        H500_ODFlows.Weight = [H500_UPDATE].[Weight], 
        H500_ODFlows.Cons = [H500_UPDATE].[Pieces], 
        H500_ODFlows.DeadWeight = [H500_UPDATE].[DeadWeight], 
        H500_ODFlows.DoNotRead = [H500_UPDATE].DoNotRead,
        H500_ODFlows.[_OrigCountryCode] = [H500_UPDATE].[_OrigCountryCode],
        H500_ODFlows.[_DestCountryCode] = [H500_UPDATE].[_DestCountryCode]
    '''

try:
    cnxn.autocommit = True
    crsr.execute(lb.cleanqry(qry))
    print('Updating was successful.')
except Exception as err:
    print('Updating failed. See the error.' + str(err))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...