verwendetes Datenbanksystem: MSSQL
Hallo zusammen,
ich verwende zur Zeit folgenden Query in einer MSSQL-Abfrage
Select * from RankingPassthroughs
Inner Join KeywordPassthroughs on RankingPassthroughs.Id = KeywordPassthroughs.RankingPassthroughId
Inner Join Keywords on KeywordPassthroughs.KeywordId = Keywords.Id
Inner Join KeywordPassthroughRankings on KeywordPassthroughRankings.PassthroughId = KeywordPassthroughs.Id
Inner Join KeywordRankingsUrls on KeywordPassthroughRankings.UrlId = KeywordRankingsUrls.Id
where KeywordPassthroughRankings.DomainId = 88
Der letzte Join sorgt dabei in der Abfrage dafür, dass die Performance extrem in den keller geht (von 0.0 auf über 3 Minuten). Leider kann ich mir nicht erklären warum. In der Tabelle KeywordRankingsUrls befinden sich lediglich ausgelagerte Strings. Ich joine diese Tabelle auch in anderen Queryies, auf eine ähnliche Anzahl von vorherigen Ergebnissen, ohne diese Performance-Einbußse zu haben.
Hat jemand eine Idee, woran das liegen könnte?
Danke
Hier noch einmal zur Verdeutlichung:
Folgender Code läuft nicht performant:
Select * from RankingPassthroughs
Inner Join KeywordPassthroughs on RankingPassthroughs.Id = KeywordPassthroughs.RankingPassthroughId
Inner Join KeywordPassthroughRankings on KeywordPassthroughRankings.PassthroughId = KeywordPassthroughs.Id
Inner Join KeywordRankingsUrls on KeywordPassthroughRankings.UrlId = KeywordRankingsUrls.Id
Inner Join Keywords on KeywordPassthroughs.KeywordId = Keywords.Id
where KeywordPassthroughRankings.DomainId = 88
während sowohl
Select * from RankingPassthroughs
Inner Join KeywordPassthroughs on RankingPassthroughs.Id = KeywordPassthroughs.RankingPassthroughId
Inner Join KeywordPassthroughRankings on KeywordPassthroughRankings.PassthroughId = KeywordPassthroughs.Id
Inner Join Keywords on KeywordPassthroughs.KeywordId = Keywords.Id
where KeywordPassthroughRankings.DomainId = 88
als auch
Select * from RankingPassthroughs
Inner Join KeywordPassthroughs on RankingPassthroughs.Id = KeywordPassthroughs.RankingPassthroughId
Inner Join KeywordPassthroughRankings on KeywordPassthroughRankings.PassthroughId = KeywordPassthroughs.Id
Inner Join KeywordRankingsUrls on KeywordPassthroughRankings.UrlId = KeywordRankingsUrls.Id
where KeywordPassthroughRankings.DomainId = 88
performant laufen.
Du kannst dir im Query Analyzer anschauen welche Strategie vom Pre-Processor angwendet wird. Ich hatte solche Fälle auch schon wo selbst Kleinigkeiten dazu ausreichen das der SQL Server seine Strategie ändert und die Performance auf einmal dropt. Im einfachsten Fall einfach den Query Analyzer Code abändern und "at Hand" ausführen oder die Datenstrukuren anpassen.
... zusätzlich: man sollte kein select * Abfrage absetzen, da Ressourcen sehr kostbar sind.
**:::
Der Query Analyzer meldet:
/*
Fehlende Indexdetails von SQLQuery2.sql - (local)\TEW_SQLEXPRESS.PageRangers (Office-PC\Administrator (53))
Der Abfrageprozessor schätzt, dass durch das Implementieren des folgenden Indexes die Abfragekosten um 96.5767 % verbessert werden können.
\*/
/*
USE [PageRangers]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[KeywordPassthroughRankings] ([DomainId])
INCLUDE ([Id],[Page],[Ranking],[PassthroughId],[UrlId])
GO
\*/
und hat den angehängten Ausführungsplan. Allerdings bin ich nicht wirklich in der Lage mit den Meldungen was anzufangen.
Kann mir jemand helfen?
Die gleiche Meldung bezüglich des Index erscheint allerdings auch bei den Abfragen die performant laufen.
Das sagt dir, dass du einen Index für die Spalte DomainId in der Tabelle KeywordPassthroughRankings anlegen möchtest und das kannst du mit dem vorgeschlagenen Commands durchführen, vorausgesetzt du gibst dem Index auch einen Namen.
Merke dir für die Zukunft, wenn du in WHERE irgendwas brauchst, ist es performanter wenn sie auch einen Index haben.
**:::
ja okay, das macht generell Sinn, aber es ist letztendlich nicht der Performance-Killer im aktuellen Fall.
Doch, schau doch auf das Bild: 87% Kosten, das ist der Killer
BTW.: brauchst du wirklich alle Spalten von allen Tabellen? Ja man ist schreibfaul aber dafür gibt es schon mal Alias für Tabellen und Spalten in der Abfrage und wenn du deine Abfrage in Management Studio zusammenbaust, hilft dir die Intellisense schon gern dabei, so dass der Aufwand für die Tipperei sich in Grenzen hält 😉. Wie gesagt select * macht man nicht.
**:::