Zum Inhalt springen

DTS Paket


bigpoint

Empfohlene Beiträge

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 ????

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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')

go

Beide 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?)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...