Выполнение SSIS приводит к увеличению базы данных TempDB

#sql #sql-server #visual-studio #ssis

#sql #sql-сервер #visual-studio #ssis

Вопрос:

У меня есть пакет, который содержит цикл Foreach, и внутри него у меня есть выполнение Task runner, которое выполняет запрос без Order by или индексирует код, который я ввел внутри:

   declare @Sdate int 
set @Sdate=?
declare @Edate int 
set @Edate=?

---------------ActiveShowingType-------
update att.FactWorkPeriod
set ActiveShowingType=0 
update w 
set w.ActiveShowingType=case when w.ShowingTypeId=c.ShowingTypeID then 1
else 0 end
from att.FactWorkPeriod w 
inner join att.DimCode c on w.CodeId=c.[CodeId]
where w.DateSK between @Sdate and @Edate
 ----------------------  HasContract-------------------
  declare @YearStart char(4)=(select min (YearIR) from att.FactWorkPeriod w 
 inner join gnr.DimDate d on w.DateSK=d.DateSK)
 update w1 
set w1.HasContract =case when t.PersonSK is not null then 1 else 0 end 
from att.FactWorkPeriod w1
inner join (
select distinct
(select max(datesk) from gnr.dimdate dd where dd.yearmonthIR=d.YearMonthIR)as dateSK,
p.PersonSK
from gnr.DimDate d 
left join  att.DimPerson p on d.FullDateIR between p.EmployDate and p.ExitDate
 where  YearIR between @YearStart and (select YearIR from gnr.DimDate where IsToday=1)  and d.LastDayOfMonth=1
 )t on t.dateSK=w1.DateSK and t.PersonSK=w1.PersonSK
 where w1.DateSK between @Sdate and @Edate
 --------------------ContractTypeId------------------
 if (case when (select Count(isnull(GroupId ,0)) from kasrawarehouse.att.DimGroup)<1 then 0 else 1 end= 1 )
 begin 
 update w2
 set w2.ContractTypeId=t.ContractTypeId
  from att.FactWorkPeriod w2
 inner join ( select w3.DateSK , w3.PersonSK , case when gp.groupid is not null then 0
else 1 end as ContractTypeId from att.FactWorkPeriod w3
 inner join att.DimPerson p on w3.PersonSK=p.PersonSK
inner join gnr.DimDate d on d.DateSK=w3.DateSK
left join KasraForWarehouseConvert.gnr.GroupPerson gp 
 ON d.FullDateIR BETWEEN gp.SDate COLLATE Arabic_CI_AS AND gp.EDate COLLATE Arabic_CI_AS
 and gp.PersonelID=p.PersonBK
 and gp.GroupID in (select distinct GroupId from [Att].[DimGroup])--='15027' 
where d.LastDayOfMonth=1  )t on t.DateSK=w2.DateSK and t.PersonSK=w2.PersonSK
 where w2.DateSK between @Sdate and @Edate
 end 
  ---------------  به روز رسانی واحد سازمانی که از بین رفته ------
 update w4
set w4.OrgSK='999999999'
 from att.FactWorkPeriod w4
inner join (select distinct OrgSK from att.FactWorkPeriod w5
where w5.OrgSK not in (select distinct OrgIdPreffix from att.DimOrg)) t on t.OrgSK=w4.OrgSK
 where w4.DateSK between @Sdate and @Edate
 -------- پاک کردن افرادی که پاک شده اند -------
delete  from att.FactWorkPeriod 
where PersonSK not in (select distinct PersonSK from att.DimPerson)
and DateSK between @Sdate and @Edate
 

Рис.

и во время выполнения база данных tempDb быстро растет и останавливается, когда диск заполнен. как я могу выполнить его, не сохраняя его в базе данных tempDb, а только вставлять и обновлять данные?
PS- я запускаю код внутри Sql Server, и он работает без проблем.

Комментарии:

1. Насколько мало ваше устройство хранения для его заполнения или сколько данных вы пытаетесь обработать за одну транзакцию? Вы не можете остановить использование SQL Server tempdb , если он чувствует, что ему нужно его использовать, для создания таких вещей, как рабочие таблицы, он будет использовать его.

Ответ №1:

База данных TempDB — это оптимизированное место хранения, которое механизм SQL может выбрать для обработки запроса / операции в зависимости от того, что ему нужно сделать. Когда это происходит, его использование необходимо, и рост файлов для базы данных TempDB является нормальным. Вы можете прочитать больше о том, что конкретно хранится в базе данных TempDB и как это используется механизмом SQL, в базе данных Microsoft Docs TempDB.

Память, используемая файлами за вашей базой данных TempDB, может сохраняться после того, как объекты в базе данных TempDB больше не существуют (поскольку механизм SQL изначально не освобождает потребляемое пространство обратно на диск), но будет повторно использоваться в будущих операциях (по существу, те же байты будут перезаписаны на диск), которыеиспользуйте TempDB.

Поэтому вам не следует так сильно беспокоиться о росте, который вы видите, поскольку он необходим и повторно используется в будущих операциях (ваша база данных TempDB не будет экспоненциально расти при одинаковой рабочей нагрузке). применяется).

Единственный способ ограничить ее использование — предварительно увеличить файлы вашей базы данных TsmpDB до размера, который вы хотите ограничить, и уменьшить выделенное свободное место на диске, где находятся эти файлы, чтобы не осталось ничего, до чего можно было бы расти. Но это было бы очень плохой практикой и, вероятно, привело бы ко многим проблемам с производительностью для ваших запросов и процессов.