Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как найти самую длинную таблицу в БД  [new]
vsem COUNT
Guest
(кроме как писать динамику, перебирая все таблицы и считая каждой COUNT(*))
7 июн 12, 15:02    [12682508]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SELECT TOP 1
  OBJECT_NAME(object_id),
  SUM(rows) 
FROM
  sys.partitions
WHERE
  index_id IN(0, 1)
GROUP BY
  object_id 
ORDER BY 2 DESC 
7 июн 12, 15:08    [12682565]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
vsem COUNT
Guest
pkarklin,

спасибище!
7 июн 12, 15:12    [12682602]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
vsem COUNT,

кстати, учтите, что
бол
rows bigint Указывает приблизительное количество строк в данной секции.
Хотя, если статистика актуальная, то все должно быть ок.
ради интереса, сравнил в своей базе, и нашел таки несовпадения, правда таблицы какие-то странные, надо будет проверить используются ли они вообще =)
На всякий случай динамический скрипт и сравнение.
+
declare @t table(name sysname, c bigint);
declare @sql nvarchar(max) = '';
select @sql+= replace('select ''<name>'',count_big(*) from [<name>];','<name>',name) from sys.tables where [schema_id] = 1;
insert @t(name, c)
exec sp_executesql @sql;
with p as
(
SELECT
  name = OBJECT_NAME(object_id),
  c = SUM(rows) 
FROM
  sys.partitions
WHERE
  index_id IN(0, 1)
GROUP BY
  object_id 
)
select * 
from 
	p join @t t on t.name = p.name
where
	p.c <> t.c
;
7 июн 12, 15:36    [12682817]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
SomewhereSomehow, там неточность может получится из-за открытых транзакций, но при этом
... if you have lots and lots of transactions inserting new rows continuously, what would an 'accurate' count really mean?

Geek City: How Many Rows?
7 июн 12, 15:45    [12682908]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Shakill,

Занятная статья, спасибо. Насколько я понял, транзакции там используются только для демонстрации неточности. У меня никаких открытых транзакций нет, тем не менее неточность есть.
Есть недокументированная опция команды update statistics.
update statistics MyTable with rowcount = 10000;

при помощи нее можно влиять на это значение, делая его каким угодно. Однако, хоть и называется update statistics, хранится эта инфа не там где статистика и простой update statistics не убирает неточность. Помогает перестроение индекса. Вот что я имел ввиду под актуальностью (не правильно выразился).
7 июн 12, 16:30    [12683309]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
SomewhereSomehow, спасибо за опцию, не знал что можно так обманывать сервер.
7 июн 12, 16:47    [12683417]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Shakill,

Так не ВЫ не сервер, а сами себя обманете.

Сообщение было отредактировано: 7 июн 12, 16:54
7 июн 12, 16:53    [12683447]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
pkarklin, я предположил, что этой возможности найдется место при отладке планов без реального наполнения таблиц большими объемами данных. оптимизатор же использует именно его?
7 июн 12, 17:00    [12683497]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Shakill,

Оптимизатор запроса не смотрит на эту вьюху и значение rows, а использует статистику.
7 июн 12, 17:04    [12683523]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
pkarklin
Shakill,

Оптимизатор запроса не смотрит на эту вьюху и значение rows, а использует статистику.



давайте проверим

+ Microsoft SQL Server 2008 (SP3) - 10.0.5770.0 (Intel X86)
create table #a (a int primary key)
insert #a values (1), (2), (3)

create table #b (b int primary key)
insert #b values (7), (2), (3)

-- смотрим план здесь. Nested loop
select *
from #a a
join #b b on b.b = a.a
where b.b > 2

go
update statistics #a with rowcount = 1000000
update statistics #b with rowcount = 1000000
dbcc freeproccache
go
-- смотрим план снова. Merge!
select *
from #a a
join #b b on b.b = a.a
where b.b > 2

7 июн 12, 17:58    [12683888]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Shakill,

И что Вы проверили?!

http://blogs.msdn.com/b/queryoptteam/archive/2006/07/21/674350.aspx

автор
As the name of these options suggest, ROWCOUNT and PAGECOUNT alter the internal metadata of the specified table or index by overriding the counters containing the row and page counts of the object. These counters are in turn read by the Query Optimizer when processing queries that access the table and/or index in question. These commands can basically cheat the Optimizer into thinking that a table or index is extremely large.


Сервер смотрит на internal metadata, а не на rows из sys.partitions, который выставлен наружу.
7 июн 12, 18:11    [12683951]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
pkarklin, я проверил что при помощи этой опции можно задавать это самое rows, неважно где оно хранится, и тем самым влиять на работу оптимизатора и построение плана, о чем я и говорил.

а про вьюху это уже вы за меня додумали
7 июн 12, 18:14    [12683964]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
pkarklin
Сервер смотрит на internal metadata, а не на rows из sys.partitions, который выставлен наружу.
А по вашему rows хранятся в sys.partitions? При обращении к view, rows читаются как раз таки из internal metadata.

А в статистике фактически нет информации о количестве строк.
7 июн 12, 20:17    [12684296]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Mind
А по вашему rows хранятся в sys.partitions? При обращении к view, rows читаются как раз таки из internal metadata. А в статистике фактически нет информации о количестве строк.


Тем не меннее , одним из результатов вывода DBCC SHOW_STATISTICS является Rows (при опции STAT_HEADER).
7 июн 12, 21:28    [12684425]     Ответить | Цитировать Сообщить модератору
 Re: как найти самую длинную таблицу в БД  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Значения которые выводит sys.partitions и dbcc show_statistics разные. И хранятся в разных местах.
То что sys.partitions физически лежит в таблице sysrscols, в колонке rcrows. А то которое выводит dbcc show_statistics лежит в sysobjvalues, в колонке value, так же в ней лежит и другая статистическая информация, которую выводит эта команда, в поле imageval.
У меня есть недопиленная статья, где я делаю изыскания на тему где хранится статистика, и даже напрямую ее модифицирую в порядке хулиганства =) Если интересно, выложу, как только разберусь с блогом.
Касательно оптимизатора - он действительно использует значение из rcrows.
7 июн 12, 22:29    [12684605]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить