Why does my DELETE command require huge amount of temporary run storage?
You need to batch your deletes so that you don't lock the table and fill your transaction log.

declare @deleteDate DATETIME2 = DATEADD(month, -3, GETDATE()) 
 DECLARE    
    @RC INT = 1;

WHILE (@RC &gt; 0)
BEGIN

  delete top 1000 art.ArticleConcept where ArticleId IN (select ArticleId from art.Article where PublishDate &lt; @deleteDate);

  SET @RC = @@ROWCOUNT

END


You can experiment with larger batch sizes (I usually go 5000-50000) but this is a good place to start. You do have to be careful about lock escalation attempts when choosing batch sizes.

You'll probably also see an improvement by sending your list of ArticleIds to a temp table so that you only have to scan art.Article one time.

declare @deleteDate DATETIME2 = DATEADD(month, -3, GETDATE()) 
create table #ArticlesToDelete (ArticleId int primary key not null);
insert into #ArticlesToDelete (ArticleId) select ArticleId from art.Article where PublishDate &lt; @deleteDate;

DECLARE @RC INT = 1;

WHILE (@RC &gt; 0)
BEGIN
  delete top 1000 A from art.ArticleConcept A join #ArticlesToDelete D on A.ArticleId = D.ArticleId;
  SET @RC = @@ROWCOUNT
END
drop table #ArticlesToDelete