Имя: Пароль:
IT
Админ
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) уникальный некластерный индекс