Отображение IP-адреса в города быстро

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

Я могу написать запрос, который преобразует IP-адрес в IP-адрес с добавлением 0, а затем объединяет мою таблицу сопоставления.

Но с точки зрения производительности я не могу заставить что-либо работать. Таблица событий содержит более 40 миллионов строк, поэтому попытка объединения на основе манипуляций с полем занимает 30 минут, прежде чем я отключаю. Я попытался сопоставить таблицу сопоставления (IP с 0-дополненным IP), но это не улучшило ситуацию. Даже создание сокращенной таблицы уникальных IP-адресов с городом занимает вечно.

Есть ли подход или стратегия, которую я должен использовать здесь, чтобы попытаться объединить эти наборы данных более эффективно?

1 ответ

Вам не нужно делать это на ходу каждый раз. Хороший подход заключается в материализации. Тем более что ваши данные, скорее всего, неизменны (IP не изменяется после записи для любых данных в строке), у вас есть больше возможностей. Они могут быть:

  1. запускайте скрипт каждую ночь, чтобы перезапустить все соединение
  2. Выполнить добавочное добавление, поэтому к каждой новой порции данных добавляется объединение для каждой новой порции данных, поступающей в исходную таблицу.

Если вы можете позволить себе хранить еще одну копию таблицы размером более 40 млн., Вы можете просто сохранить результат в виде новой таблицы, в которой есть все столбцы из исходной таблицы плюс округ (и, возможно, 0-дополненный IP-адрес), если нет, вы можете сохранить таблицу с некоторым идентификатором из исходная таблица плюс результаты объединения, что обеспечивает более быстрое соединение, чем исходный запрос. Или, может быть, если исходная таблица является результатом какого-то процесса ETL/ELT, который может быть просто еще одним шагом.

Другие вопросы по тегам