2015-06-11 38 views
1

这是我的查询,任何人都可以看到任何方式使这种效率更高,因此它不超时?我正在使用Exacttarget(Salesforce Marketing Cloud)。它有30分钟的超时限制。我尝试过移动东西,但似乎总是出错。我是一个初学SQL的人,但上周我一直很辛苦。我的查询如下。谢谢!查询超时/使查询更有效率(精确目标)

SELECT DISTINCT c.Email, c.FName 
FROM ENT.Contacts c WITH(NOLOCK) 
INNER JOIN ENT.RegistrationData r WITH(NOLOCK) 
ON c.Email = r.RegistrationContactEmail 
LEFT Join ENT._Subscribers s WITH(NOLOCK) 
ON c.Email = s.SubscriberKey 
AND s.status NOT IN ('unsubscribed','held') 

WHERE 

(
    (
     (
      (
       r.RegistrationEmailOptStatus = '1' AND 
       r.RegistrationEventType = 'Wedding' AND 
       r.RegistrationEventRole IN ('Bride','Other','Bridesmaid','Mother Of the Bride') AND 
       r.RegistrationCountry IN ('USA') AND 
       r.RegistrationEventDate < '2014-05-31' 
      ) 

      OR 

      (
       r.RegistrationEmailOptStatus = '1' AND 
       r.RegistrationEventType = 'Prom' AND 
       r.RegistrationEventRole ='Prom' AND 
       r.RegistrationCountry IN ('USA') AND 
       r.RegistrationEventDate BETWEEN '2014-01-01' AND '2015-12-31' 
      ) 
     ) 

     AND 

     (
      (
       c.Email IN 
       (
        SELECT DISTINCT 
         s.SubscriberKey AS Email 
        FROM 
         _Open s 
        WHERE 
         datediff(mm,s.EventDate, getdate()) <= 3 
       ) 
      ) 
      OR 
      (
       c.Email IN 
       (
        SELECT DISTINCT 
         s.SubscriberKey AS Email 
        FROM 
         _Click s 
        WHERE 
         datediff(mm,s.EventDate, getdate()) <= 3 
       ) 
      ) 
     ) 

    ) 

    OR 

    (
     r.RegistrationEmailOptStatus = '1' AND 
     r.RegistrationEventType = 'Wedding' AND 
     r.RegistrationEventRole IN ('Bride','Other','Bridesmaid','Mother Of the Bride') AND 
     r.RegistrationCountry IN ('USA') AND 
     r.RegistrationEventDate BETWEEN '2015-05-01' AND '2015-05-31' 
    ) 
) 

回答

0

我会拍摄一张照片。也许有一些小的东西,但在我看来像它应该使查询旋转很长一段时间的唯一事情就是

  c.Email IN 
      (
       SELECT DISTINCT 
        s.SubscriberKey AS Email 
       FROM 
        _Open s 
       WHERE 
        datediff(mm,s.EventDate, getdate()) <= 3 
      ) 
     OR 
      c.Email IN 
      (
       SELECT DISTINCT 
        s.SubscriberKey AS Email 
       FROM 
        _Click s 
       WHERE 
        datediff(mm,s.EventDate, getdate()) <= 3 
      ) 

里面还有两个问题。首先,你使用IN(SELECT ...)进行日期数学计算,然后使用IN(SELECT ...)几乎肯定是无效的。

要解决第一个问题,计算单个测试日期并使用它。对于第二个喜欢检查与EXISTS。

DECLARE @testDate DATE = DATEADD(mm,3,GETDATE()) 

...

 EXISTS(SELECT 1 FROM _Open s WHERE s.EventDate>@testDate AND c.Email = s.SubscriberKey) 
    OR EXISTS(SELECT 1 FROM _Click s WHERE s.EventDate>@testDate AND c.Email = s.SubscriberKey) 

你也很可能放松的EXISTS和使用连接到_open和_Click,但感觉更复杂。

