Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как оптимизировать запросы вида select count(*) from TableName  [new]
Int23
Guest
Добрый день. В таблице более 10 млн записей. И иногда нужно выбрать кол-во без условий. В итоге получается что запрос работает до 1 секунды. Как оптимизнуть?
26 сен 12, 17:11    [13227305]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Glory
Member

Откуда:
Сообщений: 104760
Построить индекс по полю с наименьшей длиной и использовать его сканирование, вместо сканирования всей таблицы
26 сен 12, 17:15    [13227348]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Int23
Guest
Имеется ввиду не кластерный?
26 сен 12, 17:21    [13227391]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Glory
Member

Откуда:
Сообщений: 104760
Int23
Имеется ввиду не кластерный?

Да. Чтобы его размер был минимально возможным
26 сен 12, 17:22    [13227411]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
.Anatoly.
Member

Откуда: Екатеринбург
Сообщений: 310
Желательно, чтобы поле было не nullable.
26 сен 12, 17:24    [13227425]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Glory
Построить индекс по полю с наименьшей длиной и использовать его сканирование, вместо сканирования всей таблицы

Зачем так сложно?
declare @i int
set @i=
(
Select sum(p.rows) as count_of_rows
from sys.partitions p
left join sys.objects o on o.object_id=p.object_id
where o.type='U' and o.name='имя нашей замечательной таблицы, которая может быть секционирована'
print @i
26 сен 12, 17:31    [13227477]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andy_OLAP,
declare @i int
set @i=
(
Select sum(p.rows) as count_of_rows
from sys.partitions p
left join sys.objects o on o.object_id=p.object_id
where o.type='U' and o.name='имя нашей замечательной таблицы, которая может быть секционирована'
)
print @i


Скобку закрывающуюся пропустил. Просто идем в objects, достаем по пользовательской таблице (type='U') и имени ее object_id, далее достаем все секции этой таблицы из partitions и складываем количество строк.
Вот и все.
26 сен 12, 17:32    [13227486]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andy_OLAP
Зачем так сложно?

Затем, что ваш результат вашего запроса может отличаться от действительного числа записей.
26 сен 12, 17:33    [13227493]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Glory
Andy_OLAP
Зачем так сложно?

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

При подсчете строк физической пользовательской таблицы?? Обоснуйте.
26 сен 12, 17:37    [13227515]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
aleks2
Guest
Glory
Int23
Имеется ввиду не кластерный?

Да. Чтобы его размер был минимально возможным


Indexed View.

create view dbo.Count
with schemabinding
as
select COUNT_BIG(*) cnt from dbo.[В таблице более 10 млн записей]
go
create unique clustered index IDX_Count on dbo.Count (cnt)
26 сен 12, 17:41    [13227533]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andy_OLAP
При подсчете строк физической пользовательской таблицы?? Обоснуйте.

Обосновать, что системные таблицы могут не содержать корректное число записей активно изменяющейся таблицы ?
26 сен 12, 17:43    [13227542]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Glory,

Изначальное условие задачи "В итоге получается что запрос работает до 1 секунды. Как оптимизнуть?", автор темы явно хочет не ждать, пока доработает index scan.
Или медленно и точно, или быстро и примерно.
26 сен 12, 17:49    [13227571]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
aleks2
Indexed View
Неожиданно такое от aleks2.
Вроде как олд-скульник. ;)

Чревато что изменения таблы выстроятся в очередь.
26 сен 12, 21:19    [13228512]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
aleks2
Guest
Mnior
aleks2
Indexed View
Неожиданно такое от aleks2.
Вроде как олд-скульник. ;)

Чревато что изменения таблы выстроятся в очередь.

Мне то какая пичалька?
Зато быстро
select COUNT(*) cnt from dbo.[В таблице более 10 млн записей]
выполняться будет.
27 сен 12, 09:32    [13229731]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
имхо: забить на погрешность и юзать
sp_spaceused
27 сен 12, 09:38    [13229751]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Andy_OLAP
Andy_OLAP,
declare @i int
set @i=
(
Select sum(p.rows) as count_of_rows
from sys.partitions p
left join sys.objects o on o.object_id=p.object_id
where o.type='U' and o.name='имя нашей замечательной таблицы, которая может быть секционирована'
)
print @i

Просто идем в objects, достаем по пользовательской таблице (type='U') и имени ее object_id, далее достаем все секции этой таблицы из partitions и складываем количество строк.
Вот и все.
Если "where o.=...", то "left join o" не нужен.
27 сен 12, 09:50    [13229809]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Int23,

Реактивный подсчет количества строк в таблице
ссылка

    select sum(ps.row_count)
    from sys.dm_db_partition_stats ps
    where ps.object_id = object_id(N'Ads')
    and ps.index_id<2
27 сен 12, 21:53    [13235433]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
trew
ссылка
Ёж маё. Школьнеги.
Ссылаются на первоисточник (MS - зуб даю) или на аргументацию.

А тут на нуль, "А вот есть такой запрос, но я его не проверял".
27 сен 12, 23:46    [13235832]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Mnior,

А что не так? Есть ссылка на msdn.
И там четко написано row_count - Приблизительное количество строк в секции.
28 сен 12, 09:59    [13236707]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
trew, только ни в твоём посте ни в той ссылке этого нет.
Сразу оговорить и ссылку привести.
Теперь всё нормально.
28 сен 12, 21:51    [13241618]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать запросы вида select count(*) from TableName  [new]
antbr
Member

Откуда:
Сообщений: 75
Mnior,

SQL заметки
Полезные ссылки:
- подробнее о представлении sys.dm_db_partition_stats можно почитать тут
29 сен 12, 02:58    [13242816]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить