Chcę zoptymalizować szybkość aktualizacji dziesiątek tysięcy rekordów importowanych z innego systemu. Używam Array DML i wysyłam parametry partiami po 3000.

Obecnie robię coś takiego

MERGE INTO <TABLE>
USING ( SELECT 1 FROM RDB$DATABASE )  <-- This is purely to support the merge syntax
ON TABLE.KEY = :PARAM1
WHEN MATCHED AND TABLE.FIELD1<:PARAM2 THEN
UPDATE SET FIELD1=:PARAM2, FIELD2=:PARAM3
WHEN NOT MATCHED THEN
INSERT (FIELD1,FIELD2,FIELD3,FIELD4) VALUES (:PARAM1,:PARAM2,PARAM3,PARAM4)

SELECT 1 FROM RDB$DATABASE to sposób Firebird v3 na po prostu wybranie cyfry 1, ponieważ nie używam wyniku, ale składnia wymaga sekcji USING, ale wydaje się to trochę zawiłe.

Myślałem o przepisaniu tego jako scenariusza, ale nie sądziłem, że poprawi to szybkość.

0
Richard Shuck 16 grudzień 2019, 19:27
Czy twoje obecne podejście jest zbyt wolne? Co konkretnie oznacza „zbyt wolno”? Oddzielnie z MERGE wynika, że ​​„klucz:param1, pole1:param2 i pole2:param3”, chyba że rekord jest nowy, w takim przypadku „pole1:param1, pole2:param2 i tak dalej”. Czy to literówka?
 – 
pilcrow
16 grudzień 2019, 19:50
1
"Używam Array DML i wysyłam parametry w partiach po 3000.", Firebird 3 i wcześniejsze nie obsługują wykonywania wsadowego, więc to, co jest faktycznie zrobione, jest równoznaczne z wykonaniem 3000 razy. W każdym razie spróbuj wstawić dane do tabeli pomostowej (np. globalnej tabeli tymczasowej) i użyj tej tabeli pomostowej jako źródła dla instrukcji scalania. Lub użyj tabeli zewnętrznej jako źródła.
 – 
Mark Rotteveel
16 grudzień 2019, 21:35

1 odpowiedź

Szukałem kodu, który byłby mniej chwytliwy i pominąłem bezsensowną instrukcję USING, ale po przeszukaniu sieci wydaje się, że jest to najszybszy sposób na przetwarzanie poleceń zbiorczego wstawiania lub aktualizowania, gdy masz już wartości i nie pochodzą one z tabeli.

Mogłem umieścić wszystkie wartości w tabeli pomostowej i użyć jej jako źródła, które chociaż dawało lepiej wyglądające stwierdzenie, podczas testowania prędkość była ogólnie wolniejsza i wymagała ponad 200 tymczasowych tabel pomostowych.

0
Richard Shuck 22 styczeń 2021, 19:22