Verständnis Spaltentyp in indizierte Sicht in SQL Server 2008 R2
-
10-10-2019 - |
Frage
Wir haben eine indizierte Sicht durch eine solche SQL:
Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...
Auch nach der Erstellung der Ansicht, setzen wir gruppierten eindeutigen Index für Spalte Table1_ID.
So Ansicht besteht aus zwei Spalten:
Table1_ID
Table2TotalCount
Wir haben zwei Fragen:
- Wenn wir
Count(1)
oderCount_BIG(1)
stattCount_BIG(*)
verwenden, SQL erlaubt uns nicht zu Satz-Index auf Table1_ID - Wie können wir die Art der zweiten Säule steuern (
Table2TotalCount
) - SQL give a lange Nullable in dieser Spalte eingeben. Aber wir wollen Satz int nicht auf NULL festlegbare Typ dieser Spalte. Nach Ansicht erstellen, können wir finden jede mögliche Weise nicht Spaltentyp zu ändern. Auch T-SQL wir für die Erstellung Ansicht verwenden, immer int Werte zu Table2TotalCount .
Lösung
Sie haben COUNT_BIG zu verwenden (*). Es ist eine der Einschränkungen auf eine indizierte Sicht erstellen :
Die SELECT-Anweisung in der Ansicht kann nicht die folgenden Transact-SQL-Syntaxelemente enthalten:
- COUNT (COUNT_BIG (*) erlaubt ist.)
Sie könnten eine zweite Ansicht zu erstellen, die nicht indiziert ist, dass die Referenzen dieser erste Blick, und wirft den Datentyp der Zählspalte auf die gewünschte Art (und möglicherweise verwendet einen ISNULL (), um die Nullable-Eigenschaft zu verhindern)
Andere Tipps
-
Das ist wahrscheinlich, weil Sie auf einem Ausdruck anstelle eines Feldes oder
*
zählen. Mitcount(1)
dem gleichen Ergebnis wiecount(*)
gibt, das heißt die Anzahl der Datensätze zu zählen, so gibt es keinen Grund zur Verwendungcount(1)
. -
Verwenden
count
stattcount_big
int
zu bekommen stattbigint
(lang). (Die Dokumentation sagt ausdrücklich, dass der einzige Unterschied zwischen ihnen ist der Rückgabetyp.) Ich weiß nicht, warum der Wert NULL sein kann alscount
nie null zurück, aber das könnte das gleiche für alle Aggregate sein, und wahrscheinlich nicht möglich Kontrolle.