Datenbank Abfrage sehr langsam! Bitte um Hilfe
Hallo,
Ich habe hier leider ein etwas komisches "Problem" ... Wir haben von der Firma "Mesonic" ein ERP Programm Namens "Winline". Die Datenbank liegt auf einem Server 2012 R2 (MSSQL). Jetzt habe ich für meine Firma ein Statistik/Auswertungsprogramm programmiert welche durch div. SQL-Abfragen Ergebnisse/Statistiken liefert.
Ich Join mit meiner Abfrage 6 Tabellen -> Es ist also eine etwas größere Abfrage. Mein Problem: Bei meiner Abfrage gibt es unter WHERE einen Filter wo ich sagen kann von wann bis wann er die Lieferscheine berechnen soll. Jedes Wirtschaftsjahr liegt in der selben Tabelle und ist nur durch eine spalte "Mesoyear" zu unterscheiden.
Führe ich nun meine Anfrage durch wo ich sage WHERE Ldatum Between '20160201' AND '20170331' AND mesoyear = 2016 dann läuft er hier ca. 1.200.000 Zeilen durch und ist innerhalb von 13 Sekunden fertig. Setze ich aber den Filter auf ein nah gelegenen Zeitraum WHERE Ldatum Between '20170101' AND '20170131' AND mesoyear = 2017 dann dauert diese abfrage ganze 4 MINUTEN für ca. 400.000 Zeilen!!!! es ist 1 zu 1 die selbe abfrage und auch die Tabelle ist 1 zu 1 die selbe! - es unterscheidet sich nur "mesoyear = 2016 oder mesoyear =2017"
Darauf hin habe ich dann einen Wartungsplan am Sql Server angelegt welches die Indexe neu erstellt und Organisiert - jedoch ist es nun schlimmer geworden! Die Abfragen im akuellen zeitraum dauern nun sogar 5 Minuten statt 4 Minuten ... Bitte um Hilfe ... es scheint ein Problem mit den Indizien zu geben... oder?
Bei der SQL-Abfrage-Analyse steht, dass er 95% der Zeit für einen Table-Scan benötigt - wieso benötigt er dies für das alte jahr aber nicht? beim Wartungsplan kann man ja nichts falsch machen oder?
danke
Ich habe hier leider ein etwas komisches "Problem" ... Wir haben von der Firma "Mesonic" ein ERP Programm Namens "Winline". Die Datenbank liegt auf einem Server 2012 R2 (MSSQL). Jetzt habe ich für meine Firma ein Statistik/Auswertungsprogramm programmiert welche durch div. SQL-Abfragen Ergebnisse/Statistiken liefert.
Ich Join mit meiner Abfrage 6 Tabellen -> Es ist also eine etwas größere Abfrage. Mein Problem: Bei meiner Abfrage gibt es unter WHERE einen Filter wo ich sagen kann von wann bis wann er die Lieferscheine berechnen soll. Jedes Wirtschaftsjahr liegt in der selben Tabelle und ist nur durch eine spalte "Mesoyear" zu unterscheiden.
Führe ich nun meine Anfrage durch wo ich sage WHERE Ldatum Between '20160201' AND '20170331' AND mesoyear = 2016 dann läuft er hier ca. 1.200.000 Zeilen durch und ist innerhalb von 13 Sekunden fertig. Setze ich aber den Filter auf ein nah gelegenen Zeitraum WHERE Ldatum Between '20170101' AND '20170131' AND mesoyear = 2017 dann dauert diese abfrage ganze 4 MINUTEN für ca. 400.000 Zeilen!!!! es ist 1 zu 1 die selbe abfrage und auch die Tabelle ist 1 zu 1 die selbe! - es unterscheidet sich nur "mesoyear = 2016 oder mesoyear =2017"
Darauf hin habe ich dann einen Wartungsplan am Sql Server angelegt welches die Indexe neu erstellt und Organisiert - jedoch ist es nun schlimmer geworden! Die Abfragen im akuellen zeitraum dauern nun sogar 5 Minuten statt 4 Minuten ... Bitte um Hilfe ... es scheint ein Problem mit den Indizien zu geben... oder?
Bei der SQL-Abfrage-Analyse steht, dass er 95% der Zeit für einen Table-Scan benötigt - wieso benötigt er dies für das alte jahr aber nicht? beim Wartungsplan kann man ja nichts falsch machen oder?
danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 329600
Url: https://administrator.de/contentid/329600
Ausgedruckt am: 24.11.2024 um 20:11 Uhr
12 Kommentare
Neuester Kommentar
Also erstmal sind das schon ziemlich viele Indexe. Wenn du testen kannst solltest du einmal alle entfernen und nur den für dich wichtigen Index auf mesoyear erstellen. Damit müssten sich beide Abfragen ähnlich verhalten.
Auserdem dachte ich auch an etwas lesbares wie:
CREATE TABLE [dbo].[tabelle_log](
[pk] [uniqueidentifier] NOT NULL,
CONSTRAINT [tabelle_log_pk] PRIMARY KEY CLUSTERED
(
[pk] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
...für die Tabelle und:
ALTER TABLE [dbo].[ruf_log] ADD CONSTRAINT [ruf_log_pk] PRIMARY KEY CLUSTERED
(
[pk] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
...für Indexe. Beides kannst du im SQL Management Studio über Rechtsklick auf das Objekt \ Skript als \ CREATE in erstellen.
Auserdem dachte ich auch an etwas lesbares wie:
CREATE TABLE [dbo].[tabelle_log](
[pk] [uniqueidentifier] NOT NULL,
CONSTRAINT [tabelle_log_pk] PRIMARY KEY CLUSTERED
(
[pk] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
...für die Tabelle und:
ALTER TABLE [dbo].[ruf_log] ADD CONSTRAINT [ruf_log_pk] PRIMARY KEY CLUSTERED
(
[pk] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
...für Indexe. Beides kannst du im SQL Management Studio über Rechtsklick auf das Objekt \ Skript als \ CREATE in erstellen.
Also ein Index für mesoyear und für Ldatum existiert nicht, da ich diese nur im WHERE filtere und für keinen Join benötige
Ein Index dient dazu einen Racord schneller zu finden... egal ob per Where oder per Join Aber ein Index auf c000 exisitert beispielsweiße bereits? ...
Das TSQL von dir erstellt einen Index mit den angegebenen Bestandteilen in der angegebenen Reihenfolge. Leg den Index mal so an, dann wird dann Query flutschen