Подтвердить что ты не робот

Как работает sql count?

Я хотел бы понять, как именно работает sql-счет. Это сканирование всей таблицы, которое происходит, или это некоторое свойство таблицы, которая читается. Однако я считаю, что сканирование таблицы будет накладными расходами в случае огромных таблиц с большим количеством записей.

4b9b3361

Ответ 1

В общем случае выполняется либо сканирование таблицы, либо индекса. Это связано главным образом с тем, что в MVCC-поддерживающем процессоре разные транзакции могут видеть разные строки, поэтому нет единого "подсчета строк", который одновременно является правильным для всех.

Аналогично, если у вас есть предложение WHERE, тогда условие where может отличаться для разных клиентов, поэтому они видят разные числа.

Если вам нужно сделать много подсчетов больших таблиц, рассмотрите возможность хранения собственных счетчиков в другой таблице. Именно то, как вы это делаете, полностью зависит от конкретного приложения.

Ответ 2

Это будет зависеть от того, какая реализация SQL вы используете (MS SQL Server, MySQL, Oracle, PostgreSQL и т.д.) и насколько умен умный оптимизатор.

Он также может зависеть от запроса. Например, с чем-то вроде

SELECT COUNT(primary_key) FROM table;

оптимизатор может понять, что нет необходимости сканировать таблицу (поскольку нет фильтрации с помощью WHERE и нет возможности, чтобы любые значения были NULL) и просто вернули размер таблицы. С более сложным запросом (там, где есть фильтрация или возможность NULL), база данных, возможно, придется сканировать таблицу или может сделать некоторую оптимизацию с использованием индекса.

Ответ 3

Это, очевидно, зависит от реализации (то есть разные RDBMS могут использовать разные стратегии), а зависимое от использования (т.е. select count(*) from mytable и select count(*) from mytable where myfield < somevalue) могут использовать разные методы даже в одном и том же БД.

Если вы пытаетесь получить счет на основе некоторого раздела, который уже выражен индексом, интеллектуальные БД попытаются использовать только индекс. Или что-то вроде старого "rushmore", используемого в Foxbase.

Итак, "это зависит", но в конце дня, если нет доступных методов, да, БД выполнит сканирование таблицы.

Ответ 4

Обычно это сканирование индексов, если в таблице нет уникального индекса.

Как ни странно, большинство движков базы данных могут рассчитывать только с помощью сканирования. Они даже предоставляют альтернативные решения для подсчета с использованием табличных метаданных. Например, SQL Server поддерживает SELECT rowcnt FROM sysindexes .... Однако они обычно не на 100% точны.

Ответ 5

YSE COUNT FUNCTION DOSE TABLE SCAN, а не использовать счетчик для таблицы, чтобы получить общее количество строк, которые вы можете использовать:

SELECT
Total_Rows= SUM(st.row_count)
FROM
sys.dm_db_partition_stats st
WHERE
object_name(object_id) = 'TABLENAME' 

или

SELECT sysobjects.[name], max(sysindexes.[rows]) AS TableRows
FROM sysindexes INNER JOIN sysobjects ON sysindexes.[id] = sysobjects.[id]
WHERE sysobjects.xtype = 'U' and sysobjects.[name]='tablename'
GROUP BY sysobjects.[name]
ORDER BY max(rows) DESC

ДРУГОЙ СПОСОБ ПОЛУЧИТЬ ОБЩИЙ СЧЕТ: http://www.codeproject.com/Tips/58796/Number-of-different-way-to-get-total-no-of-row-fro.aspx

Ответ 6

Это зависит от используемой СУБД.

Если есть индекс, должна быть одна строка индекса для каждой строки таблицы. Разумная СУБД, скорее всего, выберет наименьший индекс и посчитает строки индекса.

Наконец, если таблица достаточно мала, она может подсчитывать строки таблицы и обходить индекс.

Ответ 7

В postgreSQL выполняется сканирование таблицы. Я думаю, что это зависит от реализации.

Изменить: См. эта ссылка

Ответ 8

Это действительно неважно!

Я предполагаю, что вам нужно подсчитать количество строк для своего рода поискового вызова... поэтому просто убедитесь, что ваш алгоритм поискового вызова в лучших практиках и забудьте о том, как работает двигатель.

Пусть люди в бизнесе базы данных заботятся об этом, просто следуйте рекомендациям тех, кто является экспертами в используемой вами базе данных.

SQL Server - http://www.4guysfromrolla.com/webtech/042606-1.shtml

Oracle - Пейджинг с Oracle

MySQL - http://php.about.com/od/phpwithmysql/ss/php_pagination.htm