bigpoint Geschrieben 10. März 2004 Teilen Geschrieben 10. März 2004 DTS Pakete Ich habe da eine Frage: Also ich habe zwei Tabellen TA und TAA, in der Tabelle TA steht einen Wert jetzt muß ich mit dem Wert in der Tabelle TAA gehen und den Wert wenn nicht in der Tabelle TAA vorhanden inserten und dann noch updeten das Datum auf „unbegrenzt“ Wenn aber vorhanden inserten , Datum von altem Wert auf insert Datum setzen und in neuem Wert auf „unbegrenzt“ setzen. Das ganze habe ich mit cursor gemacht. Wer aber cursor von SQL Server kennt weis dass, die ganze sache nicht grade schnell ist Deswegen überlege ich es mir ob ich nicht dazu einen DTS Paket programmieren soll. Was denkt Ihr wird es mit einem DTS schneller ???? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
just_me Geschrieben 10. März 2004 Teilen Geschrieben 10. März 2004 Was denkt Ihr wird es mit einem DTS schneller ???? Kurze Frage - klare Antwort: yep Die Data Transformation Services (DTS) sind auf das Im- und Exportieren, das Konsolidieren und das Transformieren von Daten spezialisiert. Es ist ihr einziger Lebenszweck. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigpoint Geschrieben 10. März 2004 Autor Teilen Geschrieben 10. März 2004 warum aber sollte ein DTS Paket schneller sein als direk ein SQL auf einem Query ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
just_me Geschrieben 10. März 2004 Teilen Geschrieben 10. März 2004 Weil DTS zunächst einen aufwändigen Optimierungsprozess durchläuft, den du (normalerweise) nicht ausführst. Beispielsweise werden Indizes aktualisiert, die Prozedur vorkompiliert, und verschiedene andere Einstellungen vorgenommen, die einzig der Beschleunigung der Aufgabe dienen --- und all das noch bevor die erste Zeile im- oder exportiert wird. Was mich aber erheblich irritiert, ist die Frage, warum du für einen so einfachen Vorgang, wie du ihn oben beschreibst, einen Cursor verwendest. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigpoint Geschrieben 10. März 2004 Autor Teilen Geschrieben 10. März 2004 Moment, alles was du da oben geschrieben hast passiert genau so im Query ( die Prozedur wird nur einmal kompiliert und zwar beim Erstellung ) aber egal. Wie kannst du es bitte aber ohne Cursor lösen. Da mein Beispiel : CREATE procedure pTest as declare @satz char(1) declare @do_insert tinyint declare @do_update tinyint declare @pws int declare @datum smalldatetime declare @maxdatum datetime declare cur1 cursor FAST_FORWARD for select satz, pws, datum from TA open cur1 fetch next from cur1 into @satz, @pws, @datum while @@fetch_status = 0 begin select @maxdatum = max(datum) from TAA where pws=@pws if (@maxdatum is null or @datum > @maxdatum) begin select @do_insert = 0; select @do_update = 0; if (@satz = 'I') select @do_insert = 1; if (@satz = 'D') select @do_update = 1; if (@satz = 'U') begin select @do_insert = 1; select @do_update = 1; end if (@do_update = 1) begin UPDATE [TAA] SET [GBDatum]=dateadd(day, -1, @datum) WHERE pws=@pws and datum=(select max(datum) from TA aa where aa.pws=@pws) end if (@do_insert = 1) begin INSERT INTO [TAA]([PWS], [Datum], [GBDatum]) SELECT [PWS], [Datum], '31.12.9999' FROM TA ah WHERE ah.pws=@pws and ah.Datum=@datum end end fetch next from cur1 into @satz, @pws, @datum end close cur1 deallocate cur1 GO [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
just_me Geschrieben 10. März 2004 Teilen Geschrieben 10. März 2004 Moment, alles was du da oben geschrieben hast passiert genau so im Query Negative, sir. Tatsächlich wird die Prozedur kompiliert, aber sie wird lediglich mit den Standardoptionen "optimiert". Indizes hingegegen werden nicht aufgefrischt, und ... und ... und Während Queries ihre Daseinsberechtigung haben, wenn es um "schnell mal zwischendurch" geht, sind die DTS darauf geeicht, massenhaft Daten zu verschieben. Ihr ganzer Lebensinhalt ist es, hunderttausende von Datensätzen - so schnell wie irgend möglich - zu sichten, zu konsolidieren, zu transformieren und anschließend an die verschiedensten Ziele zu übertragen. Daher ist es z.B. angebracht, entsprechend den Anforderungen die Isolationslevel anzupassen. Wer macht das in jeder Query? Weiterhin ist es oft angebracht, die Tabelle(n) auf BulkInserts vorzubereiten. Wer macht das in jeder Query? Nicht zuletzt, aber imho ausreichend für eine oberflächliche Darlegung, aktualisiert DTS die Seitenfragmente, um die Tabellen möglichst effektiv lesen und schreiben zu können. Wer macht das in jeder Query? Zu deiner query: Natürlich ist ein Cursor möglich, aber was hältst du davon, dem Optimierer eine Chance zu geben, und die Aufgabe in die eigentlichen zwei Abschnitte einzuteilen, die du ja auch tatsächlich vornimmst? -- vorhandene Daten aktualisieren update taa set gbdatum = (select dateadd(day, -1, datum) from ta where pws = taa.pws) where pws = (select pws from ta where pws = taa.pws and satz in ('D', 'U')) go -- neue Daten eintragen insert into taa (pws, datum, gbdatum) select pws, datum, convert(datetime, '31.12.9999', 104) from ta where pws not in (select pws from taa) and satz in ('I', 'U') goBeide Batches können zusammenhängend ausgeführt werden. Damit werden zunächst alle Daten in taa aktualisiert, wenn sie in beiden Tabellen vorhanden sind. Anschließend werden alle Daten von ta nach taa kopiert, und mit maxDatum versehen, wenn sie dort noch nicht vorhanden sind. (Ist das Attribut "satz" ein notwendiges Attribut, oder handelt es sich lediglich um ein Hilfsattribut?) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.