10
votes

SQL Server Table Synonymes avec index

J'ai plusieurs bases de données sur une seule instance de SQL Server 2005. J'ai créé un synonyme sur une base de données pour accéder à une table sur une autre base de données et lors de la rédaction de mes requêtes, je voudrais utiliser un index spécifique, cependant, Lors de l'évaluation du plan d'exécution, il ne semble pas l'utiliser. Si j'écris la requête pour accéder à la base de données explicitement, cela fonctionne, mais je n'arrive pas à le faire fonctionner avec un synonyme. Par exemple:

select *
from testdb_synonym with (index(testindex))

|--Clustered Index Scan(OBJECT:([testdb].[dbo].[testtable].[PK_testtable]))


2 commentaires

Pourriez-vous s'il vous plaît poster des plans sous-jacents pour les deux questions? Il suffit d'exécuter Set showplan_text sur Go Select ...


J'ai mis à jour la description pour inclure le plan d'exécution ...


4 Réponses :


2
votes

J'ai testé la même chose et il semble que l'optimiseur de la requête ignore cet indice lorsqu'il est fait via un synonyme. Les détails sont que j'ai fait une touche sélectionnée * contre une table arbitraire avec un indice d'index pour utiliser un index non en cluster. Sans le synonyme, il fait une jointure de boucle de recherche / imbriquée marquée. Avec elle, il fait une balayage de table. Comme il n'y a pas d'options sur la syntaxe Créer synonyme, je ne peux que supposer que l'index d'indice est ignoré. Pas de détails dans Bol sur pourquoi. Je craquerais-le comme une "fonctionnalité".


1 commentaires

J'espérais que ce ne serait pas le cas ... il a été construit comme une caractéristique d'aliasing en faisant partie du bénéfice de celui-ci pour simplifier la notation du point. Je peux comprendre si cela allait contre un serveur distant, mais s'il s'agit d'un serveur local, j'espérais qu'il serait suffisamment intelligent de tirer parti des avantages inhérents.



0
votes

Avez-vous besoin de l'indice dans votre cas? Les recommandations de la SP doivent éviter les indications d'index si elle est possible en raison du fait que peut invalider un plan plus optimisé. Même s'il est optimisé aujourd'hui, il peut être inefficien de demain en raison de la charge de données, etc.

J'ai essayé d'utiliser un synonyme de synonyme dans SQL Server 2008 et obtenez le même plan d'exécution avec le synonyme de synonyme comme avec le nom complet (base de données.schema.table).

J'ai même essayé d'utiliser le synonyme avec un indice d'index et forcé avec succès une recherche d'index non clustered (et une recherche clé pour obtenir le reste des données), et je reçois le même plan d'exécution avec un nom pleinement qualifié.

Votre statisantitique est-elle mise à jour? Avez-vous un index sélectif ou SQL Server pense-t-il qu'il est plus efficace d'utiliser une analyse de table.


0 commentaires

1
votes

avec index code> Les astuces semble être ignorée pour Synonymes.

CREATE SYNONYM syn_master FOR master

SELECT  *
FROM    syn_master WITH (INDEX (wow_i_can_write_everything_here))


1 commentaires

N'est plus vrai pour SQL Server 2008 R2. BTW: Vous créez un synonyme de Master DB, je ne pense pas que cela fonctionnerait (sélectionnez * de Master ??).



5
votes

Ceci est un bug que Microsoft a fixé: voir MS KB 963684

dans Microsoft SQL Server 2005, vous Créer un synonyme pour une table. Vous courez une requête contre le synonyme. La requête Utilise l'optimisation de l'index indice pour forcer Un index. Si vous examinez l'exécution plan généré pour la requête, Vous trouverez peut-être le plan d'exécution Ne pas utiliser l'indice forcé.


0 commentaires