powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Баг оптимизатора?
7 сообщений из 7, страница 1 из 1
Баг оптимизатора?
    #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
Баг оптимизатора?
    #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
Баг оптимизатора?
    #39737230
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем нефильтрованный индекс оптимизатор берет, но все ровно выдает такое ожидание по кол-ву строк.
...
Рейтинг: 0 / 0
Баг оптимизатора?
    #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
Баг оптимизатора?
    #39737602
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

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

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

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

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

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


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