С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
12 / 12 / 5
Регистрация: 21.08.2012
Сообщений: 238

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

03.04.2017, 15:02. Показов 3111. Ответов 15

Студворк — интернет-сервис помощи студентам
Добрый день.

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

Количество записей в свойствах таблицы: 4 294 967 296. Такое же количество выводит системная процедура sys.sp_spaceused.
Оператором SELECT выводится 165 строк (как и должно быть).

Подскажите, пожалуйста, на что это может повлиять и как это устранить?

MS SQL Server 2012 Express.

P.S. Нашёл случайно - приложение начало сильно глючить (данные пропадают, иногда подвисает).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2017, 15:02
Ответы с готовыми решениями:

SELECT COUNT(*) количество записей всей таблицы в переменную, как(?
Добрый день! Скажите пожалуйста, как записать в переменную количество одинаковых записей по всей таблице Таблица1 Сорт1 Сорт2 ...

Join разное количество записей в таблицах
у меня несколько таблиц и в одной одна нужная запись (по которой вытягиваются данные остальных записей из таблиц) во второй допустим 5 а в...

Выпадающий список (select) из всех записей таблицы
товарищи, пытаюсь сделать выпадающий список (select) из записей таблицы (название которой breed). у меня поле <select> получается...

15
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
03.04.2017, 15:18
Цитата Сообщение от СергейР Посмотреть сообщение
количество записей, отображаемых в свойствах таблицы и количество записей, выводимых оператором SELECT сильно разное.
шо это было?

Добавлено через 1 минуту
скрипт создания таблицы и результаты
T-SQL
1
select count(*) from MyPleasure
ну и скрипт "SELECT"
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
03.04.2017, 15:35
Цитата Сообщение от pincet Посмотреть сообщение
шо это было?
в Studio и такое есть, правда всегда далекое от истины
Миниатюры
Разное количество записей в свойствах таблицы и выводимое оператором SELECT  
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
03.04.2017, 15:36
правда не в таких диапазонах различие, как у TC
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
03.04.2017, 16:30
Цитата Сообщение от СергейР Посмотреть сообщение
на что это может повлиять
Теоретически на оптимизатор запросов. Результатом будет неоптимальный план выполнения. А на практике сначала нужно выяснить причину такой разницы.
Цитата Сообщение от СергейР Посмотреть сообщение
как это устранить?
T-SQL
1
exec sp_updateusage 'MyTable', 'true';
если не поможет
T-SQL
1
alter table MyTable rebuild;
1
12 / 12 / 5
Регистрация: 21.08.2012
Сообщений: 238
04.04.2017, 07:59  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
T-SQLВыделить код
1
exec sp_updateusage 'MyTable', 'true';
Процедуры sp_updateusage не существует.

Есть такое:
SQL
1
DBCC UPDATEUSAGE (MyBase)
Но это не помогло.

Помогло следующее:
SQL
1
DBCC UPDATEUSAGE (MyBase, MyTable) WITH COUNT_ROUS
Добавлено через 4 минуты
Цитата Сообщение от invm Посмотреть сообщение
А на практике сначала нужно выяснить причину такой разницы.
Как это выяснить?

P.S. Количество записей в таблице постоянное. Но идёт интенсивное обновление записей поштучно по индексированным полям типа Varchar.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
04.04.2017, 11:25
Цитата Сообщение от СергейР Посмотреть сообщение
Процедуры sp_updateusage не существует.
Да, зарапортовался
sp_spaceused, конечно.
Цитата Сообщение от СергейР Посмотреть сообщение
Как это выяснить?
Отловить профайлером запрос, который шлет студия. Далее из запроса найти DMV, которое врет и гуглить про причину вранья.
0
12 / 12 / 5
Регистрация: 21.08.2012
Сообщений: 238
04.04.2017, 13:42  [ТС]
Вот скрипт, который выводит статистику по всем таблицам в базе, в том числе показывает и разницу между фактическим количеством записей и расчётным.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
-- Описывает и исправляет неточности в подсчете страниц и строк в представлениях каталога.
DBCC UPDATEUSAGE (0)
 
IF NOT object_id('tempdb.dbo.#temp') IS NULL
  DROP TABLE dbo.#temp
 
CREATE TABLE #temp (
  TABLE_NAME sysname ,
  ROW_COUNT BIGINT,
  reserved_size VARCHAR(50),
  data_size VARCHAR(50),
  index_size VARCHAR(50),
  unused_size VARCHAR(50)
)
 
SET NOCOUNT ON
 
INSERT #temp
  EXEC sp_msforeachtable 'sp_spaceused ''?'''
 
-- Размер из строки превратить в число
ALTER TABLE #Temp ADD iData_size BIGINT NULL
UPDATE #Temp
  SET iData_size = CAST(REPLACE(data_size, ' KB', '') AS BIGINT)
 
-- Подсчитать фактическое количество записей в каждой таблице
ALTER TABLE #Temp ADD RowCountFact BIGINT NULL
DECLARE @RowCountFact BIGINT = 0, @TableName VARCHAR(128) = ''
DECLARE curTables CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
  FOR SELECT TABLE_NAME FROM #Temp
 
OPEN curTables
FETCH NEXT FROM curTables INTO @TableName
while (@@FETCH_STATUS = 0)                        
BEGIN
  EXEC serv_RowCountTable @TableName, @RowCountFact OUTPUT
  
  UPDATE #Temp
    SET RowCountFact = @RowCountFact
    WHERE TABLE_NAME = @TableName
 
  FETCH NEXT FROM curTables INTO @TableName
END
 
CLOSE curTables
DEALLOCATE curTables
 
