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ść.
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.
Podobne pytania
Nowe pytania
sql
Structured Query Language (SQL) to język służący do wykonywania zapytań w bazach danych. Pytania powinny zawierać przykłady kodu, strukturę tabeli, przykładowe dane i znacznik używanej implementacji DBMS (np. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 itp.). Jeśli Twoje pytanie dotyczy wyłącznie konkretnego DBMS (używa określonych rozszerzeń / funkcji), użyj zamiast tego tagu tego DBMS. Odpowiedzi na pytania oznaczone tagiem SQL powinny używać standardu SQL ISO / IEC.