|
Left join тормозит на одном поле tsql | ☑ | ||
---|---|---|---|---|
0
sda553
06.09.12
✎
16:21
|
Соединяю две таблицы left join ом.
В обоих одинаковые поля одинаковых типов. По всем полям что в on создан примари индекс в обеих таблицах. Одно из соединяемых полей типа varchar(12) безбожно тормозит. Убираешь его, join отрабатывает за долю секунды,добавлешь его в on тормозит на 3 минуты. Уже голову сломал, где можно посмотреть причину тормоза? |
|||
1
ДенисЧ
06.09.12
✎
16:27
|
в план запроса уже смотрел?
|
|||
2
МихаилМ
06.09.12
✎
16:30
|
(0)
нет понятия "примари индекс". что такое "Соединяю две таблицы left join ом" ? какой collation у полей varchar(12) ? |
|||
3
МихаилМ
06.09.12
✎
16:31
|
+ (2)
какой collation у tempDB |
|||
4
sda553
06.09.12
✎
16:39
|
(1) В плане написано что во втором случае 90% времени занимает clustered index seek.
Действительно я не заметил что по этому полю есть кластерны индекс? И что теперь? Убирать этот индекс чтобы ускорить запрос? Обычно наоборот делают |
|||
5
sda553
06.09.12
✎
17:05
|
select count(*)
from buf_table b left join cur_table c on (c.id = b.id) and (c.period = b.period) and (c.dim=b.dim) в обеих таблицах по id кластерный индекс. по (id,period,dim) уникальный некластерный индекс Запрос выполняется три минуты План выполнения этого запроса select 0% <- Compute scalar 0% <- Stream Agregate 0% <=nested loops (inner join) 4%<- Clustered Index scan(таблица b) 7% <-Clustered Index seek(таб c) 90% ВТорой запрос выполняется за долю сек select count(*) from buf_table b left join cur_table c on (c.id = 'MyId') and (c.period = b.period) and (c.dim=b.dim) План выполнения этого запроса select 0% <- Compute scalar 0% <- Stream Agregate 0% <=nested loops (inner join) 0% <- Clustered Index seek (таблица c)50% <-Index seek (таблица b) 50% |
|||
6
ДенисЧ
06.09.12
✎
17:12
|
перестроить индексы пробовал?
|
|||
7
sda553
06.09.12
✎
17:15
|
(6) да
|
|||
8
Fragster
гуру
06.09.12
✎
17:17
|
есть мнение, что записей в запросе "2" раз в 100500 меньше, чем в "1". ну и почему-то в запросе "1" используется индекс не по тому полю. попробуй статистику обновить
|
|||
9
Serginio1
06.09.12
✎
17:28
|
Интересно как оптимизатор не выкинул это соединение так как результат должен быть одинаковым и без левого соединения
|
|||
10
МихаилМ
06.09.12
✎
17:34
|
COUNT со звездочкой включает и NULL
|
|||
11
acsent
06.09.12
✎
17:37
|
(9) не факт, а вдруг в b дубли
|
|||
12
sda553
06.09.12
✎
17:44
|
Вообщем шаманя и колдуя, помогло удаление уникального индекса (id,period,dim) у таблицы b
|
|||
13
acsent
06.09.12
✎
17:45
|
может проще было хинт использовать?
|
|||
14
sda553
06.09.12
✎
17:46
|
(12) А не... ни фига не помогло
|
|||
15
acsent
06.09.12
✎
17:48
|
у тебя по кластерному ищен а должен по другому
|
|||
16
sda553
06.09.12
✎
17:55
|
(15) Я уже понял, но как мне машине то это объяснить. Перестановка таблиц местами, так же ничего не дает
|
|||
17
Axel2009
06.09.12
✎
17:58
|
select count(*)
from buf_table b left hash join cur_table c on (c.id = b.id) and (c.period = b.period) and (c.dim=b.dim) select count(*) from buf_table b left merge join cur_table c on (c.id = b.id) and (c.period = b.period) and (c.dim=b.dim) select count(*) from buf_table b left nested loops join cur_table c on (c.id = b.id) and (c.period = b.period) and (c.dim=b.dim) |
|||
18
Axel2009
06.09.12
✎
17:59
|
забацай полный текст плана запроса, он тебе выдаст циклы, в котором у тебя 90% времени съедается
|
|||
19
Axel2009
06.09.12
✎
18:00
|
либо
select count(*) from buf_table b left join cur_table c (with index(ix_blablabla)) on (c.id = b.id) and (c.period = b.period) and (c.dim=b.dim) |
|||
20
Axel2009
06.09.12
✎
18:01
|
а вообще если b.id повторяются, то смысла в кластерном индексе нет вообще никакого. потому как уникальность сервак добиваем своими силами
|
|||
21
Axel2009
06.09.12
✎
18:06
|
select count(*)
from buf_table b (with index(ix_blablabla)) left join cur_table c on (c.id = b.id) and (c.period = b.period) and (c.dim=b.dim) индекс на другой таблице =) |
|||
22
Serginio1
06.09.12
✎
18:56
|
(11) Ну вроде как уникальный индекс в 0
в обеих таблицах по id кластерный индекс. по (id,period,dim) уникальный некластерный индекс |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |