Відповіді:
Це означає, що ви COUNT(any_non_null_column)
отримаєте те саме, що COUNT(*)
і звичайно, оскільки немає значення NULL, які б викликали різниці.
Як правило, COUNT(*)
має бути краще, тому що будь-який індекс може бути використаний, тому що COUNT(column_or_expression)
він не може бути індексований або SARGable
З ANSI-92 (шукайте " Scalar expressions 125
")
Справа:
а) Якщо вказано COUNT (*), то результат - кардинальність T.
b) В іншому випадку нехай TX - це стовпчаста таблиця, яка є результатом застосування <значення виразу> до кожного рядка T та усунення нульових значень. Якщо одне або кілька нульових значень усунене, тоді виконується умова завершення: попереджувальне - нульове значення усувається у встановленій функції.
Ті ж правила принаймні застосовуються і до SQL Server та Sybase
Примітка: COUNT (1) - це те саме, що і COUNT (*), оскільки 1 - це не нульовий вираз.
COUNT(*)
, COUNT(<constant>)
і COUNT(<column name>)
що всі три можуть бути префіксованими ALL
або DISTINCT
(за замовчуванням, ALL
якщо вони відсутні). Мені просто цікаво, який вираз можна використовувати там, де ви говорите _or_expression
?
COUNT(1)
як марний приклад, це те саме, що COUNT(*)
. COUNT(CASE WHEN a>b THEN 1 END)
як приклад, що рахує рядки, де a> b.
У будь-якій останній (тобто 8.x + ) версії Oracle вони роблять те саме . Іншими словами, єдина різниця - семантична:
select count(*) from any_table
легко читається і очевидно, що ви намагаєтеся зробити, і
select count(any_non_null_column) from any_table
важче читати, тому що
any_non_null_column
насправді виконується якnot null
Словом, використовуйтеcount(*)
В останній версії дійсно немає різниці між count (*) та count ( будь-який стовпець , що не є нульовим ), з акцентом на not null :-) Випадково висвітлили цю тему в дописі в блозі: Чи вважається count (col) краще ніж count (*)?
У книзі Керівництва з іспиту з сертифікації професійного сертифікату DBA (Oracle8i) (ISBN 0072130601) на сторінці 78 сказано, що COUNT (1) буде працювати швидше, ніж COUNT (*), тому що певні механізми запускаються в дію для перевірки словника даних на зведеність кожної колонки (або принаймні перший стовпець, що не зводить нанівець) при використанні COUNT (*) . COUNT (1) обходить ці механізми.
MySQL чити для 'SELECT COUNT (1) на tblname;' на таблицях MyISAM, читаючи заголовок таблиці для кількості таблиць. InnoDB рахується кожного разу.
Щоб перевірити, чи буде COUNT (1) працювати швидше, ніж COUNT (*), в аггностичному порядку, просто запустіть наступне та оцініть час роботи для себе:
SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;
Це змушує функцію COUNT працювати на одному рівні рівних рівнів незалежно від двигуна зберігання даних або RDBMS.
count(*)
використовується.