Более эффективный способ выбора строк по дате в качестве nvarchar - PullRequest
1 голос
/ 05 сентября 2011

Привет всем, интересно, может ли кто-нибудь посоветовать более эффективный способ выбора строк из таблицы, в которой содержится примерно 60 миллионов записей. В каждой строке есть дата, сохраненная как nvarchar, например, «20110527030000.106». Я хочу выбрать все строки, которые старше 3 месяцев, на основе этого поля даты, поэтому, например, меня интересует только первая часть поля даты; '20110527'. У меня есть следующий код, чтобы сделать это, однако это немного медленно и интересно, если есть лучший способ?

DECLARE @tempDate varchar(12)
SET @tempDate = convert(varchar(12),DATEADD(m,-3,GETDATE()),112)

SELECT *
  FROM [TABLE A]
  WHERE SUBSTRING([DATE_FIELD],0,8) < @tempDate

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

Ваш запрос не только не может использовать какой-либо индекс для [DATE_FIELD] и выполняет полное сканирование, но также применяет функцию SUBSTRING() ко всем значениям (столбец date_field таблицы).

Не применяйте никакие функции к столбцу, чтобы можно было использовать индекс [DATE_FIELD], а функция применяется только один раз при расчете @tempDate:

SELECT *
  FROM [TABLE A]
  WHERE [DATE_FIELD] < @tempDate

Сравнение < работает для значений varchar. Следующее будет оценивать до True:

'20110526030000.106' < '20110527'

Есть ли причина, по которой datetime не сохраняется как тип datetime?

1 голос
/ 05 сентября 2011

Если вы можете изменить базу данных, вы можете добавить новое поле isolder3months и установить его равным 1 для каждой новой записи.

С помощью триггеров вы можете обновлять это один раз в день для каждой записи с isolder3months = 1. Этокак вы проверяете / обновляете только 1 / n-ю ваши записи.

Это решение практично, только если исправлено 3 месяца и этот запрос часто используется.

Тогда ваш запрос будет выглядеть так

SELECT *
FROM [TABLE A]
WHERE [isolder3months] = 1
1 голос
/ 05 сентября 2011

Если вы можете изменить таблицу, вы можете добавить столбец datetime, а затем запустить обновление, чтобы заполнить его правильными данными.

Если вы не можете изменить таблицу, то вы можете создать новую таблицу со столбцом datetime, извлечь ключи из таблицы, в которую вы хотите запросить ее, и применить для всех таблиц противоречие между иностранными ключами. Затем вы можете заполнить столбец datetime, как и раньше, а затем присоединиться к таблицам при выполнении запросов.

Если вы не можете ничего изменить, то, я думаю, вы могли бы попробовать сравнить свое решение с решением, в котором вы преобразуете дату varchar в datetime на лету (например, с помощью определенной пользователем функции). Это на самом деле может работать быстрее.

Надеюсь, это поможет вам ...

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