|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
Есть необходимость найти в таблице пары строк, у которых есть совпадения по значениям полей. Первый вариант поиска - CROSS JOIN и условия отбора в Where, второй - INNER JOIN и аналогичный отсев во From. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
функция meta.hashname чистит строку от служебных символов - скобок, точек, запятых и прочего мусора... В обоих случаях - и для CROSS JOIN, и для INNER JOIN получаю практически одинаковый план выполнения (см. рисунок) и один в один время выполнения - полторы минуты для таблицы в 373 строки. Индекс - только Primary Key на поле ID. Как можно ускорить процесс? P.S. 2008 R2 (SP1) - 10.50.2811.0 (X64) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 16:28 |
|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
DaniilSeryiфункция meta.hashname чистит строку от служебных символов - скобок, точек, запятых и прочего мусора... Покажите исходный код этой функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 16:58 |
|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
DaniilSeryiИндекс - только Primary Key на поле ID. Как можно ускорить процесс? можно хранить данные, которые должна возвращать функция meta.hashname а в плане что-то вашего PK не видно ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 16:59 |
|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
Shakillа в плане что-то вашего PK не видно Очевидно, это PK по некластерному индексу. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 17:14 |
|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
Сделал совершенно по-другому - через Group by итогов Union ALL кучи запросов с раскиданными по этим запросам условиям OR. То есть FROM A.ID <>B.ID and одно из OR-условий в каждом запросе. В итоге получилось меньше секунды вместо полутора минут. Теперь на будущее только индексы создать осталось, как я понимаю, а то везде Table Scan, да Table Scan. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 17:17 |
|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
Гость333Shakillа в плане что-то вашего PK не видно Очевидно, это PK по некластерному индексу. нечасто приходится видеть таблицу с единственным индексом - некластерным pk ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 17:20 |
|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
Собственно, в том и оставшийся вопрос, какие индексы по каким полям добавить? Идея создать мегаиндекс по всем полям, участвовавшим в отборе, кроме ID, мне сразу не понравилась. Теперь, когда для каждого запроса есть вменяемое число полей, по которым производится отбор, и при этом для каждого запроса в списке полей фигурирует поле ID, какие индексы делать? P.S. Уточнил структуру таблицы - ID - не является индексом, только Identity. P.P.S. вопрос Primary Key - будет следующим. Сейчас он составной из двух полей, и да, некластерный. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 18:47 |
|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
DaniilSeryiСобственно, в том и оставшийся вопрос, какие индексы по каким полям добавить?А какой запрос оптимизируем? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2013, 19:33 |
|
Повышение производительности запроса
|
|||
---|---|---|---|
#18+
постройте хешфункцию по всем вашим полям сравнения материализуйте результат проиндексируйте, включая ИД в индекс запрос будет теперь по равенству хешей и неравенству ИД, а "попавшее" уже дополнительно точно сравнить по значениям полей ибо коллизии хеша никто не отменял будет быстро ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 11:14 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1706101]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
14ms |
get first new msg: |
9ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 410ms |
0 / 0 |