给这个镜头,让我们知道它是否有帮助。

+0

谢谢!不幸的是,Exacttarget使用的SQL版本不允许使用变量。我确实收到了一些建议,希望在WHERE子句之上打开并单击数据,以便我可以尝试查看是否可以使其工作。欣赏你看着这个虽然! – Lukacko

+0

我想知道是否会出现这种情况 - 对ExactTarget不熟悉,但我带了一份传单。如果ExactTarget允许参数化查询,您可以单独计算测试日期并将其传入。但是,如果您只有我的第二个建议,而将日期计算保持一致,则可能仍会看到perf性能的提高。 –

1

我同意Karl所说的主要性能指标是在引用_Open_Click系统数据视图的子查询中。但是,根据我对ExactTarget(Salesforce Marketing Cloud)的经验,您仅限于运行'SELECT'语句,并且无法以这种方式声明变量。

我建议在_Open_Click数据视图上运行单独的查询,然后在查询中引用生成的数据扩展。这可能需要更多步骤。但是,您会发现整体处理时间较短。

对于第一个查询,我会创建在过去3个月中打开或单击的所有人的数据扩展名。然后在第二个查询中,我会用“IN”语句引用结果数据扩展。这将消除查询中的“OR”条件之一,这可能很昂贵。如果查询仍然表现不佳,我建议以避免“OR”条件的方式重写RegistrationData数据扩展中的条件逻辑。

查询1:

SELECT DISTINCT s.SubscriberKey AS Email 
FROM _Open s WITH(NOLOCK) 
WHERE datediff(mm,s.EventDate, getdate()) <= 3 

union all 

SELECT DISTINCT s.SubscriberKey AS Email 
FROM _Click s WITH(NOLOCK) 
WHERE datediff(mm,s.EventDate, getdate()) <= 3 

QUERY2:

SELECT DISTINCT c.Email, c.FName 
FROM ENT.Contacts c WITH(NOLOCK) 
INNER JOIN ENT.RegistrationData r WITH(NOLOCK) 
ON c.Email = r.RegistrationContactEmail 
LEFT Join ENT._Subscribers s WITH(NOLOCK) 
ON c.Email = s.SubscriberKey 
AND s.status NOT IN ('unsubscribed','held') 
WHERE 
(
    (
     (
      (
       r.RegistrationEmailOptStatus = '1' AND 
       r.RegistrationEventType = 'Wedding' AND 
       r.RegistrationEventRole IN ('Bride','Other','Bridesmaid','Mother Of the Bride') AND 
       r.RegistrationCountry IN ('USA') AND 
       r.RegistrationEventDate < '2014-05-31' 
      ) 

      OR 

      (
       r.RegistrationEmailOptStatus = '1' AND 
       r.RegistrationEventType = 'Prom' AND 
       r.RegistrationEventRole ='Prom' AND 
       r.RegistrationCountry IN ('USA') AND 
       r.RegistrationEventDate BETWEEN '2014-01-01' AND '2015-12-31' 
      ) 
     ) 

     AND 

     (
      c.Email in (
       select s.SubscriberKey 
       from OpenOrClickDE s 
       where s.SubscriberKey = c.Email    
      ) 
     ) 

    ) 

    OR 

    (
     r.RegistrationEmailOptStatus = '1' AND 
     r.RegistrationEventType = 'Wedding' AND 
     r.RegistrationEventRole IN ('Bride','Other','Bridesmaid','Mother Of the Bride') AND 
     r.RegistrationCountry IN ('USA') AND 
     r.RegistrationEventDate BETWEEN '2015-05-01' AND '2015-05-31' 
    ) 
) 
+1

谢谢!我能够使用2个查询快速运行它。只是试图看看是否有更好的方法,我可以写在一个查询。我认为联盟可能是我需要遵循的轨道。感谢您花时间看看这个! – Lukacko

+0

嘿@Lukacko,如果这回答你的问题,请适当标记。谢谢! –