Postgresql: более эффективный способ объединения таблиц на основе нескольких полей адреса - PullRequest
0 голосов
/ 03 марта 2020

У меня есть таблица, в которой перечислены два подключенных значения, ID и TaxNumber (TIN), которые выглядят примерно так:

IDTINMap

     ID    |     TIN
-------------------------
1234567890 |   654321
-------------------------
3456321467 |   986321
-------------------------
8764932312 |   245234

Идентификатор может отображаться на несколько TIN и TIN может отображаться на несколько идентификаторов, но существует ограничение на уникальность таблицы для идентификатора, пары TIN.

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

Я пытаюсь создать расширенный идентификатор - Карта ИНН. В настоящее время я делаю это, сначала соединяя таблицу IDTINMap с IDListing в поле ID, что дает нечто похожее на CTE, который я сейчас назову Step1:

     ID    |     TIN     |    Name    |    Address    |     City     |    State    |    Zip
------------------------------------------------------------------------------------------------
1234567890 |   654321    | John Doe   | 123 Easy St   | Seattle      |     WA      |   65432
------------------------------------------------------------------------------------------------
3456321467 |   986321    | Tyler Toe  | 874 W 84th Ave| New York     |     NY      |   48392
------------------------------------------------------------------------------------------------
8764932312 |   245234    | Jane Poe   | 984 Oak Street|San Francisco |     CA      |   12345

Затем я снова через go и присоединяюсь к таблице IDListing, присоединяясь к Step1 по адресу, городу, штату, почтовому индексу и имени, которые все равны. Я знаю, что мог бы сделать что-то более сложное, например нечеткое сопоставление, но сейчас мы просто смотрим на точные совпадения. В соединении я сохраняю идентификатор на шаге 1 как «ReferenceID», сохраняю TIN, а затем получаю другой столбец со всеми соответствующими идентификаторами. Я не храню информацию об адресе / городе / штате / почтовом индексе, только три цифры.

Тогда я могу go вернуться и вставить все отдельные пары в финальный стол.

Я пробовал это с помощью запроса, и он работает и дает мне желаемый результат. Однако запрос медленнее, чем хотелось бы. Я привык соединять строки, которые я проиндексировал (например, ID или TIN), но это медленно для всех полей адреса. Есть ли хороший способ улучшить это? Присоединение к каждому полю индивидуально быстрее, чем присоединение к CONCAT () всех полей (это я пробовал). Мне просто интересно, есть ли другой способ, которым я могу оптимизировать это.

1 Ответ

0 голосов
/ 03 марта 2020

Сделать окончательный результат материализованным представлением . Refre sh это когда вам нужно обновить данные (каждую ночь? Каждые три часа?). Затем используйте этот вид для ваших обычных операций.

...