Requêtes de database agrégées conditionnelles et leurs implications en termes de performances

Je pense que cette question est mieux posée avec un exemple: si vous voulez deux counts à partir d'une table – disons un avec toutes les lignes avec un drapeau bit défini sur false et un autre avec tous ceux mis à vrai – y at-il une meilleure pratique pour ce genre de question et quelles sont les implications de performance de toutes les approches qui pourraient être sockets?

Pour développer un peu, et en le basant sur l'article ci-dessous, comment comparer les requêtes séparées à la version avec l'évaluation CASE dans la list SELECT du sharepoint vue des performances? Y a-t-il d'autres methods?

http://www.codeproject.com/Articles/310674/Conditional-Sums-in-SQL-Aggregate-Methods

Autre que la manière de Blam, je pense qu'il y a trois manières fondamentales d'get le résultat désiré. J'ai testé les trois options ci-dessous ainsi que Blam sur mon système. Les résultats que j'ai trouvés étaient les suivants. En outre, à part une remarque, nous n'avions pas de données binarys dans notre système, donc j'ai compté une colonne indexée avec deux valeurs ("H" ou "R").

L'utilisation de la méthode des agrégats conditionnels a permis d'get les performances les plus rapides. L'utilisation du regroupement de Blam avec une méthode agrégée a abouti au deuxième moyen le plus rapide, prenant systématiquement environ 33% de plus que les agrégats conditionnels. La méthode Two Separate Select Statements a été la troisième plus rapide, prenant systématiquement près de 50% de plus que les agrégats conditionnels. Enfin, la méthode Joins a pris le plus de time, et était proche de 1000% plus lente que les agrégats conditionnels. Les jointures étaient attendues (par moi) pour prendre le plus de time que vous vous joignez à cette table plusieurs fois. La raison pour laquelle j'ai inclus cette méthode est parce qu'elle n'a pas été discutée (peut-être pour des raisons évidentes) dans la question; toutes les questions de performance de côté, c'est une option viable, sinon extrêmement lent. Les deux instructions select distinctes ont également du sens lorsque vous exécutez deux agrégats distincts, accédant à cette table deux fois séparément.

Je ne suis pas sûr de ce qui explique les différences entre la méthode des agrégats conditionnels et la méthode de Blam. J'ai toujours été agréablement surpris par la rapidité et la performance des déclarations de cas, et aujourd'hui n'était pas différent.

Je pense que la méthode de déclaration de cas, en dehors des considérations de performance, est probablement la méthode la plus polyvalente. Il vous permet de travailler avec n'importe quel type de champ et facilite la sélection d'un sous-set de valeurs, alors que le regroupement de Blam avec une méthode Aggregate afficherait toutes les valeurs de colonne possibles à less qu'une clause Where ne soit incluse.

Agrégats conditionnels

 Select SUM(Case When bitcol = 1 Then 1 Else 0 End) as True_Count , SUM(Case When bitcol = 0 Then 1 Else 0 End) as False_Count From Table; 

Deux instructions select distinctes

 Select Count(1) as True_Count From Table Where bitcol = 1; Select Count(1) as False_Count From Table Where bitcol = 0; 

Utiliser des jointures

 Select Count(T2.bitcol) as True_Count , Count(T3.bitcol) as False_Count From Table T1 Left Outer Join Table T2 on T1.ID = T2.ID Left Outer Join Table T3 on T1.ID = T3.ID; 
 SELECT [bitCol], count(*) FROM [table] GROUP BY [bitCol] 

Si cette colonne est indexée, il s'agit d'une parsing d'index suivie d'un agrégat de stream.
Doute tu peux faire mieux que ça