Select count (*) ve select count (any_non_null_column) arasındaki fark nedir?


58

(Oracle’da) mutlaklık select count(*) from any_tableile fark arasında bir fark olduğunu hatırlıyorum select count(any_non_null_column) from any_table.

Varsa, bu iki ifade arasındaki farklar nelerdir?

Yanıtlar:


72
  • COUNT (*) NULLS içerecektir
  • COUNT (column_or_expression) yapmaz.

Bu , elbette ki COUNT(any_non_null_column)aynı şeyi verecektir COUNT(*)çünkü farklılıklara neden olacak hiçbir NULL değeri yoktur.

Genel olarak, COUNT(*)daha iyi olmalı çünkü COUNT(column_or_expression)endekslenemeyen veya SARGable olabileceği için herhangi bir endeks kullanılabilir

Gönderen ANSI-92 ( "aramaya Scalar expressions 125")

Durum:

a) Eğer COUNT (*) belirtilmişse, sonuç T’nin önem düzeyidir.

b) Aksi takdirde, TX'in <değer ifadesini> her T satırına uygulamasının ve boş değerleri silmenin sonucu olan tek sütunlu tablo olmasını sağlayın. Bir veya daha fazla boş değer ortadan kaldırılırsa, bir tamamlanma koşulu ortaya çıkar: set işlevinde uyarı değeri ortadan kaldırılır.

Aynı kurallar en azından SQL Server ve Sybase için de geçerli .

Not: COUNT (1), COUNT (*) ile aynıdır, çünkü 1 geri döndürülemez bir ifadedir.


4
Sadece tamlık için: Oracle, kullanılmışsa, boş bir sütun üzerinde dizine alınmış bir tarama count(*)kullanır.
a_horse_with_no_name

Ben üç olası seçenekleri sanıyordum COUNT(*), COUNT(<constant>)ve COUNT(<column name>)her üç öneki edilebileceğini ve ALLya DISTINCT(varsaymak ALLihmal varsa). Sadece söylediğin yerde hangi ifadenin kullanılabileceğini merak ediyorum _or_expression?
birgün,

2
@onedaywhen COUNT(1)işe yaramaz bir örnek olarak, bu aynı şey COUNT(*). COUNT(CASE WHEN a>b THEN 1 END)a> b olduğu satırları sayan bir örnek olarak.
ypercubeᵀᴹ

16

Oracle'ın herhangi bir yeni (yani 8.x + ) sürümünde aynı şeyi yaparlar . Diğer bir deyişle, tek fark anlamsaldır:

select count(*) from any_table

ne yapmaya çalıştığınızı kolayca okunur ve netleştirir ve

select count(any_non_null_column) from any_table

okumak zor çünkü

  1. daha uzun
  2. daha az tanınabilir
  3. any_non_null_columngerçekten zorlanıp uygulanmadığını düşünmelisinnot null

Kısacası, kullanımcount(*)



1

Kitapta Oracle8i Sertifikalı Profesyonel DBA Sertifika Sınavı Kılavuzu (ISBN 0072130601) , sayfa 78 COUNT (1) daha hızlı olduğunu koşmak aslında diyor COUNT (*) belli mekanizmalar her sütunun nullability için veri sözlüğünü kontrol etmek için devreye denir çünkü (ya da en azından COUNT (*) kullanılırken okunamazlığı olan ilk sütun . COUNT (1) bu mekanizmaları atlar.

MySQL 'tblname üzerindeki SELECT COUNT (1);' Tablo sayımı için tablo başlığını okuyarak MyISAM tablolarında. InnoDB her zaman sayılır.

COUNT (1) 'in COUNT (*)' dan daha hızlı çalışıp çalışmadığını bir veritabanı için agnostik şekilde test etmek için aşağıdakini çalıştırın ve çalışma süresini kendiniz için değerlendirin:

SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;

Bu, COUNT işlevinin, depolama motorundan veya RDBMS'den bağımsız olarak aynı seviyede oyun alanında çalışmasını sağlar.


8
Sınav kılavuzu yanlıştır. Oracle'da count (*) = count (1) (en azından sürüm 7'den sonra). Bkz asktom.oracle.com/pls/asktom/... (Zaten @JackPDouglas tarafından başvurulan)
Leigh Riffel

3
İlginç. COUNT (*), ANSI belirtimlerine göre sütunları hiç kontrol etmemelidir.
SO'dan

@gbn, @Leigh Riffel, @bernd_k Özellikle bir süredir Oracle ile birlikte çalışmadığımdan beri beni dinlediğiniz ve daha fazlasını okumamı ve öğrenmemizi hatırlattığınız için teşekkür ederiz.
RolandoMySQLDBA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.