#python #oracle #python-2.7 #cx-oracle
#python #Oracle #python-2.7 #cx-oracle
Вопрос:
Моя цель — сравнить несколько таблиц в нескольких базах данных с одной таблицей в другой базе данных (назовем ее базовой таблицей).
Каждая таблица имеет идентификатор и версию. Я хочу проверить, все ли записи базовой таблицы обновлены и синхронизированы во всех других таблицах (просто проверив, присутствуют ли ID и VERSION в других таблицах, игнорируя другие столбцы). Я хочу сравнить их как можно более эффективно (не запрашивая все данные и не храня их в памяти), потому что существует более 150 тыс. записей данных.
Это должно произойти в scipt python, и я использую cx_Oracle.
Моя первая попытка состояла в том, чтобы запросить идентификатор и версии из базовой таблицы, используя курсор, извлекающий одну строку за другой. но тогда мне пришлось бы создать более 150 тысяч выборок в других таблицах, которые были бы неполноценными. Кто-нибудь знает, как эффективно сравнивать их?
Код выглядит следующим образом:
schemas = ["x","y","z"]
baseConn = cx_Oracle.connect(CONN TO DATABASE1)
baseCursor = conn.cursor()
baseCursor.execute("SELECT ID, Version FROM XXX")
res = cursor.fetchall()[0][0]
icc_count = int(res)
for schema in schemas:
conn = cx_Oracle.connect(CONN TO DATABASE2)
cursor = conn.cursor()
cursor.execute("SELECT ID, VERSION FROM " schema)
# compare data of baseCursor and cursor here...
cursor.close()
conn.close()
baseCursor.close()
baseConn.close()
Комментарии:
1. Можете ли вы использовать ссылки на БД, чтобы данные не приходилось передавать в Python больше, чем необходимо? Можно ли каким-либо образом вычислить и сравнить хэш значений данных? Не забудьте настроить
arraysize
, см. cx-oracle.readthedocs.io/en/latest/user_guide/tuning.html2. Нет, ссылки на БД не должны использоваться. Спасибо 🙂
Ответ №1:
Вы можете запросить идентификатор / версию из своих таблиц и сохранить их в словаре, затем выполнить итерацию по другой таблице и посмотреть, присутствует ли идентификатор / версия из этой таблицы в первой. Да, для этого потребуется 150 тысяч записей в вашем словаре. Если это неприемлемо или если число будет иметь тенденцию к дальнейшему росту с течением времени, рассмотрите какой-либо способ группировки идентификатора / версии в пакеты. Если идентификатор представляет собой простую последовательность, начинающуюся с 1, вы можете затем выполнять запросы, которые извлекают первые 10 тыс. идентификаторов, следующие 10 тыс. идентификаторов и так далее.
Комментарии:
1. Как бы вы нашли идентификаторы и версии, которые есть в вашем словаре, а не в одной из других таблиц? Ваша проверка будет проверять только полноту словаря, но я скорее хочу проверить полноту других таблиц, не сохраняя их все в словарях
2. Я предположил, что вы просто сравниваете каждого из детей с мастером. Если вам нужно выполнить многоходовое сравнение, то у вас должны быть все ключи в памяти. В этом случае имеет смысл разделить ключи на группы, чтобы ограничить использование памяти.