-- Вывод результата
SELECT TABLE_NAME, 
       ROW_COUNT, CASE WHEN ROW_COUNT <> RowCountFact THEN RowCountFact - ROW_COUNT ELSE 0 END AS Разница, 
       reserved_size, data_size, index_size, unused_size,
       (SELECT COUNT(*) FROM information_schema.columns b WHERE a.table_name COLLATE database_default = b.table_name COLLATE database_default) AS Кол_во_колонок
  FROM #Temp a
  ORDER BY ROW_COUNT DESC
 
DROP TABLE #temp
С курсором коряво вышло, но с ходу по другому не получилось.

Процедура, возвращающая количество записей для одной таблицы:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE PROCEDURE serv_RowCountTable (
    @p_TableName VARCHAR(128),
  @p_RowCount BIGINT OUTPUT
)
AS BEGIN
    SET NOCOUNT ON;
 
  DECLARE @Query VARCHAR(200) = ''
 
  IF NOT object_id('tempdb.dbo.#tempTableRowCount') IS NULL
    DROP TABLE dbo.#tempTableRowCount
 
  CREATE TABLE dbo.#tempTableRowCount (
    ROW_COUNT BIGINT
  )
 
  SELECT @Query = 'SELECT Count(*) FROM '+ @p_TableName
 
  INSERT dbo.#tempTableRowCount
    EXEC (@Query)
 
  SELECT @p_RowCount = ROW_COUNT FROM dbo.#tempTableRowCount
 
  --SELECT * FROM dbo.#tempTableRowCount
 
  DROP TABLE dbo.#tempTableRowCount
END
Добавлено через 3 минуты
Цитата Сообщение от invm Посмотреть сообщение
Отловить профайлером запрос, который шлет студия. Далее из запроса найти DMV, которое врет и гуглить про причину вранья.
Имеется ввиду запрос, который получает информацию для закладки свойства таблицы?
То же астрономическое значение возвращает процедура sp_spaceused. Буду её копать...
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
04.04.2017, 13:42
Цитата Сообщение от СергейР Посмотреть сообщение
Процедура, возвращающая количество записей для одной таблицы:
а к чему столько манипуляций с #tempTableRowCount?
0
12 / 12 / 5
Регистрация: 21.08.2012
Сообщений: 238
04.04.2017, 13:55  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
а к чему столько манипуляций с #tempTableRowCount?
Подскажите как сделать оптимальнее?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
04.04.2017, 14:12
Цитата Сообщение от СергейР Посмотреть сообщение
Подскажите как сделать оптимальнее?
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE PROCEDURE serv_RowCountTable
    @p_TableName SYSNAME,
  @p_RowCount BIGINT OUTPUT
 
AS BEGIN
    SET NOCOUNT ON;
 
  DECLARE @Query NVARCHAR(200) = ''
 
  SELECT @Query = N'SELECT @Cnt = Count(*) FROM '+ quotename(@p_TableName);
  exec sys.sp_executesql @Query, N'@Cnt bigint output', @p_RowCount output;
 
END
Добавлено через 6 минут
И вообще незачем насиловать сервер и считать точное количество строк. Достаточно приблизительное:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE PROCEDURE serv_RowCountTable
 @p_TableName SYSNAME,
 @p_RowCount BIGINT OUTPUT
 
AS BEGIN
 SET NOCOUNT ON;
 
 select
  @p_RowCount = sum(p.rows)
 from
  sys.partitions p
 where
  p.index_id in (0, 1) and
  p.object_id = object_id(@p_TableName, 'U');
  
END;
1
12 / 12 / 5
Регистрация: 21.08.2012
Сообщений: 238
04.04.2017, 14:37  [ТС]
Ещё одна крупица бесценного опыта в копилку моих знаний

Первый вариант выдал точно такой же результат, как и мой (то есть расхождение выявилось).
А вот второй вариант расхождений не выдал. Так что в плане выявления расхождений второй вариант не подойдёт...
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
04.04.2017, 14:44
СергейР, покажите результат выполнения
T-SQL
1
select @@version
0
12 / 12 / 5
Регистрация: 21.08.2012
Сообщений: 238
04.04.2017, 14:59  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
покажите результат выполнения
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (Intel X86)
Oct 20 2015 15:41:49
Copyright (c) Microsoft Corporation
Express Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
04.04.2017, 15:18
СергейР, в общем, что за чудо у вас там произошло, которое привело к некорректным данным в sys.partitions, мне не ведомо.
Можете, для очистки совести, прогнать DBCC CHECKDB.
0
12 / 12 / 5
Регистрация: 21.08.2012
Сообщений: 238
04.04.2017, 15:29  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
прогнать DBCC CHECKDB.
Прогонял, ошибок не выдаёт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2017, 15:29
Помогаю со студенческими работами здесь

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

Как с помощью Select получить выборку, содержащую номера записей исходной таблицы
Как с помощью Select получить выборку, содержащую номера естественного порядка записей исходной таблицы в MDB базе

Как узнать количество вернувшихся записей SELECT ?
Проблема в следующем мне нужно перед вводом записи узнать есть ли в таблице запись с таким id_zal. использую SQL server 2008 и RAD2010 / ...

Как в jdbc узнать количество записей возвращенных select-ом?
Добрый день! Выполняя executeQuery - получаем ResultSet. И вот здесь можно как-нибудь, не перебирая весь цикл по while...

Нужно вывести определенное количество записей из таблицы. При этом количество вводится в форме в поле
Всем привет, ребят. Запнулся, не знаю уже, что делать. У меня есть форма, в которой указываю значение в поле (например - 100). Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru