Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

4 начина за броене на редове в таблица на SQL Server с плюсове и минуси

Наскоро работех по проект за подобряване на производителността на базата данни. Една съхранена процедура там създаваше проблеми. В своя код заявка попълва Броя на редовете и съхранява стойността в локална променлива. Тази заявка сканираше голяма таблица. Поради това използването на ресурсите стана значително по-високо. За да отстраним проблема, премахнахме дефектния код и използвахме каталожните изгледи на SQL Server, за да генерираме броя на редовете в таблицата.

Има различни начини за преброяване на броя на редовете в таблица на SQL Server. Тази статия ще ги опише, за да можете винаги да избирате правилния начин да го направите.

Можем да получим броя на редовете в таблицата с някой от следните методи:

  1. Използвайте функцията COUNT().
  2. Комбиниране на каталожни изгледи на SQL Server.
  3. Използване на sp_spaceused съхранена процедура.
  4. Използване на 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 със следните динамични изгледи за управление:

  1. sys.tables – попълва списъка с таблици.
  2. sys.indexes – попълва списъка с индекси на таблицата.
  3. 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 процедурата заедно с броя на редовете предоставя следните подробности:

  1. Име – името на таблицата
  2. Редове – Броят на редовете в таблица.
  3. Запазено – общото запазено място за маса.
  4. Данни – общото пространство, използвано от масата.
  5. Размер_индекс – общото пространство, използвано от индекса.
  6. Неизползван – общото запазено пространство за таблица, която не се използва.

Синтаксисът е:

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. По този начин можете да получите необходимите данни във визуален режим без допълнителни усилия.

Заключение

Тази статия обяснява различни подходи за изчисляване на общия брой редове в таблицата, по-специално:

  1. Използване на функцията COUNT.
  2. Комбиниране на различни каталожни изгледи.
  3. Използване на sp_spaceused съхранена процедура.
  4. Използване на SQL Server Management Studio.

Не е необходимо да се придържате само към един метод. Всеки вариант има своите специфики и можете да приложите този, който е най-подходящ във вашата ситуация.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да зададете инвариантната култура, когато използвате FORMAT() в SQL Server

  2. Групово вмъкване на частично цитиран CSV файл в SQL Server

  3. Как да ограничите редовете в набор от резултати на SQL Server

  4. Навигиране в регистрационните файлове за грешки на SQL Server

  5. Инсталирайте SQL Server 2019 на Mac