2012-01-10 2 views
0

У меня есть база данных Sql-Server-2008, на которую я запрашиваю, на регулярной основе которой было более 30 миллионов записей (радость!). К сожалению, эта база данных не может быть радикально изменена, поскольку она все еще используется для R/D.Медленные SQL-запросы, таблица заказов по дате?

Когда я запрашиваю из этой базы данных, он принимает FOREVER. Под этим я подразумеваю, что я не был достаточно терпелив, чтобы ждать результатов (через 2 минуты я должен отменить, чтобы избежать блокировки отдела R/D). Даже если я использую короткий диапазон дат (более нескольких месяцев), в принципе невозможно получить от него какие-либо результаты. Я запрашиваю требования от 4 столбцов и, к сожалению, должен использовать внутреннее соединение для другой таблицы (мне сказали, что это очень дорого, с точки зрения эффективности запросов, но это неизбежно). Эта внутренняя объединенная таблица имеет менее 100 тыс. Записей.

Что мне было интересно, можно ли организовать таблицу, чтобы она по умолчанию была упорядочена по дате, чтобы уменьшить количество результатов, которые она должна выполнить для поиска?

Если это невозможно, могу ли я что-нибудь сделать, чтобы сократить время запроса? Есть ли другая полезная информация, которая могла бы помочь мне придумать решение?

Я включил образец запрос, который я использую:

SELECT DISTINCT N.TestName 
FROM [DalsaTE].[dbo].[ResultsUut] U 
INNER JOIN [DalsaTE].[dbo].[ResultsNumeric] N 
ON N.ModeDescription = 'Mode 8: Low Gain - Green-Blue' 
AND N.ResultsUutId = U.ResultsUutId 
WHERE U.DeviceName = 'BO-32-3HK60-00-R' 
AND U.StartDateTime > '2011-11-25 01:10:10.001' 
ORDER BY N.TestName 

Любая помощь или предложения приветствуются!

+0

Вам нужен план объяснений или, по крайней мере, сообщите нам, какие поля индексируются. –

+0

У вас есть индекс или что-нибудь в поле, которое вы заказываете, включая TestName? – msarchet

ответ

2

Похоже, что дата и время может быть текстовым полем, а затем индекс не используется?

Не могли бы вы попробовать следующее, чтобы увидеть, если у вас есть какие-либо улучшения скорости:

select distinct N.TestName 
from   [DalsaTE].[dbo].[ResultsUut] U 
inner join  [DalsaTE].[dbo].[ResultsNumeric] N 
    on N.ModeDescription = 'Mode 8: Low Gain - Green-Blue' 
    and N.ResultsUutId = U.ResultsUutId 
where   U.DeviceName = 'BO-32-3HK60-00-R' 
       and U.StartDateTime > cast('2011-11-25 01:10:10.001' as datetime) 
order by  N.TestName 

Было бы также стоит попробовать изменения ваше внутреннее соединение в левое внешнее соединение, как и время от времени работать быстрее без всякой мыслимой причине (по крайней мере, тот, о котором я не знаю).

+0

Кастинг даты, кажется, улучшает хит и промах - вопрос запроса. Это хорошо. Благодаря! – ImGreg

+0

@ImGreg Glad Я могу помочь! – Codingo

2

Вы можете добавить индекс, основанный на вашем столбце даты, что должно улучшить ваше время запроса. Вы можете использовать команду alter table или использовать конструктор таблиц.

Является единственной целью объединения для сортировки? Если это так, то быстро попытаться удалить это и посмотреть, какая разница, по крайней мере, тогда вы будете знать, где сосредоточить ваше внимание.

Наконец, в студии управления SQL Server есть несколько полезных инструментов, таких как планы выполнения, которые могут помочь в диагностике проблем с производительностью. Удачи!

1

Существует ряд проблем, которые могут вызывать задержки при выполнении вашего запроса.

Индексы (кроме первичного ключа) не изменяют порядок данных, они просто создают индекс (телефонная книга), который заказывает несколько значений и указывает на первичный ключ.

Не видя тип данных или существующих индексов, это трудно, но, по крайней мере, следующие показатели ВОСХОДЯЩИЕ может помочь:..

[DalsaTE] [DBO] [ResultsNumeric] ModeDescription и ResultsUutId и АСМАП

[DalsaTE]. [DBO]. [ResultsUut] StartDateTime и ИмяУстройство и ResultsUutId

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

+0

Спасибо за помощь! Я добавил индексы в таблицу Uut, но, к сожалению, я не могу добавить индексы в числовую таблицу из-за тайм-аутов. Любая идея, как настроить это? (индексирование 30 миллионов записей занимает некоторое время, как я себе представляю). В разделе «Параметры» тайм-аут исполнения кажется неограниченным. – ImGreg

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