Sql таблица не отвечает при выборе или подсчете всех строк - PullRequest
0 голосов
/ 08 апреля 2009

У нас есть таблица в базе данных, которая имеет 35 строк, в соответствии с

exec sp_spaceused Department.

Я могу запустить

SELECT TOP 1 * FROM Department,

и получаю результат, но когда я запускаю

SELECT COUNT(*) FROM Department,

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

В чем может быть причина этого? У вас есть предложения?

Ответы [ 6 ]

5 голосов
/ 08 апреля 2009

Есть ли на столе открытый замок, который мешает вам прочитать некоторые строки?

Попытка:

sp_lock
2 голосов
/ 08 апреля 2009

Этот запрос быстро возвращается?

SELECT COUNT(*) FROM Department WITH (NOLOCK)

Если это так, я бы определенно сказал, что в вашей таблице / индексе есть какая-то блокировка, как было предложено.

Марк

2 голосов
/ 08 апреля 2009

Если ваша таблица действительно содержит 35 строк, это не должно занять две минуты. Даже если в вашей таблице миллиарды строк, приличная СУБД будет хранить количество строк для эффективности (я не знаю, сделает ли это Microsoft).

Имейте в виду, что "top 1" просто получит первый ряд в (казалось бы) случайном порядке, поэтому он будет быстрым.

Моей первой мыслью будет повреждение базы данных - что произойдет, когда вы выполните следующее?

select top 2 * from Department
select top 3 * from Department
select top 4 * from Department

и т. Д.

1 голос
/ 09 апреля 2009

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

1 голос
/ 08 апреля 2009

Лучший способ узнать, что происходит, - это отслеживать выполнение запроса, но я не знаю, как это сделать в SQL Server.

Вы также можете попробовать просмотреть план выполнения запроса, который может показать вам, если под прикрытием происходит что-то неожиданное (например, если Департамент действительно сложный вид).

Представляя, что таблица имеет первичный ключ с именем Department_ID, который всегда является положительным целым числом, вы можете попробовать что-то вроде:

SELECT COUNT(*) FROM Department WHERE Department_ID > 0

Это может заставить его сканировать индекс вместо реальной таблицы.

0 голосов
/ 08 апреля 2009

То, что вы ожидаете от простого и быстрого запроса, на самом деле приводит к Сканированию таблиц , которое эффективно считывает все страницы данных с диска и перебирает каждую запись. Это очень дорого. Вы можете использовать этот метод , но я не могу быть уверен, точен он или нет.

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