Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Время работы "select count(*)"  [new]
J.Serge
Member [скрыт]

Откуда:
Сообщений: 791
Есть база:
select @@version
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

Используется third-party софтом. Все кишки - таблицы, view, индексы и прочее - создаются только этим софтом.
В ней есть пара таблиц на 34 и 72 миллионов записей.
Запрос
select count(*) from ...
для них выполняется за 30 и 70 секунд соответственно.
Как-то меня это удивляет - это вообще не многовато-ли? Или нормально?
19 окт 09, 09:48    [7803325]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Вообще многовато.
Причины:
1) На таблице нет индексов и ваш запрос сканит таблицу (маловероятно).
2) Во время вашего запроса происходит например вставка в таблицу. Поэтому, из-за блокировок ваш запрос отрабатывает так долго.
19 окт 09, 09:56    [7803369]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
baracs
Member

Откуда: Москва
Сообщений: 7198
--__Александр__--
Вообще многовато.

Вот так вот, ничего не зная ни о железке ни о таблицах...

ИМХО: по секунде на миллион - терпимо. А причин может быть гораздо больше.
19 окт 09, 10:41    [7803574]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
baracs,
Ну так напишите парочку еще, помимо ожиданий и отсутвующих индексов.
19 окт 09, 10:44    [7803594]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
iljy
Member

Откуда:
Сообщений: 8711
--__Александр__--,

попробуйте
with CTE as
(
	select row_number() over(order by (select 1)) N
	from master..spt_values t1, master..spt_values t2, master..spt_values t3
)
select top 34000000 * into ttt_2
from CTE

select count(*) from ttt_2

--drop table ttt_2

не очень чистый эксперимент (строка короткая, хотя можно ее удлиннить при желании), но показательный. А вообще план бы посмотреть.
19 окт 09, 10:51    [7803646]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
J.Serge
Member [скрыт]

Откуда:
Сообщений: 791
baracs
.. ничего не зная .. о железке ...

IBM xSeries 346
4 x Xeon 3.4
4G RAM (из которых Win2K видит только 3.5)
19 окт 09, 10:54    [7803672]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
iljy,
И какие выводы я должен сделать из этого эксперемента?
19 окт 09, 10:56    [7803680]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
baracs
Member

Откуда: Москва
Сообщений: 7198
--__Александр__--
baracs,
Ну так напишите парочку еще, помимо ожиданий и отсутвующих индексов.

Вы только один тип ожиданий упоминали: ожидание ресурса из-за блокировки другими процесами.
А есть еще ожидания дискового ввода-вывода, сетевые...
Причины частого ожидания дискового IO: сильная фрагментация таблицы/индекса, общая тормознутость дисковой подсистемы...

Кстати, COUNT и процессор нехило грузит.
19 окт 09, 11:00    [7803705]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
iljy
Member

Откуда:
Сообщений: 8711
--__Александр__--
iljy,
И какие выводы я должен сделать из этого эксперемента?


сколько он работает на заведомо не блокируемой таблице с короткой строкой (то же, что с коротким индексом)
19 окт 09, 11:04    [7803737]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
baracs,
Один тип ожиданий, я привел в качестве примера.Во втором своем посте я обобщил свой вопрос.

Ну так напишите парочку еще, помимо ожиданий и отсутвующих индексов.
19 окт 09, 11:05    [7803743]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
iljy,
Ну это не комне скорее, а к ТС.
19 окт 09, 11:05    [7803747]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
iljy
Member

Откуда:
Сообщений: 8711
--__Александр__--,

пордон, я писал не вам, а ТС
19 окт 09, 11:05    [7803751]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
J.Serge
Member [скрыт]

Откуда:
Сообщений: 791
--__Александр__--
Вообще многовато.
Причины:
..
2) Во время вашего запроса происходит например вставка в таблицу. Поэтому, из-за блокировок ваш запрос отрабатывает так долго.


