2012-01-13 5 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

+0

Создавали ли соответствующие индексы в таблице темпа? Почему вы создаете временную таблицу, вам она действительно нужна? –

ответ

1

Я не думаю, что ваш Phone имеет тип NVARCHAR(10) является причиной плохой производительности.

Прежде всего, вы должны убедиться, что у вас есть указатель на столбец vardatetime в таблице ApplicationVariables (включая столбец Phone).

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

Во-вторых, вы должны изменить запрос таким образом, что этот показатель может быть использован:

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

Кроме того: я бы рекомендовал использовать MINUTE спецификатор для DATEDADD или DATEDIFF - гораздо яснее, что вы пытаясь сделать.

2

Я думаю, что это даст тот же результат, что и у вас.

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

Это позволит вам использовать индекс на vardatetime.

+1

Большое спасибо, чтобы помочь мне решить эту проблему, с утра я пытался это сделать. :), Его работа отлично. –

Смежные вопросы