Laden...

Inner Join killt Performance

Erstellt von Christoph K. vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.275 Views
Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 9 Jahren
Inner Join killt Performance

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

Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 9 Jahren

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.

Gelöschter Account
vor 9 Jahren

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.

1.696 Beiträge seit 2006
vor 9 Jahren

... zusätzlich: man sollte kein select * Abfrage absetzen, da Ressourcen sehr kostbar sind.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 9 Jahren

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?

Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 9 Jahren

Die gleiche Meldung bezüglich des Index erscheint allerdings auch bei den Abfragen die performant laufen.

1.696 Beiträge seit 2006
vor 9 Jahren

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.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 9 Jahren

ja okay, das macht generell Sinn, aber es ist letztendlich nicht der Performance-Killer im aktuellen Fall.

1.696 Beiträge seit 2006
vor 9 Jahren

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.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::