Performance-Problem
Posted on: 15. Juli 2003 - 10:47
Performance-Problem
Hallo,
ich habe eine Tabelle mit ca. 70.000 Datensätzen:
CREATE TABLE [dbo].[BDLeistungsgruppe] (
[Leistungsgruppe_PK] [int] IDENTITY (1, 1) NOT NULL ,
[Auftragsposition_FK] [int] NOT NULL ,
[Preis] [geldwert] NOT NULL )
Leistungsgruppe_PK ist der Primary Key mit einem Clustered Index
Auf Auftragsposition_FK liegt auch ein Index.
Der folgende Delete dauert ca. 4 Sekunden.
DELETE BDLeistungsgruppe
WHERE Auftragsposition_FK IN (SELECT PK FROM #tPosition)
Das erscheint mir doch ziemlich lang, vor allem da auf einer ähnlichen
Tabelle mit gleicher Indexstruktur der gleiche Delete nur Sekundenbruchteile
dauert.
Der Indexoptimierungsassistent schlägt mir keine Änderungen vor.
Kann ich trotzdem noch etwas machen?
Gruß
Ralf
- 143 Aufrufe
Ralf Leippert wrote:
>
> create table #tPosition (PK int primary key)
>
> Ralf
... und wieviele Sätze stehen in der Tabelle?
Einen schönen Tag noch,
Christoph
(Please post ALL replies to the newsgroup only unless indicated otherwise)
"Christoph Muthmann" schrieb im Newsbeitrag
news:ObLOjvsSDHA.1688@TK2MSFTNGP11.phx.gbl...
> Ralf Leippert wrote:
> >
> > create table #tPosition (PK int primary key)
> >
> > Ralf
>
> ... und wieviele Sätze stehen in der Tabelle?
>
> Einen schönen Tag noch,
> Christoph
> (Please post ALL replies to the newsgroup only unless indicated otherwise)
>
>
In der Tabelle sind je nach Fall 0 bis 20 Sätze enthalten.
Gruß
Ralf
Hallo Ralf,
das verwenden von IN (...) als WHERE Kriterium ist
einer der langsamsten Varianten.
Besser ist immer ein JOIN:
Bsp.:
DELETE=20
BDLeistungsgruppe
FROM=20
BDLeistungsgruppe (NOLOCK)
INNER JOIN #tPosition (NOLOCK)
ON BDLeistungsgruppe.Auftragsposition =3D #tPosition.PK=20
Gru=DF
Thomas
http://www.sqlscripter.com
>-----Originalnachricht-----
>Hallo,
>
>ich habe eine Tabelle mit ca. 70.000 Datens=E4tzen:
>CREATE TABLE [dbo].[BDLeistungsgruppe] (
> [Leistungsgruppe_PK] [int] IDENTITY (1, 1) NOT=20
NULL ,
> [Auftragsposition_FK] [int] NOT NULL ,
> [Preis] [geldwert] NOT NULL )
>Leistungsgruppe_PK ist der Primary Key mit einem=20
Clustered Index
>Auf Auftragsposition_FK liegt auch ein Index.
>
>Der folgende Delete dauert ca. 4 Sekunden.
> DELETE BDLeistungsgruppe
> WHERE Auftragsposition_FK IN (SELECT PK FROM=20
#tPosition)
>
>Das erscheint mir doch ziemlich lang, vor allem da auf=20
einer =E4hnlichen
>Tabelle mit gleicher Indexstruktur der gleiche Delete=20
nur Sekundenbruchteile
>dauert.
>Der Indexoptimierungsassistent schl=E4gt mir keine=20
=C4nderungen vor.
>Kann ich trotzdem noch etwas machen?
>
>Gru=DF
>Ralf
>
>
>.
>
Stimmt, aber bei 0 bis 20 Einträgen in der Subquery würde ich trotzdem nicht
_so_ einen großen Unterschied erwarten...
Viele Grüsse,
Marc Höppner
NeoGeo
"Thomas"
wrote in message
news:0c4601c34ae7$db321860$a601280a@phx.gbl...
Hallo Ralf,
das verwenden von IN (...) als WHERE Kriterium ist
einer der langsamsten Varianten.
Besser ist immer ein JOIN:
Bsp.:
DELETE
BDLeistungsgruppe
FROM
BDLeistungsgruppe (NOLOCK)
INNER JOIN #tPosition (NOLOCK)
ON BDLeistungsgruppe.Auftragsposition = #tPosition.PK
Gruß
Thomas
http://www.sqlscripter.com
>-----Originalnachricht-----
>Hallo,
>
>ich habe eine Tabelle mit ca. 70.000 Datensätzen:
>CREATE TABLE [dbo].[BDLeistungsgruppe] (
> [Leistungsgruppe_PK] [int] IDENTITY (1, 1) NOT
NULL ,
> [Auftragsposition_FK] [int] NOT NULL ,
> [Preis] [geldwert] NOT NULL )
>Leistungsgruppe_PK ist der Primary Key mit einem
Clustered Index
>Auf Auftragsposition_FK liegt auch ein Index.
>
>Der folgende Delete dauert ca. 4 Sekunden.
> DELETE BDLeistungsgruppe
> WHERE Auftragsposition_FK IN (SELECT PK FROM
#tPosition)
>
>Das erscheint mir doch ziemlich lang, vor allem da auf
einer ähnlichen
>Tabelle mit gleicher Indexstruktur der gleiche Delete
nur Sekundenbruchteile
>dauert.
>Der Indexoptimierungsassistent schlägt mir keine
Änderungen vor.
>Kann ich trotzdem noch etwas machen?
>
>Gruß
>Ralf
>
>
>.
>
Marc Hoeppner wrote:
> Stimmt, aber bei 0 bis 20 Einträgen in der Subquery würde ich
> trotzdem nicht _so_ einen großen Unterschied erwarten...
>
> Viele Grüsse,
>
> Marc Höppner
> NeoGeo
Eigentlich auch meine Meinung. Was uns jetzt noch fehlt ist die Selektivität
der Spalte Auftragsposition_FK in der Tabelle BDLeistungsgruppe. Also:
Wieviele Sätze würden gelöscht werden?
BTW: Werden die Statistiken aktualisiert? Wurde der geclusterte Index in
letzter Zeit mal neu aufgebaut?
Einen schönen Tag noch,
Christoph
(Please post ALL replies to the newsgroup only unless indicated otherwise)
Hallo Marc, es geht auch nicht um die 20 in der einen,=20
sondern auch um die 70000 in der anderen Tabelle !
F=FChre einfach mal beide Varianten aus und la=DF den=20
Ausf=FChrungsplan anzeigen, wird bei der einen ein=20
TABLESCAN ausgef=FChrt (schlecht), und bei der anderen=20
nicht, siehst du die Unterschiede !
Gru=DF
Thomas
>-----Originalnachricht-----
wrote in message
>Stimmt, aber bei 0 bis 20 Eintr=E4gen in der Subquery=20
w=FCrde ich trotzdem nicht
>_so_ einen gro=DFen Unterschied erwarten...
>
>Viele Gr=FCsse,
>
>Marc H=F6ppner
>NeoGeo
>
>"Thomas"
>news:0c4601c34ae7$db321860$a601280a@phx.gbl...
>Hallo Ralf,
>
>das verwenden von IN (...) als WHERE Kriterium ist
>einer der langsamsten Varianten.
>
>Besser ist immer ein JOIN:
>Bsp.:
>
>DELETE
> BDLeistungsgruppe
>FROM
> BDLeistungsgruppe (NOLOCK)
>
> INNER JOIN #tPosition (NOLOCK)
> ON BDLeistungsgruppe.Auftragsposition =3D #tPosition.PK
>
>
>Gru=DF
>Thomas
>http://www.sqlscripter.com
>
>
>>-----Originalnachricht-----
>>Hallo,
>>
>>ich habe eine Tabelle mit ca. 70.000 Datens=E4tzen:
>>CREATE TABLE [dbo].[BDLeistungsgruppe] (
>> [Leistungsgruppe_PK] [int] IDENTITY (1, 1) NOT
>NULL ,
>> [Auftragsposition_FK] [int] NOT NULL ,
>> [Preis] [geldwert] NOT NULL )
>>Leistungsgruppe_PK ist der Primary Key mit einem
>Clustered Index
>>Auf Auftragsposition_FK liegt auch ein Index.
>>
>>Der folgende Delete dauert ca. 4 Sekunden.
>> DELETE BDLeistungsgruppe
>> WHERE Auftragsposition_FK IN (SELECT PK FROM
>#tPosition)
>>
>>Das erscheint mir doch ziemlich lang, vor allem da auf
>einer =E4hnlichen
>>Tabelle mit gleicher Indexstruktur der gleiche Delete
>nur Sekundenbruchteile
>>dauert.
>>Der Indexoptimierungsassistent schl=E4gt mir keine
>=C4nderungen vor.
>>Kann ich trotzdem noch etwas machen?
>>
>>Gru=DF
>>Ralf
>>
>>
>>.
>>
>
>
>.
>
Stimmt schon, trotzdem hätte ich den Unterschied nicht so groß eingeschätzt.
Da zeigt sich mal wieder, dass man am besten immer Profiled :)
"Thomas"
wrote in message
news:06da01c34b6c$708b89d0$a501280a@phx.gbl...
Hallo Marc, es geht auch nicht um die 20 in der einen,
sondern auch um die 70000 in der anderen Tabelle !
Führe einfach mal beide Varianten aus und laß den
Ausführungsplan anzeigen, wird bei der einen ein
TABLESCAN ausgeführt (schlecht), und bei der anderen
nicht, siehst du die Unterschiede !
Gruß
Thomas
>-----Originalnachricht-----
wrote in message
>Stimmt, aber bei 0 bis 20 Einträgen in der Subquery
würde ich trotzdem nicht
>_so_ einen großen Unterschied erwarten...
>
>Viele Grüsse,
>
>Marc Höppner
>NeoGeo
>
>"Thomas"
>news:0c4601c34ae7$db321860$a601280a@phx.gbl...
>Hallo Ralf,
>
>das verwenden von IN (...) als WHERE Kriterium ist
>einer der langsamsten Varianten.
>
>Besser ist immer ein JOIN:
>Bsp.:
>
>DELETE
> BDLeistungsgruppe
>FROM
> BDLeistungsgruppe (NOLOCK)
>
> INNER JOIN #tPosition (NOLOCK)
> ON BDLeistungsgruppe.Auftragsposition = #tPosition.PK
>
>
>Gruß
>Thomas
>http://www.sqlscripter.com
>
>
>>-----Originalnachricht-----
>>Hallo,
>>
>>ich habe eine Tabelle mit ca. 70.000 Datensätzen:
>>CREATE TABLE [dbo].[BDLeistungsgruppe] (
>> [Leistungsgruppe_PK] [int] IDENTITY (1, 1) NOT
>NULL ,
>> [Auftragsposition_FK] [int] NOT NULL ,
>> [Preis] [geldwert] NOT NULL )
>>Leistungsgruppe_PK ist der Primary Key mit einem
>Clustered Index
>>Auf Auftragsposition_FK liegt auch ein Index.
>>
>>Der folgende Delete dauert ca. 4 Sekunden.
>> DELETE BDLeistungsgruppe
>> WHERE Auftragsposition_FK IN (SELECT PK FROM
>#tPosition)
>>
>>Das erscheint mir doch ziemlich lang, vor allem da auf
>einer ähnlichen
>>Tabelle mit gleicher Indexstruktur der gleiche Delete
>nur Sekundenbruchteile
>>dauert.
>>Der Indexoptimierungsassistent schlägt mir keine
>Änderungen vor.
>>Kann ich trotzdem noch etwas machen?
>>
>>Gruß
>>Ralf
>>
>>
>>.
>>
>
>
>.
>
Hallo Thomas,
beide Möglichkeiten zeigen den gleichen Ausführungsplan und haben die
gleiche Laufzeit.
Ralf
"Thomas"
schrieb im Newsbeitrag
news:0c4601c34ae7$db321860$a601280a@phx.gbl...
Hallo Ralf,
das verwenden von IN (...) als WHERE Kriterium ist
einer der langsamsten Varianten.
Besser ist immer ein JOIN:
Bsp.:
DELETE
BDLeistungsgruppe
FROM
BDLeistungsgruppe (NOLOCK)
INNER JOIN #tPosition (NOLOCK)
ON BDLeistungsgruppe.Auftragsposition = #tPosition.PK
Gruß
Thomas
http://www.sqlscripter.com
>-----Originalnachricht-----
>Hallo,
>
>ich habe eine Tabelle mit ca. 70.000 Datensätzen:
>CREATE TABLE [dbo].[BDLeistungsgruppe] (
> [Leistungsgruppe_PK] [int] IDENTITY (1, 1) NOT
NULL ,
> [Auftragsposition_FK] [int] NOT NULL ,
> [Preis] [geldwert] NOT NULL )
>Leistungsgruppe_PK ist der Primary Key mit einem
Clustered Index
>Auf Auftragsposition_FK liegt auch ein Index.
>
>Der folgende Delete dauert ca. 4 Sekunden.
> DELETE BDLeistungsgruppe
> WHERE Auftragsposition_FK IN (SELECT PK FROM
#tPosition)
>
>Das erscheint mir doch ziemlich lang, vor allem da auf
einer ähnlichen
>Tabelle mit gleicher Indexstruktur der gleiche Delete
nur Sekundenbruchteile
>dauert.
>Der Indexoptimierungsassistent schlägt mir keine
Änderungen vor.
>Kann ich trotzdem noch etwas machen?
>
>Gruß
>Ralf
>
>
>.
>