Получить данные из запроса - PullRequest
0 голосов
/ 19 июня 2019

У меня есть таблица с 6 столбцами, где один столбец является Id (большой int, primary) и один столбец CreatedDate (datetime), и в нем есть строки более одного миллиона. при извлечении данных из этой таблицы с использованием приведенного ниже запроса требуется более 1 минуты.

select * from MyTable where CreatedDate between '2019-05-01' and '2019-05-30'

Я также использовал запрос ниже, но это также занимает более 1 минуты.

declare @minId bigint, @maxId bigint
select @minId = min(Id) from MyTable  where CreatedDate > = '2019-05-01'
select @maxId = max(id) from MyTable  where CreatedDate <= '2019-05-30'
select @minId, @maxId
select * from MyTable  where Id between @minId and @maxId

Он имеет только один индекс (Id - первичный ключ), и я предполагаю, что добавление индекса в CreatedDate может повлиять на операции вставки / обновления.

Я хочу объединить этот результат с другой таблицей, чтобы некоторые данные отчета отображались в сетке, но при выполнении этого запроса возникает тайм-аут.

Как быстро получить данные?

Ответы [ 3 ]

0 голосов
/ 19 июня 2019

Попробуйте создать следующий индекс:

CREATE NONCLUSTERED INDEX [IX_CreatedDate_ID]
ON dbo.YourTable
(CreatedDate, ID)
GO

Обратите внимание на порядок индекса (CreatedDate, ID). CreatedDate - первый столбец в индексе. Это очень важно. Поэтому, когда вы будете использовать WHERE CreatedDate BETWEEN '2019-05-01' and '2019-05-30', тогда ваш план запроса будет иметь index seek.

И ваш запрос должен выглядеть так:

SELECT 
  CreatedDate
, ID from MyTable 
WHERE CreatedDate BETWEEN '2019-05-01' and '2019-05-30'
0 голосов
/ 19 июня 2019

попробуйте с помощью хранимой процедуры.Хранимая процедура готова к использованию кода, который является предварительно скомпилированным кодом, для извлечения данных требуется меньше времени.

Пример кода хранимой процедуры

0 голосов
/ 19 июня 2019
  1. Создание индекса для CreatedDate поможет в получении, в то время как у него будет некоторый побочный эффект при вставке
  2. Избегайте выбора всех столбцов с подстановочным знаком '*', если только вы не собираетесь использовать их все.Выбор избыточных столбцов может привести к ненужному снижению производительности.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...