Я хотел бы понять, как именно работает sql-счет. Это сканирование всей таблицы, которое происходит, или это некоторое свойство таблицы, которая читается. Однако я считаю, что сканирование таблицы будет накладными расходами в случае огромных таблиц с большим количеством записей.
Как работает sql count?
Ответ 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