2010-08-17 10 views
5

J'ai une table de données d'adresse dans ma base de données SQL Server. Cette table n'est pas normalisée donc elle contient de nombreuses adresses qui sont répétées. Chaque adresse unique peut être identifiée par un champ Id (ces identifiants se répètent souvent dans le tableau).SQL Server Création Affichage Index qui contient distinct ou groupe par

J'ai donc créé une vue sur la table pour extraire toutes les adresses uniques, en utilisant Select Distinct (AddressId) de la table d'origine.

Maintenant, je voudrais créer un index sur cette vue pour augmenter la vitesse de recherche, mais SQL Server ne me permet pas de créer un index sur la vue car il contient un distinct ou un groupe (j'ai essayé à la fois voir si cela me permettrait de créer un index)

Quelqu'un a-t-il trouvé une solution? ou toutes les vues à un autre moyen de le faire.

J'ai besoin d'interroger cette vue en fonction des mots-clés d'adresse et de renvoyer ceux basés sur le nombre correspondant, j'ai cette requête en place que j'essaye de l'accélérer en indexant des champs dans la vue.

SQL Server 2008

SELECT  
    AddressId, 
    AddressNumber, 
    AddressName, 
    Town, 
     City, 
     Country, 
    COUNT_BIG(*) As AddCount--, 
    --TRIM(AddressNumber + ' ') + LTRIM(AddressName + ' ') + LTRIM(Town + ' ') + RTRIM(City + ' ') AS AddressLookup 
FROM 
    [Address] A 
GROUP BY 
    AddressId, 
    AddressNumber, 
    AddressName, 
    Town, 
    City, 
    Country 

est ma requête ....

si je prends la colonne avec AddressLookup je peux ajouter les index

Vive

+2

SQL Server ne permet 'GROUP BY dans les vues indexées. Quelle version êtes-vous? –

Répondre

1

Vous pouvez utiliser GROUP BY en vues indexées tant que:

Si GROUP BY est spécifié, la liste de sélection de vue doit contenir une expression COUNT_BIG (*) et la définition de vue ne peut pas spécifier HAVING, ROLLUP, CUBE ou GROUPING SETS.

Taken from MSDN

Inclure mais ignoreront simplement la colonne COUNT_BIG nécessaire (*).

+0

lorsque j'utilise le groupe by et count_big (*) si j'obtiens l'erreur suivante en essayant de créer mon index sur la vue: Impossible de créer l'index en cluster 'Idx_AddressId' sur la vue 'AddressLookup' car la liste de sélection de la vue contient une expression sur le résultat de la fonction d'agrégat ou de la colonne de regroupement.Envisagez de supprimer l'expression sur le résultat de la fonction d'agrégat ou de la colonne de regroupement de la liste de sélection. – BBurke

+0

Vous devez utiliser une autre fonction d'agrégation au-delà de 'COUNT_BIG'. Vous ne pourrez pas utiliser les fonctions d'agrégat AVG, MAX, MIN, STDEV, STDEVP, VAR ou VARP. Voir la documentation à laquelle je suis relié pour plus de détails. –

+0

Salut Daniel je n'ai pas d'autres agrégats dans la vue ... comme vous pouvez le voir dans le post quand je concaténer des colonnes en un qui provoque mon problème – BBurke

1

SQL Server autorise GROUP BY dans les vues indexées, même depuis [SQL2000] [1] Êtes-vous sûr de ne pas avoir examiné les restrictions relatives aux vues pouvant être mises à jour?

Après votre modification. Pousser la concaténation dans la table comme une colonne calculée a travaillé pour moi

CREATE TABLE [Address] 
(
    AddressId INT , 
    AddressNumber INT, 
    AddressName VARCHAR(50), 
    Town VARCHAR(50), 
    City VARCHAR(50), 
    Country VARCHAR(50), 
    AddressLookup AS LTRIM(AddressNumber + ' ') + LTRIM(AddressName + ' ') + LTRIM(Town + ' ') + RTRIM(City + ' ') 
) 
GO 

CREATE VIEW AV WITH SCHEMABINDING 
AS 
SELECT  
    AddressId, 
    AddressNumber, 
    AddressName, 
    Town, 
     City, 
     Country, 
    COUNT_BIG(*) As AddCount, 
    AddressLookup 
FROM 
    dbo.[Address] 
GROUP BY 
    AddressId, 
    AddressNumber, 
    AddressName, 
    Town, 
    City, 
    Country, 
    AddressLookup 

    go 

CREATE UNIQUE CLUSTERED INDEX [ix_clustered] ON [dbo].[AV] 
(
    [AddressId] ASC 
) 
+0

je reçois des erreurs en essayant de créer des index mes vues qui a un distinct ou un groupe . Impossible de créer l'index clusterisé 'Idx_AddressId' dans la vue 'AddressLookup' car la liste de sélection de la vue contient une expression sur le résultat de la fonction d'agrégat ou de la colonne de regroupement. Envisagez de supprimer l'expression sur le résultat de la fonction d'agrégat ou de la colonne de regroupement de la liste de sélection. – BBurke

+0

@Cypher - Pouvez-vous poster votre définition de vue? Je pense qu'il a probablement juste besoin d'un léger tweak. –

+0

requête comme ci-dessus, c'est la ligne où j'ajoute les colonnes d'adresses qui empêchent l'ajout de l'index – BBurke

0

Le problème est le nombre de colonnes dans le groupe par.

J'ai réellement 11 colonnes im essayant de grouper par, si je prends l'une de ces colonnes alors tout fonctionne bien.

0

Il est possible d'avoir sur 2 colonnes:

CREATE UNIQUE CLUSTERED INDEX [ix_clustered] ON [dbo].[AV] 
(
    [AddressId] ASC, 
    [CityId] ASC, 
)