2016-04-15 33 views
-1

這是我真正需要修改的代碼。我做了一個簡單的方法,因爲我不是SQL中的專家。導致超時的SQL語句

SELECT Inv1.AutoIndex, Inv1.DocState, Inv1.OrderNum,  
Inv1.ExtOrderNum, dbo.Client.ubARSMS, dbo.Client.Fax1 
FROM  dbo.InvNum Inv1 INNER JOIN 
      dbo.Client ON Inv1.AccountID = dbo.Client.DCLink 
WHERE  (dbo.Client.ubARSMS = 1) 
    AND (Inv1.OrderDate >= dbo.Client.udARSMSACTDATE) 
    AND Inv1.OrderNum NOT IN (SELECT o.OrderNum 
          FROM dbo.net_OrderSMSLog o 
          WHERE (o.DocState = 4)) 
    AND Inv1.AutoIndex NOT IN(SELECT Inv2.OrigDocID 
          FROM dbo.InvNum Inv2 
          WHERE Inv2.OrderNum = Inv1.OrderNum) 
    AND 
     (
     DATEPART(YEAR, Inv1.InvDate) = DATEPART(YEAR, GETDATE()) 
     AND DATEPART(MONTH, Inv1.InvDate) = DATEPART(MONTH, GETDATE()) 
     AND DATEPART(DAY, Inv1.InvDate) = DATEPART(DAY, GETDATE()) 

    OR  
     DATEPART(YEAR, Inv1.InvDate) = DATEPART(YEAR,DATEADD(dd,-1,GETDATE())) 
     AND DATEPART(MONTH, Inv1.InvDate) = DATEPART(MONTH,DATEADD(dd,-1,GETDATE())) 
     AND DATEPART(DAY, Inv1.InvDate) = DATEPART(DAY,DATEADD(dd,-1,GETDATE())) 
    ) 

我需要這個工作儘可能快。

+4

表定義,包括約束和索引。 – jarlh

+0

您的「OR」邏輯是否正確? –

+0

或者邏輯正確,這段代碼正確地提取記錄,它只是經常超時 – CypherNet

回答

0

因爲我上面的查詢在服務器上的負載很小並且有較少的記錄需要執行時工作。

超時是我需要處理的唯一事情,無需在客戶端主數據庫上創建索引。

因此,我只是創建了第二個Windows服務,檢查第一個Windows服務是否因超時而崩潰/停止,然後重新啓動它。

解決了我的問題,超時崩潰我的服務。

1

這是您的查詢:

SELECT Inv1.AutoIndex, Inv1.DocState, Inv1.OrderNum,  
     Inv1.ExtOrderNum, c.ubARSMS, c.Fax1 
FROM dbo.InvNum Inv1 INNER JOIN 
    dbo.Client c 
    ON Inv1.AccountID = c.DCLink AND Inv1.OrderDate >= c.udARSMSACTDATE 
WHERE (c.ubARSMS = 1) AND 
     Inv1.OrderNum NOT IN (SELECT o.OrderNum 
          FROM dbo.net_OrderSMSLog o 
          WHERE (o.DocState = 4) 
          ) AND 
     Inv1.AutoIndex NOT IN (SELECT Inv2.OrigDocID 
          FROM dbo.InvNum Inv2 
          WHERE Inv2.OrderNum = Inv1.OrderNum 
          ) OR 
     (Inv1.InvDate >= CAST(DATEADD(day, -1 GETDATE()) as date) AND 
     Inv1.InvDate < CAST(GETDATE() as date) 
    ) 

這實際上是兩個查詢,您可以使用UNION ALL結合起來。第一個是:

SELECT Inv1.AutoIndex, Inv1.DocState, Inv1.OrderNum,  
     Inv1.ExtOrderNum, c.ubARSMS, c.Fax1 
FROM dbo.InvNum Inv1 INNER JOIN 
    dbo.Client c 
    ON Inv1.AccountID = c.DCLink AND Inv1.OrderDate >= c.udARSMSACTDATE 
WHERE (c.ubARSMS = 1) AND 
     Inv1.OrderNum NOT IN (SELECT o.OrderNum 
          FROM dbo.net_OrderSMSLog o 
          WHERE (o.DocState = 4) 
          ) AND 
     Inv1.AutoIndex NOT IN (SELECT Inv2.OrigDocID 
          FROM dbo.InvNum Inv2 
          WHERE Inv2.OrderNum = Inv1.OrderNum 
          ) 

對於這一點,我將在Client(ubARSMS, DCLink, udARSMACTDate)InvNum(ClientId, OrderNum, AutoIndex)InvNum(OrderNum, OrigDocId),並net_OrderSMSLog(DocState, OrderNum)建議指標。

對於第二個查詢:

SELECT Inv1.AutoIndex, Inv1.DocState, Inv1.OrderNum,  
     Inv1.ExtOrderNum, c.ubARSMS, c.Fax1 
FROM dbo.InvNum Inv1 INNER JOIN 
    dbo.Client c 
    ON Inv1.AccountID = c.DCLink AND Inv1.OrderDate >= c.udARSMSACTDATE 
WHERE (Inv1.InvDate >= CAST(DATEADD(day, -1 GETDATE()) as date) AND 
     Inv1.InvDate < CAST(GETDATE() as date) 
    ) 

你想在InvNum(InvDate, AccountId, OrderDate)Client(DCLink, udARSMACTDate)的索引。

+0

嗨,謝謝你的迴應。我怎樣才能做到這一點,而無需在數據庫上創建索引?這是客戶端Pastel DB,我不想做任何會影響系統上其他查詢的事情。我需要這個查詢本身在本地快速運行。 – CypherNet

+0

我很抱歉被要求在這裏吃湯匙。我不是一個職業SQL人,我真的需要這個查詢。請你可以向我提供一個完整的解決方案,查詢UNION ALL。您的幫助將不勝感激。 – CypherNet

+1

@CypherNet索引是數據庫如何工作的快速。沒有他們,你應該期待偶爾的超時。如果您希望允許查詢速度較慢,請增加超時時間 –