2016-04-15 12 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サービスがタイムアウトのためにクラッシュ/停止したかどうかを確認して再起動する2番目の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を使用して組み合わせることができます2つのクエリ、です。最初は次のようになります。このため

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)に索引をお勧めします。 2番目のクエリのために

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

こんにちは、あなたの応答に感謝します。データベースにインデックスを作成せずにこれを行うにはどうすればよいですか?これはクライアントのパステルDBであり、私はシステム上の他のクエリに影響することはしたくありません。このクエリは、ローカルで高速に実行する必要があります。 – CypherNet

+0

ここでスプーンを食べることは申し訳ありません。私はプロのSQLの人ではないと私は本当にこのクエリが必要です。 UNION ALLを使用してクエリの完全なソリューションを私に提供してください。あなたのお手伝いをさせていただきます。 – CypherNet

+1

@CypherNetインデックスは、データベースがどのように高速で動作するかを示します。それらがなければ、ときどきタイムアウトが予想されるはずです。クエリが遅くなるようにするには、タイムアウトの長さを長くします –