type de colonne compréhension vue indexée dans SQL Server 2008 R2
-
10-10-2019 - |
Question
Nous avons créé une vue indexée par cette sql:
Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...
En outre une fois la vue, nous avons mis sur index unique regroupé colonne Table1_ID.
Alors Voir se compose de deux colonnes:
Table1_ID
Table2TotalCount
Nous avons deux questions:
- Si nous utilisons
Count(1)
ouCount_BIG(1)
au lieu deCount_BIG(*)
, SQL ne nous permet pas d'indexer ensemble sur Table1_ID - Comment peut-on contrôler le type de la seconde colonne (
Table2TotalCount
) - SQL donner un longue annulable tapez à cette colonne. Mais nous voulons ensemble int nullable pas de type à cette colonne. Après avoir créé View, nous ne pouvons pas trouver un moyen de changer le type de colonne. Aussi t-sql que nous utilisons pour créer vue, revenir toujours des valeurs int Table2TotalCount .
La solution
Vous devez utiliser COUNT_BIG (*). Il est l'une des restrictions sur la création d'une vue indexée :
L'instruction SELECT dans la vue ne peut pas contenir les éléments de syntaxe Transact-SQL suivantes:
- COUNT (COUNT_BIG (*) est autorisée.)
Vous pouvez créer un second point de vue qui ne sont pas indexées, que les références de cette première vue, et jette le type de données de la colonne de comptage à votre type désiré (et utilise éventuellement un ISNULL () pour empêcher la propriété annulable)
Autres conseils
-
C'est probablement parce que vous comptez sur une expression au lieu d'un champ ou
*
. L'utilisationcount(1)
donne le même résultat quecount(*)
, à savoir compter le nombre d'enregistrements, donc il n'y a aucune raison d'utilisercount(1)
. -
Utilisez
count
au lieu decount_big
pour obtenirint
au lieu debigint
(long). (La documentation dit expressément que la seule différence entre eux est le type de retour.) Je ne sais pas pourquoi la valeur est annulable commecount
ne retourne jamais nulle, mais cela pourrait être la même pour tous les agrégats, et sans doute pas possible de contrôler.