Ich habe ein Leistungsproblem im Zusammenhang mit SQL Server / Verbindungsservern / Ansichten. Ich hoffe, Sie können mir helfen zu verstehen, wie ich am besten tun kann, was ich will =).
- Ich habe eine Datenbank K mit 3 Verbindungsservern L1, L2, L3 bis 3 Datenbanken X, Y, Z.
- In X, Y, Z i gibt es jeweils 3 Ansichten, die als V1, V2, V3 bezeichnet werden.
- Ich möchte die Vereinigung von V1, V2, V3 nach Datenbank K mit dem Verbindungsserver L1, L2, L3 abfragen.
Nach einigen Tests ist dies die Situation:
- Wenn ich in SSMS diese Pseudoabfrage ausführe, ist
SELECT * FROM (L1.V1 u L2.V2 u L3.V3) WHERE some filters
die Leistung wirklich großartig - Wenn ich eine Ansicht VK in der Datenbank K erstelle, die die Vereinigung der drei Ansichten enthält, und dann die Abfrage ausführe, ist
SELECT * FROM VK WHERE some filters
die Leistung schlechter als in Fall 1
Fragen
- Warum ist die Leistung so unterschiedlich?
- Wie kann ich die Leistung in Fall 2 verbessern?
Ich bin daran interessiert, die Leistung in Fall 2 zu verbessern, da ich eine Ansicht benötige, um sie mit nHbinernate in unserer Software abzubilden ...
Vielen Dank im Voraus, Grüße
UPDATE NACH JOHN ALANS POST
Ok, ich versuche es aber ohne Ergebnisse. Ich bin kein DBA und meine Fähigkeiten zur DB-Konfiguration sind sehr begrenzt. Können wir Schritt für Schritt fortfahren?
Auf dem Remote-Server (
called Y
) habe ich ein neues Konto (called linkedserver
) über Sicherheit-> Anmeldungen-> Neue Anmeldung erstellt. Ich wähle den Anmeldenamen und dann die SQL-Authentifizierung und ein Passwort. für Deafault-Datenbank wähle ichmaster
. In derserver roles
Registerkarte wähle ichpublic
. inUser mapping
Registerkarte ich die beteiligten Datenbanken in Remote - Abfragen und für jeden von ihnen, ich wähledb_ddladmin
undpublic
Rolle. Dann habe ich für jede Datenbank, die an einer Remote-Abfrage beteiligt ist, die effektive Berechtigung für den Benutzer des Verbindungsservers überprüft, und es gibt vieleALTER
und vieleCREATE
Berechtigungen, jedoch nicht SHOW PLAN (dann habe ich auch diese ausgewählt).Auf dem Datenbankserver (
called X
), auf dem der mit Y verbundene Verbindungsserver vorhanden ist, habe ich einen Verbindungsserver (called L1
) erstellt. In der Sicherheits-TAB habe ichlocal user sa
undremote user linkedserver
mit seinem Passwort ausgewählt.
Wenn ich die Abfrage über L1 ohne VIEW ausführe, habe ich ein gutes Ergebnis. Wenn ich die Abfrage in eine VIEW mit geringer Leistung stelle, hat sich nichts geändert ...
Ich glaube, ich habe einen Schritt falsch gemacht, aber ich weiß nicht, wo ...
FÜR BESSERE KLARHEIT
Dies ist die Abfrage, die ich ohne Ansicht über einen Verbindungsserver ausführe:
select * from
(
select * from dolph.agendasdn.dbo.vistaaccettazionegrp
union
select * from dolph.acampanet.dbo.vistaaccettazionegrp
union
select * from municipio.dbnet.dbo.vistaaccettazionegrp
) a
where cognome = 'test' and nome = 'test'
In die Ansicht habe ich nur diesen Code eingefügt
select * from dolph.agendasdn.dbo.vistaaccettazionegrp
union
select * from dolph.acampanet.dbo.vistaaccettazionegrp
union
select * from municipio.dbnet.dbo.vistaaccettazionegrp
dann habe ich angerufen select * from VIEW where cognome = 'test' and nome = 'test'
Damit..
- 1. Fall 0-1 Sekunden.
- 2. Fall> 15 Sekunden ...
Ich finde das absurd!
AUSFÜHRUNGSPLAN
Der Ausführungsplan mit einfacher Abfrage ohne Verwendung einer Ansicht:
den Ausführungsplan mit der Ansicht: