Настройка производительности на PATINDEX с JOIN - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть таблица с именем tbl_WHO с 90 миллионами записей и временная таблица #EDU с 5 записями.

Я хочу выполнить сопоставление с шаблоном в поле имени между двумя таблицами (tbl_WHO и#EDU).

Запрос : следующий запрос занял 00: 02: 13 время выполнения .

SELECT  Tbl.PName,Tbl.PStatus     
FROM tbl_WHO Tbl 
INNER JOIN #EDU Tmp 
ON 
(
    (ISNULL(PATINDEX(Tbl.PName,Tmp.FirstName),'0')) > 0 
)    

Иногда приходитсявыполнять сопоставление с образцом для нескольких столбцов, например:

SELECT  Tbl.PName,Tbl.PStatus     
FROM tbl_WHO Tbl 
INNER JOIN #EDU Tmp 
ON 
(
    (ISNULL(PATINDEX(Tbl.PName,Tmp.FirstName),'0')) > 0 AND
    (ISNULL(PATINDEX('%'+Tbl.PAddress+'%',Tmp.Addres),'0')) > 0 OR
    (ISNULL(PATINDEX('%'+Tbl.PZipCode,Tmp.ZCode),'0')) > 0  
)    

Примечание : в столбцах создано INDEX, что соответствует условию.

Есть ли другой способ настроить производительность запроса?

1 Ответ

0 голосов
/ 17 декабря 2018

Поиск, начинающийся с %, не является sargable , поэтому даже имея индекс по данному столбцу, вы не сможете использовать его эффективно.

Вы уверены, что вам нужно искать с PATINDEX каждый раз?Таблица с 90 миллионами записей невелика, но с большим количеством столбцов и неправильным применением нормализации может наверняка снизить производительность.

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

Например, zipcode можно переместить в отдельную таблицу, и вместо этого, используя строку zipcode, можно объединить целое числоколонка.Попробуй нормализовать адрес дальше - есть ли у тебя город, улица или квартал, улица или номер блока?Имена - если вам нужно искать по имени, фамилии просто разделяют имена на отдельные столбцы.

Для строковых значений данные могут быть обработаны - удалите пустые строки в начале и в конце (trim)например.И имея такие данные, мы можем создавать хэш-индексы и получать чрезвычайно быстрый равный поиск.

Я хочу сказать, что если вы нормализуете свои данные и добавите некоторые правила (на уровне базы данных и приложения), чтобы обеспечить вводданные верны, у вас будет очень хорошая производительность.И это долгий путь, но вы собираетесь это сделать - это легче сделать сейчас, чем позже (вы опоздали и сейчас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...