Это софт Cisco для call-center'а. Таблицы Route_Call_Detail и Termination_Call_Detail, которые заполняются несколькими записями каждая на каждый звонок. Количество звонков разнится в зависимости от дня месяца (может быть более миллиона в день) и времени суток (где-то пять тысяч в самый спокойный час в обычный день). Количество записей контролируется софтом - самые старые помалу выбрасываются (вчера было 35 и 75 миллионов). 70 секунд на запрос на таблице с 74 милионами записей было сегодня утром. Вчера пробовал на 75 - было вообще 2.5 минуты, но это было днем, когда звонков больше.

Собственно я задался вопросом, реально ли сделать некий отчет, выбирая данные из этих таблиц, если такой простой запрос так медленно отрабатывает..
19 окт 09, 11:06    [7803754]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
J.Serge,

1) select count(*) - не простой запрос, так как вызывает скан таблицы/индекса.
Вот например select top 10 * from Table - простой запрос.
2) Привидите результаты примера iljy.
3) У вас индесы то на таблице есть?
19 окт 09, 11:10    [7803781]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
iljy
Member

Откуда:
Сообщений: 8711
J.Serge
--__Александр__--
Вообще многовато.
Причины:
..
2) Во время вашего запроса происходит например вставка в таблицу. Поэтому, из-за блокировок ваш запрос отрабатывает так долго.


Это софт Cisco для call-center'а. Таблицы Route_Call_Detail и Termination_Call_Detail, которые заполняются несколькими записями каждая на каждый звонок. Количество звонков разнится в зависимости от дня месяца (может быть более миллиона в день) и времени суток (где-то пять тысяч в самый спокойный час в обычный день). Количество записей контролируется софтом - самые старые помалу выбрасываются (вчера было 35 и 75 миллионов). 70 секунд на запрос на таблице с 74 милионами записей было сегодня утром. Вчера пробовал на 75 - было вообще 2.5 минуты, но это было днем, когда звонков больше.

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

Правильно заданный вопрос содержит большую часть ответа И запрос не такой уж простой - ему необходимо получить ВСЕ записи из таблицы, соответственно если она блокируется на вставку - запрос будет ждать. При построении отчета вам тоже ВСЕ записи будут нужны? Или есть шанс проскочить мимо свежевставляемых? И еще - индексы какие на таблице? Если постоянно фрагментируется кластер при вставке - тормозить будет все.
19 окт 09, 11:12    [7803809]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
J.Serge
Собственно я задался вопросом, реально ли сделать некий отчет, выбирая данные из этих таблиц, если такой простой запрос так медленно отрабатывает..
Реально все.
Но почему вообще должно удивлять, что запрос, перебирающий так или иначе все записи в многомиллионной таблице на нагруженном сервере, работает не быстро? ;)

Если качество подсчета числа записей волнует не очень сильно, попробуйте:
select count(*) from Table1 with(nolock)
19 окт 09, 11:35    [7803998]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33339
Блог
тогда уж так)
exec sp_spaceused таблица
19 окт 09, 12:09    [7804276]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
J.Serge
Member [скрыт]

Откуда:
Сообщений: 791
--__Александр__--

3) У вас индесы то на таблице есть?

А какие индексы используются при запросе
select count(*) from table
?
19 окт 09, 17:00    [7807037]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
Glory
Member

Откуда:
Сообщений: 104760
J.Serge
--__Александр__--

3) У вас индесы то на таблице есть?

А какие индексы используются при запросе
select count(*) from table
?

Это вы нас спрашиваете ?
19 окт 09, 17:02    [7807042]     Ответить | Цитировать Сообщить модератору
 Re: Время работы "select count(*)"  [new]
iljy
Member

Откуда:
Сообщений: 8711
J.Serge
--__Александр__--

3) У вас индесы то на таблице есть?

А какие индексы используются при запросе
select count(*) from table
?


самый узкий из имеющихся на таблице.
19 окт 09, 17:20    [7807218]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить