2015-09-28 2 views
-1

Если я использую этот запрос, зависания SQL Server или нужно много времени, чтобы выполнить запрос:SQL Server зависает при использовании ORDER BY

SELECT TOP 1 mssid 
FROM my_table 
WHERE serial = 'myserialcode' 
ORDER BY times DESC; 

Этот запрос прост, он должен показать мне последнюю запись из последовательный. В таблице содержится 700 тыс. Записей, это не проблема, не так ли?

Если я удалю ORDER BY times DESC, он работает быстро, но я не получаю последнюю запись.

Обход запросов, не работает слишком:

SELECT TOP 1 * 
FROM my_table 
WHERE serial = 'myserialcode' 
    AND times = (SELECT MAX(times) 
       FROM my_table 
       WHERE serial = 'myserialcode') 

Datatypes:

  • серийными = VARCHAR 20
  • раз = BIGINT 19,0

Спасибо, Грегор

EDIT: Я разговаривал с администратором сервера SQL Server, он сказал мне, что таблица разбита (?). 3 дня назад запрос работал без проблем. Он исправит это, поэтому я думаю, что он решен. В любом случае, я создам индекс на mssid и times, и буду использовать указанные поля вместо * в будущем, спасибо!

РЕДАКТИРОВАТЬ 2: Стол или строка из таблицы были сломаны и убили запрос. Теперь он работает снова, 0,031 сек. :) Также запрошен запрос на индексацию. И если я использовал запрос выше, с другим серийным, он работал.

+0

сортировки является дорогостоящей операцией, которая будет принимать время. Если возможно, добавьте индекс на 'serial' и' times' –

+1

Указатели на какие столбцы? –

+0

Если у вас его еще нет - попробуйте добавить индекс в 'serial' и включите' mssid': 'CREATE NONCLUSTERED INDEX IX01_YourTable ON dbo.YourTable (serial) INCLUDE (mssid);' - это улучшает производительность вообще ? Есть ли указатель на «времена»? –

ответ

-1

Выберите верхний (1) * Из my_table с (разблокировать) Где серийный = 'mysrialcode' Сортировать по времени по алфавиту

Я думаю, что это может быть проблемой транзакции. Я бы не предложил вам указать ваш Поле времени/столбец Но проверьте индексирование на 'myserialcode' Или, в лучшем случае, советник по настройке данных для справки.

Также использование * плохо для оптимизации. Используйте выбранные поля/столбцы.

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

Спасибо.

+1

Помимо рекомендации относительно '*', это опасный совет. Во-первых, 'unlock' не является ключевым словом в MS SQL Server. Во-вторых, использование 'с NOLOCK' (что вы, вероятно, означало означает, что вы получите грязные чтения - незафиксированные транзакции будут прочитаны, как если бы они были реальными), что означает, что в транзакционной системе результаты этого запроса ** могут не представляют реальные данные **. [NOLOCK не является турбо-кнопкой] (http://itknowledgeexchange.techtarget.com/sql-server/nolock-is-not-a-turbo-button/) – alroc

+0

Спасибо @alroc, I (nolock). Я понимаю, что такое транзакция изоляции, я предполагал, что он может столкнуться с проблемами блокировки. Тем не менее, спасибо за то, что он поднял ее. –

0

Добавить индекс DESc времен

Затем использовать первый оператор SQL, который должен работать.

0

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

ORDER BY mssid DESC 
Смежные вопросы