2012-01-13 40 views
-1

這是我的臨時表nvarchar的值:如何檢查從nvarchar的SQL Server 2008中

CREATE TABLE #tmpRecentTxns(SerialID nvarchar(50) null,TranDate datetime2 null) 

select * 
from #tmpRecentTxns 
where #tmpRecentTxns.SerialID NOT IN 
     (SELECT distinct Phone 
      FROM ApplicationVariables 
      WHERE datediff(n, vardatetime, getdate()) <= 300) 

這裏Phone數據類型是數據庫nvarchar(10)

問題:當我要選擇價值時,它會花費太多時間。

請幫我解決這個問題。

在此先感謝。

+0

你想用這個查詢來完成什麼?我推斷查找「ApplicationVariables」中沒有最近電話號碼的所有交易。你能更多地解釋你的邏輯嗎? – jklemmack 2012-01-13 07:15:54

+0

您是否在臨時表上創建了適當的索引?爲什麼要創建臨時表,你真的需要它嗎? – 2012-01-13 07:16:24

回答

1

我不認爲你的PhoneNVARCHAR(10)類型的性能不佳的原因。

首先,您應該確保您的ApplicationVariables表(包括Phone列)中的vardatetime列有索引。

CREATE INDEX IX_AppVar_VarDateTime 
ON dbo.ApplicationVariables(vardatetime) INCLUDE(Phone) 

其次,你應該更改查詢,以便該指標可用於:

SELECT distinct Phone 
     FROM ApplicationVariables 
     WHERE vardatetime >= DATEADD(MINUTE, -300, GETDATE()) 

另外:我會建議使用MINUTE說明符DATEDADDDATEDIFF - 更清楚你在做什麼試圖去做。

2

我認爲這會給你相同的輸出。

select * 
from #tmpRecentTxns 
where #tmpRecentTxns.SerialID 
    not in (select Phone 
      from ApplicationVariables 
      where vardatetime >= dateadd(minute, -300, getdate())) 

它將允許您使用vardatetime上的索引。

+1

非常感謝您幫助我解決這個問題,因爲早上我正在爲此嘗試。 :),它的工作正常。 – 2012-01-13 07:38:26