Написал обычный запрос
select
d.accMainnumber as dbt , d.acc_id_val as acc_id, d.acc_own_val as acc_own,cr_value, k.accmainnumber as krdt , d.client_id
into #prov
from farcarr1 inner join #account_dbt d on d.acc_own_val = cr_owner and d.acc_id_val = cr_debet
inner join #account_krd k on k.acc_own_val = cr_owner and k.acc_id_val = cr_credit
where
cr_moment >= @p_from
and cr_moment <= @p_to
С оЧень большой таблицей farcarr1 (миллионы записей) , решив значительно сократить время работы запроса за счет того что заранее отобрал данные в таблицы
#account_dbt и #account_krd , а потом выгрузить найденное в небольшую временную табличку . Соответсвующие поля в farcarr1 (cr_debet и cr_credit) - Интеджеры и имеют кластерные индексы
Проблема :
ЗАпускаю код просто в QA - Работает секунд 30, сгенерил хранимую процедуру - 15 минут. У меня на серваке 4 отдельных процессора.
Посмотрел планы выполнения :
Для QA:
Execution Tree
--------------
Table Insert(OBJECT:([#prov]), SET:([#prov].[client_id]=[d].[client_id], [#prov].[krdt]=[k].[AccMainNumber], [#prov].[cr_value]=[farcarr1].[cr_value], [#prov].[acc_own]=[d].[acc_own_val], [#prov].[acc_id]=[d].[acc_id_val], [#prov].[dbt]=[d].[AccMainNumber]))
|--Top(ROWCOUNT est 0)
|--Parallelism(Gather Streams)
|--Hash Match(Inner Join, HASH:([k].[acc_own_val], [k].[acc_id_val])=([d].[acc_own_val], [farcarr1].[cr_credit]), RESIDUAL:([d].[acc_own_val]=[k].[acc_own_val] AND [k].[acc_id_val]=[farcarr1].[cr_credit]))
|--Parallelism(Repartition Streams, PARTITION COLUMNS:([k].[acc_own_val], [k].[acc_id_val]))
| |--Table Scan(OBJECT:([tempdb].[dbo].[#account_krd________________________________________________________________________________________________________000000001912] AS [k]))
|--Parallelism(Repartition Streams, PARTITION COLUMNS:([d].[acc_own_val], [farcarr1].[cr_credit]))
|--Hash Match(Inner Join, HASH:([d].[acc_own_val], [d].[acc_id_val])=([farcarr1].[cr_owner], [farcarr1].[cr_debet]), RESIDUAL:([farcarr1].[cr_owner]=[d].[acc_own_val] AND [farcarr1].[cr_debet]=[d].[acc_id_val]))
|--Bitmap(HASH:([d].[acc_own_val], [d].[acc_id_val]), DEFINE:([Bitmap1006]))
| |--Parallelism(Repartition Streams, PARTITION COLUMNS:([d].[acc_own_val], [d].[acc_id_val]))
| |--Table Scan(OBJECT:([tempdb].[dbo].[#account_dbt________________________________________________________________________________________________________000000001912] AS [d]))
|--Parallelism(Repartition Streams, PARTITION COLUMNS:([farcarr1].[cr_owner], [farcarr1].[cr_debet]), WHERE:(PROBE([Bitmap1006])=TRUE))
|--Clustered Index Scan(OBJECT:([contour].[dbo].[farcarr1].[farcarr1_pk]), WHERE:([farcarr1].[cr_moment]>=[@p_from] AND [farcarr1].[cr_moment]<=[@p_to]))
для Хранимой процедуры:
xecution Tree
--------------
Table Insert(OBJECT:([#prov]), SET:([#prov].[client_id]=[d].[client_id], [#prov].[krdt]=[k].[AccMainNumber], [#prov].[cr_value]=[farcarr1].[cr_value], [#prov].[acc_own]=[d].[acc_own_val], [#prov].[acc_id]=[d].[acc_id_val], [#prov].[dbt]=[d].[AccMainNumber]))
|--Top(ROWCOUNT est 0)
|--Hash Match(Inner Join, HASH:([k].[acc_own_val], [k].[acc_id_val])=([d].[acc_own_val], [farcarr1].[cr_credit]), RESIDUAL:([d].[acc_own_val]=[k].[acc_own_val] AND [k].[acc_id_val]=[farcarr1].[cr_credit]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#account_krd] AS [k]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([d].[acc_id_val], [d].[acc_own_val]) WITH PREFETCH)
|--Table Scan(OBJECT:([tempdb].[dbo].[#account_dbt] AS [d]))
|--Clustered Index Seek(OBJECT:([contour].[dbo].[farcarr1].[farcarr1_pk]), SEEK:([farcarr1].[cr_owner]=[d].[acc_own_val] AND ([farcarr1].[cr_moment], [farcarr1].[cr_debet]) >= ([@p_from], [d].[acc_id_val]) AND ([farcarr1].[cr_moment], [farcarr1].[cr_debet]) <= ([@p_to], [d].[acc_id_val])), WHERE:([farcarr1].[cr_debet]=[d].[acc_id_val]) ORDERED FORWARD)
Прошу подсказать , на что обратить внимание. Как заставить оптимизатор работать одинаково .