Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Баг оптимизатора? / 7 сообщений из 7, страница 1 из 1
22.11.2018, 23:28
    #39737227
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Баг оптимизатора?
Всем привет! В общем такая вещь, делаю Merge таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
MERGE [DWH].[dbo].[FactContactLog] as t
USING
(
SELECT cs.[Country]
      ,cs.[ContactLogID]
      ,cs.[PromiseID]
      ,cs.[NumberContract]
	  ,fa.ContractID
	  ,cs.[DebtID]
      ,cs.[PhoneIDContact]
	  ,dcr.ContactResultKey
	  ,st.staffkey
	  ,case when fp.PhonesAttributeKey is null then (select PhonesAttributeKey from [DWH].[dbo].[DimPhonesAttribute] where [ActualFlag] = 0 and [ContactType] = 'NA' and [Relation] = 'NA' and Source = 'Contact') else fp.PhonesAttributeKey end as PhonesAttributeKey
	  ,fa.ApplicationAttributeKey
	  ,fa.ApplicationKey
	  ,fa.BorrowerKey
	  ,fa.GeographyKey
      ,cs.[Description]
      ,cs.[ContactDate]
      ,cs.[CreatePromiseDate]
      ,cs.[PromiseDate]
      ,cs.[PromiseSum]	 
  FROM [Staging].[dbo].[ContactLog_Stage] as cs
  left join [DWH].[dbo].[DimContactResult] as dcr
  on cs.result = dcr.Code
  left join [DWH].[dbo].[DimStaff] as st
  on cs.userid = st.staffidcontact 
  left join [DWH].[dbo].[FactContract] as fa
  on cs.NumberContract = fa.NumberContract and cs.Country = fa.Country
  left join [DWH].[dbo].FactPhones as fp 
  on cs.PhoneIDContact = fp.PhoneIDContact 
  ) as s
  on t.ContactLogID = s.ContactLogID
  when not matched by target then insert 
  ([Country],[ContactLogID],[PromiseID],[NumberContract],[ContractID],[DebtID],[ContactPhoneID],[StaffKey],[ContactResultKey],[PhonesAttributeKey],[ApplicationKey],[ApplicationAttributeKey],[BorrowerKey]
      ,[GeographyKey],[ContactDate],[CreatePromiseDate],[PromiseDate],[Description],[PromiseSum])
values
(s.[Country],s.[ContactLogID],s.[PromiseID],s.[NumberContract],s.[ContractID],s.[DebtID],s.[PhoneIDContact],s.[StaffKey],s.[ContactResultKey],s.[PhonesAttributeKey],s.[ApplicationKey],s.[ApplicationAttributeKey],s.[BorrowerKey]
      ,s.[GeographyKey],s.[ContactDate],s.[CreatePromiseDate],s.[PromiseDate],s.[Description],s.[PromiseSum]);


То что апдейтиь факты зло я знаю, в данном случае так надо.
Так вот, оптимизатор высирает такой план.
В Stage 21 млн строк, все норм, когда он доходит до join с FactPhones на выходе с HashJoin он выдает просто безумную цифру, причем он сканит PK, хотя у меня есть уникальный фильтрованный индекс по PhoneIDContact с включенным PhonesAttributeKey, если же задать использовать этот индекс через хинт то вываливается
Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.
Прикол в том что из-за этого запроса tempdb растет с 20 до 100 гигов и останвливается (у меня ограничение но месту).
Вопрос почему tempdb растет и почему он игнорит покрывающий индекс?
...
Рейтинг: 0 / 0
22.11.2018, 23:34
    #39737229
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Баг оптимизатора?
Забыл
Microsoft SQL Server 2017 (RTM-CU5) (KB4092643) - 14.0.3023.8 (X64) Mar 2 2018 18:24:44 Copyright (C) 2017 Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)
...
Рейтинг: 0 / 0
22.11.2018, 23:39
    #39737230
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Баг оптимизатора?
Причем нефильтрованный индекс оптимизатор берет, но все ровно выдает такое ожидание по кол-ву строк.
...
Рейтинг: 0 / 0
23.11.2018, 08:22
    #39737293
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Баг оптимизатора?
Стисняюсь спросить: занафига тут merge?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 
select * into #FactContactLog
     from [ваш монстрик] as s
     where not exists( select * from [DWH].[dbo].[FactContactLog] as t where  t.ContactLogID = s.ContactLogID ); 
-- если будет медленно - вставляем только основную таблицу, остальное добиваем апдэйтом.
 
  alter table #FactContactLog add primary key(ContactLogID);


  merge [DWH].[dbo].[FactContactLog] as t using #FactContactLog as s
  ...



"хотя у меня есть уникальный фильтрованный индекс по PhoneIDContact с включенным PhonesAttributeKey"

Код: sql
1.
left join ( select {воспроизведите тут ТОЧНЫЙ перечень полей фильтрованного индекса} from [DWH].[dbo].FactPhones where {воспроизведите тут ТОЧНОЕ условие фильтрации индекса} ) as fp
...
Рейтинг: 0 / 0
23.11.2018, 16:32
    #39737602
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Баг оптимизатора?
aleks222,

Т.к. дальше есть кусок на update, я его просто не вставил, поэтому и merge.

Почему индекс не использовал нашел, ошибки в источнике, строки которых там не должно было быть, отсюда на выходе и такое кол-во строк.
...
Рейтинг: 0 / 0
23.11.2018, 16:34
    #39737604
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Баг оптимизатора?
aleks222,

И Merge отрабатывает быстро, в день пару тысяч строк приходит, новых единицы, 90% надо апдейт делать, на нужных полях есть индексы, занимает пару секунд.
...
Рейтинг: 0 / 0
23.11.2018, 16:34
    #39737605
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Баг оптимизатора?
aleksrovaleks222,

И Merge отрабатывает быстро, в день пару тысяч строк приходит, новых единицы, 90% надо апдейт делать, на нужных полях есть индексы, занимает пару секунд.

В таргете 40 млн.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Баг оптимизатора? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]