Эй, у меня есть следующие таблицы и SQL:
T1: ID, col2, col3 - PK (ID) - 23 миллиона строк
T2: ID, col2, col3 - PK (ID) - 23 миллиона строк
T3: ID, имя, значение - PK (ID, имя) -66 миллионов строк
1) Приведенный ниже sql очень быстро возвращает набор результатов из 10 000 строк, без проблем.
select top 10000 T1.col2, T2.col2, T3.name, T4.value
from T1, T2, T3
where T1.ID = T2.ID and T1.ID *= T3.ID and T3.name in ('ABC','XYZ')
and T2.col1 = 'SOMEVALUE'
2) Ниже sql взял навсегда.
select top 10000 T1.col2, T2.col2,
ABC = min(case when T3.name='ABC ' then T3.value end)
XYZ = min(case when T3.name='XYZ ' then T3.value end)
from T1, T2, T3
where T1.ID = T2.ID and T1.ID *= T3.ID and T3.name in ('ABC','XYZ')
and T2.col1 = 'SOMEVALUE'
group by T1.col2, T2.col2,
Единственное различие в showplan между этими двумя запросами - ниже для запроса 2). Я не понимаю это на 100%, выбирает ли он ВЕСЬ набор результатов БЕЗ 10000 во временную таблицу, а затем создает группу на нем? поэтому медленно?
STEP 1
The type of query is SELECT (into Worktable1).
GROUP BY
Evaluate Grouped MINIMUM AGGREGATE.
FROM TABLE ...etc..
TO TABLE
Worktable1.
STEP 2
The type of query is SELECT.
FROM TABLE
Worktable1.
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.
Мой вопрос
1) Почему запрос 2) такой медленный
2) Как исправить, сохранив логику запроса такой же, и желательно ограничить ее только одним выбором SQL, как и раньше.
спасибо