Наскоро работех по проект за подобряване на производителността на базата данни. Една съхранена процедура там създаваше проблеми. В своя код заявка попълва Броя на редовете и съхранява стойността в локална променлива. Тази заявка сканираше голяма таблица. Поради това използването на ресурсите стана значително по-високо. За да отстраним проблема, премахнахме дефектния код и използвахме каталожните изгледи на SQL Server, за да генерираме броя на редовете в таблицата.
Има различни начини за преброяване на броя на редовете в таблица на SQL Server. Тази статия ще ги опише, за да можете винаги да избирате правилния начин да го направите.
Можем да получим броя на редовете в таблицата с някой от следните методи:
- Използвайте функцията COUNT().
- Комбиниране на каталожни изгледи на SQL Server.
- Използване на sp_spaceused съхранена процедура.
- Използване на SQL Server Management Studio.
Нека копаем по-дълбоко.
Вземете броя на редовете с помощта на COUNT(*) или Count(1)
Можем да използваме функцията COUNT(*) или COUNT(1) – резултатите, генерирани от тези две функции, са идентични.
За да получите броя на редовете, нека първо изпълним заявката с помощта на COUNT(*). За демонстрационни цели зададох стойността на STATISTICS IO като ON.
USE wideworldimporters
go
SELECT Count(*)
FROM tblcustomer
go
Изход:
IO статистика:
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 315, page server reads 0, read-ahead reads 276, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Както можете да видите, SQL Server трябва да извърши 691 логически четения, за да удовлетвори резултата.
Сега нека стартираме заявката, използвайки COUNT(1):
USE wideworldimporters
go
SELECT Count(1)
FROM tblcustomer
go
Изход:
IO Статистика:
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 687, page server reads 0, read-ahead reads 687, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Отново SQL Server трябва да извърши 691 логически четения, за да удовлетвори резултата.
Трябва да споменем, че има мнение, че Count (1) е по-бърз от функцията Count (*). Въпреки това, както можете да видите в горните примери, наборите от резултати и IO статистиката са едни и същи. Следователно можете да използвате всеки метод за генериране на броя на редовете на таблиците.
Плюсове:
Функцията COUNT попълва точен брой редове от таблицата.
Против:
Когато изпълните функцията COUNT, тя поставя заключване на масата. Други заявки за достъп до таблицата трябва да изчакат, докато се генерира резултатът. Ако работите в натоварена система с таблица с милиони редове, по-добре избягвайте да изпълнявате функцията COUNT през работното време, освен ако не трябва да попълните точния брой редове в таблицата.
Комбиниране на каталожни изгледи на SQL Server
Можем да използваме каталожни изгледи на SQL Server със следните динамични изгледи за управление:
- sys.tables – попълва списъка с таблици.
- sys.indexes – попълва списъка с индекси на таблицата.
- sys.partitions – попълва редовете на всеки дял.
За да получите броя на редовете, изпълнете следния скрипт:
SELECT a.NAME,
c.NAME,
Sum(b.rows)
FROM sys.tables a
INNER JOIN sys.partitions b
ON a.object_id = b.object_id
INNER JOIN sys.indexes c
ON b.index_id = c.index_id
AND b.object_id = c.object_id
WHERE a.object_id = Object_id('tblCustomer')
AND c.index_id < 2
Изход:
Заявката попълва име на таблица , име на индекса, иобщо редове във всички дялове.
Сега нека прегледаме IO статистиката:
Table 'syssingleobjrefs'. Scan count 3, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysschobjs'. Scan count 0, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysrowsets'. Scan count 2, logical reads 14, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Както можете да видите, заявката извършва само 30 логически четения.
Плюсове:
Този подход е по-бърз от функцията COUNT. Той не придобива заключване на потребителската таблица, така че можете да го използвате в натоварена система.
Против:
Методът попълва приблизителен брой редове. В документацията на Microsoft за sys.partitions можете да видите, че редовете колоната показва приблизителния брой редове за дяловете.
По този начин, ако търсите заявка, която носи резултата по-бързо от функцията COUNT, можете да използвате тази. Резултатът обаче може да е неточен.
Използвайте sp_spaceused
sp_spaceused процедурата заедно с броя на редовете предоставя следните подробности:
- Име – името на таблицата
- Редове – Броят на редовете в таблица.
- Запазено – общото запазено място за маса.
- Данни – общото пространство, използвано от масата.
- Размер_индекс – общото пространство, използвано от индекса.
- Неизползван – общото запазено пространство за таблица, която не се използва.
Синтаксисът е:
EXEC Sp_spaceused 'database_name.schema_name.table_name'
Запитването:
EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer'
Изход:
Използвайте SQL Server Management Studio
За да получим броя на редовете в таблицата, можем да използваме SQL Server Management Studio.
Отворете Студио за управление на SQL Server> Свържете се с екземпляра на базата данни> Разгънете таблици> Щракнете с десния бутон върху tblCustomer> Свойства
ВТаблица Свойства прозорец, щракнете върху Съхранение . Ще видите Брой редове стойност вдясно:
Друга възможност за получаване на броя на редовете в таблица идва с добавката за SQL Complete SSMS. С това подобрение можете да видите приблизителния брой редове в намек, когато задържите курсора на мишката върху име на таблица в прозореца на Object Explorer. По този начин можете да получите необходимите данни във визуален режим без допълнителни усилия.
Заключение
Тази статия обяснява различни подходи за изчисляване на общия брой редове в таблицата, по-специално:
- Използване на функцията COUNT.
- Комбиниране на различни каталожни изгледи.
- Използване на sp_spaceused съхранена процедура.
- Използване на SQL Server Management Studio.
Не е необходимо да се придържате само към един метод. Всеки вариант има своите специфики и можете да приложите този, който е най-подходящ във вашата ситуация.