Медленные SQL-запросы, таблица заказа по дате? - PullRequest
0 голосов
/ 11 января 2012

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

Когда я запрашиваю из этой базы данных, это занимает НАВСЕГДА.Под этим я подразумеваю, что я не был достаточно терпеливым, чтобы ждать результатов (через 2 минуты я должен отменить, чтобы избежать блокировки отдела исследований и разработок).Даже если я использую короткий диапазон дат (более нескольких месяцев), получить результаты из этого невозможно.Я запрашиваю требования из 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

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

Ответы [ 3 ]

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

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

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

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

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

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

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

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

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

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

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

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

Без просмотра типа данных или существующих индексов это сложно, но, по крайней мере, могут помочь следующие индексы ASCENDING:

[DalsaTE]. [Dbo]. [ResultsNumeric] ModeDescription и ResultsUutId и TestName

[DalsaTE]. [Dbo]. [ResultsUut] StartDateTime и DeviceName и ResultsUutId

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

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