Voisiko joku kertoa minulle eron valitun määrän (*) ja määrän (1) välillä SQL-palvelimessa?


Paras vastaus

Tässä on jo hyviä vastauksia, mutta valitettavasti jotkut ovat väärässä.

1 COUNT: ssa (1) on vain kirjaimellinen vakiolauseke, sillä ei ole mitään tekemistä taulukon sarakkeen 1 kanssa. Se antaa saman vastauksen kuin COUNT (*), ja sillä on sama suoritussuunnitelma. Kysely laskee pienimmän ryhmittymättömän hakemiston rivit minimoidakseen tarvittavan I / O: n.

COUNT (sarake) (tyhjennettävälle sarakkeelle) löytyy laskemalla rivit pienimmässä hakemistossa, joka sisältää Col jos se ei ole missään hakemistossa, tarvitaan taulukon skannaus. Jos Col on ryhmitetyssä avaimessa tai hakemistossa, se on myös osa kaikkia muita hakemistoja, joten pienin ei-klusteroitu hakemisto skannataan pikemminkin kuin klusteroitu taulukon skannaus.

Jos kohdennettu sarake EI OLE NULL, COUNT (Col) on identtinen COUNT (*): n kanssa ja löydetään uudelleen skannaamalla pienin ei-klusteroitu hakemisto, vaikka Col ei olisi missään hakemistossa.

Nämä lauseet perustuvat useiden kyselyjen arvioituihin toteutussuunnitelmiin SQL 2014 -palvelin, vanhempien tai uudempien versioiden kyselyn optimoijat voivat toimia eri tavalla. Saatat huomata, että suoritussuunnitelmien lukemisen oppiminen voi opettaa sinulle paljon enemmän kyselyiden toteuttamisesta kuin yrittää selvittää, mikä täällä lähetetty vastaus on tarkempi.

Vastaus

Parametri funktiolle COUNT on lauseke, joka on arvioitava jokaiselle riville. COUNT-funktio palauttaa niiden rivien määrän, joille lauseke arvioi arvon, joka ei ole nolla. (* on erityinen lauseke, jota ei arvioida, se yksinkertaisesti palauttaa rivien määrän.)

Lausekkeelle on kaksi muuta muokkaajaa: ALL ja DISTINCT. Nämä määrittävät, hylätäänkö kaksoiskappaleet. Koska KOKO on oletusarvo, esimerkkisi on sama kuin määrä (KAIKKI 1), mikä tarkoittaa, että kaksoiskappaleet säilytetään.

Koska lauseke ”1” ei-nolla jokaiselle riville, ja koska eivät poista kaksoiskappaleita, COUNT (1): n tulisi aina palauttaa sama numero kuin COUNT (*).

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *