powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Повышение производительности запроса
9 сообщений из 9, страница 1 из 1
Повышение производительности запроса
    #38333118
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть необходимость найти в таблице пары строк, у которых есть совпадения по значениям полей.
Первый вариант поиска - CROSS JOIN и условия отбора в Where, второй - INNER JOIN и аналогичный отсев во From.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 Select A.ID, B.ID
From Table1 as A 
INNER JOIN
Table1 as B 
on  A.[ID]<>B.ID and
      (
A.[Number]=B.[Number] 
  or (A.[Date]=B.[Date] and A.[Authority] =B.[Authority])
  or (A.[TaxID]=B.[TaxID] and A.[DateProcurementID] =B.[DateProcurementID])
  or (A.Country=B.Country and A.[City] =B.[City] and A.[Street] =B.[Street])
  or (meta.hashname(a.[BorrowerName])=meta.hashname(B.[BorrowerName]))
  or (meta.hashname(a.[BorrowerNmeEnglish])=meta.hashname(B.[BorrowerNameEnglish]))
)



функция meta.hashname чистит строку от служебных символов - скобок, точек, запятых и прочего мусора...

В обоих случаях - и для CROSS JOIN, и для INNER JOIN получаю практически одинаковый план выполнения (см. рисунок) и один в один время выполнения - полторы минуты для таблицы в 373 строки.
Индекс - только Primary Key на поле ID.
Как можно ускорить процесс?

P.S. 2008 R2 (SP1) - 10.50.2811.0 (X64)
...
Рейтинг: 0 / 0
Повышение производительности запроса
    #38333175
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiфункция meta.hashname чистит строку от служебных символов - скобок, точек, запятых и прочего мусора...
Покажите исходный код этой функции.
...
Рейтинг: 0 / 0
Повышение производительности запроса
    #38333178
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiИндекс - только Primary Key на поле ID.
Как можно ускорить процесс?

можно хранить данные, которые должна возвращать функция meta.hashname
а в плане что-то вашего PK не видно
...
Рейтинг: 0 / 0
Повышение производительности запроса
    #38333208
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillа в плане что-то вашего PK не видно
Очевидно, это PK по некластерному индексу.
...
Рейтинг: 0 / 0
Повышение производительности запроса
    #38333217
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал совершенно по-другому - через Group by итогов Union ALL кучи запросов с раскиданными по этим запросам условиям OR. То есть FROM A.ID <>B.ID and одно из OR-условий в каждом запросе.
В итоге получилось меньше секунды вместо полутора минут.
Теперь на будущее только индексы создать осталось, как я понимаю, а то везде Table Scan, да Table Scan.
...
Рейтинг: 0 / 0
Повышение производительности запроса
    #38333226
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333Shakillа в плане что-то вашего PK не видно
Очевидно, это PK по некластерному индексу.
нечасто приходится видеть таблицу с единственным индексом - некластерным pk
...
Рейтинг: 0 / 0
Повышение производительности запроса
    #38333349
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, в том и оставшийся вопрос, какие индексы по каким полям добавить?
Идея создать мегаиндекс по всем полям, участвовавшим в отборе, кроме ID, мне сразу не понравилась.
Теперь, когда для каждого запроса есть вменяемое число полей, по которым производится отбор, и при этом для каждого запроса в списке полей фигурирует поле ID, какие индексы делать?

P.S. Уточнил структуру таблицы - ID - не является индексом, только Identity.
P.P.S. вопрос Primary Key - будет следующим. Сейчас он составной из двух полей, и да, некластерный.
...
Рейтинг: 0 / 0
Повышение производительности запроса
    #38334694
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiСобственно, в том и оставшийся вопрос, какие индексы по каким полям добавить?А какой запрос оптимизируем?
...
Рейтинг: 0 / 0
Повышение производительности запроса
    #38335223
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
постройте хешфункцию по всем вашим полям сравнения
материализуйте результат
проиндексируйте, включая ИД в индекс
запрос будет теперь по равенству хешей и неравенству ИД, а "попавшее" уже дополнительно точно сравнить по значениям полей ибо коллизии хеша никто не отменял
будет быстро
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Повышение производительности запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]