Как проверить значение nvarchar из nvarchar SQL Server 2008 - PullRequest
0 голосов
/ 13 января 2012

Это моя временная таблица:

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) в базе данных.

Проблема: когда я собираюсь выбрать значение, оно занимает слишком многовремя.

Пожалуйста, помогите мне, как решить эту проблему.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

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

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

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

1 голос
/ 13 января 2012

Я не думаю, что тот факт, что ваш 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 - гораздо более понятное, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...