Leistungsdifferenz

04/03/2010 - 13:42 von Tamara Mikes | Report spam
Salü alle zusammen

Wenn ich in einer Tabelle tblZeit rund 1,4 Millionen Datensàtze habe und
eine Spalte ein nvarchar(50) ist, spielt es dann für die
Abfragegeschwindigkeit eine Rolle ob ich direkt diese Tabelle tblZeit
abfrage oder ob ich das über eine Abfrage löse und dabei die nvarchar Spalte
in eine andere Tabelle auslagere und mit einem int in Verbindung setze? Also
dieses Feld normalisiere? Der verwendete Speicherplatz spielt mir keine
Rolle, sondern es geht nur um die Zugriffsgeschwindigkeit.

Variante flach
-
tblZeit
ID(int)
Arbeitsbereich(nvarchar50)



Variante relational
-
tblZeit (1,4 Mio Zeilen)
zID(int)
ArbeitsbereichNr(int)


tblArbeitsbereich (50 Zeilen)
ArbID(int)
Arbeitsbereich(nvarchar50)

viewArbeitsbereich mit Beziehung von ArbId zu ArbeitsbereichNr (1:n)
zID
Arbeitsbereich



Vielen lieben Dank für einige Informationen
Gruss Tamara
 

Lesen sie die antworten

#1 Christoph Muthmann
04/03/2010 - 14:23 | Warnen spam
Tamara Mikes wrote:
Salü alle zusammen

Wenn ich in einer Tabelle tblZeit rund 1,4 Millionen Datensàtze habe
und eine Spalte ein nvarchar(50) ist, spielt es dann für die
Abfragegeschwindigkeit eine Rolle ob ich direkt diese Tabelle tblZeit
abfrage oder ob ich das über eine Abfrage löse und dabei die nvarchar
Spalte in eine andere Tabelle auslagere und mit einem int in
Verbindung setze? Also dieses Feld normalisiere? Der verwendete
Speicherplatz spielt mir keine Rolle, sondern es geht nur um die
Zugriffsgeschwindigkeit.



Hallo Tamara,
so global kann man das nicht sagen. Es kommt schon darauf an, was Du mit der
Tabelle machen willst und wie der Füllgrad des Feldes tatsàchlich ist.

Lagerst Du das Feld in eine andere Tabelle aus, wird jeder Satz in der
ursprünglichen Tabelle kleiner, in Abhàngigkeit vom Füllgrad des Feldes.
Werden die Sàtze kürzer, passen mehr davon auf eine Seite. Aktionen wie
Zugriffe über den gruppierten Index laufen schneller ab, da sie weniger IO
benötigen.

Legst Du also z. B. eine Where-Bedingung über ein verbliebenes Feld in der
Tabelle tblZeit und schrànkst das Ergebnis damit deutlich (< 10%) ein, kann
es aus Sicht des Optimizers Vorteile bringen, gezielt nur noch die
nvarchar-Sàtze zu lesen, die auch benötigt werden.
Schrànkst Du aber Deine Selektion nicht besonders ein, könnte sich der
Optimizer wieder für einen Index Scan oder Full-Table Scan entscheiden,
womit Du jetzt noch den Overhead des Joins hast.
Falls der Zugriff auf das int-Feld in der ausgelagerten Tbelle aber nicht
über einen Index-Scan geht, da der Join der Selektion nicht lückenlos auf
einen Bereich dieses int-Feldes zugreift (was sehr wahrscheinlich ist),
wirst Du in der Regel Full-Table Scans sehen.

Mal es Dir einfach mal auf und schau, welche Zugriffswege Du wàhlen würdest
um das IO zu minimieren.

Falls Du aber überwiegend auf die tblZeit selektierst und nur ganz selten
auch das nvarchar-Feld benötigst, könnte es durchaus Sinn machen.

Um welche Art von Abfrage geht es denn in diesem Fall? Poste dazu am besten
die vollstàndige Tabellenstruktur mit Indizes.

Einen schönen Tag noch,
Christoph
Microsoft SQL Server MVP
http://www.insidesql.org

Ähnliche fragen