Zadanie jest takie, że trzeba wstawić ok. 20-50 tys. rekordów do tabel o identycznej strukturze znajdujących się w różnych SZBD (MSSQL, MySQL, Oracle, PostgreSQL) za pomocą wygenerowanego programowo skryptu. I teraz pytanie, czy między tymi SZBD występują różnice w składni INSERT, czy da się wygenerować uniwersalny skrypt dla wszystkich baz?
Z uwagi na liczbę rekordów warto byłoby chyba ze względów czasowych zrobić to w sposób bardziej przemyślany niż ciąg insertów, z których każdy będzie oddzielną transakcją. I tu kolejne pytanie, jak to najbardziej uniwersalnie zrealizować? Bo chyba nie da rady 50 tys. rekordów wrzucić do jednego multirow insert, żeby śmigało wszędzie?
- jeśli masz pole z data/czasem to tu może być problem (np. w oracle najbezpieczniej jest w insercie dać to_date(..))
- różne bazy traktują różne nazwy jako "systemowe" i takie nazwy kolumn/pól trzeba wziąć w specjalne znaki - np. "" albo [] - zwróć uwagę czy np. nie masz nazw pól typu
date
type
itp - nie wiem czy wszystkie bazy stringa przyjmują w pojedynczych apostrofach
- różne bazy mają różnie zrealizowany multi insert - np. oracle ma to zrealizowane całkiem inaczej niż większość :p
- co do samego wstawiania to wstawiaj to w paczkach po 500 - 1000 rekordów i po każdej transakcji commit. Z jednej strony będziesz miał mniej commitów a z drugiej jeden duży też nie jest dobry bo baza sobie musi przecież zapisywać stan dla ew. rollback
Zadanie niezbyt dobrze sprecyzowane, a tym bardziej temat postu nie jest adekwatny do treści.
W jakim standardzie SQL skrypt powinien zostać napisany lub czy można wykorzystywać posiadane narzędzia programistyczne?
Faktycznie nieprecyzyjnie się wyraziłem.
Po prostu chcę wygenerować skrypt zawierający polecenia SQL wstawiające 50 tys. rekordów do bazy i chciałbym, żeby ten sam skrypt mógł być wykorzystany przez różne SZBD. Ale z tego, co napisał Misiekd wynika, że nie da rady tego osiągnąć.
to może inaczej.. generuj skrypt w zależności od rodzaju bazy danych wykorzystując parametry, a dane do wstawienia przechowuj w jakim chcesz formacie :)
Wejdź na stronę http://www.embarcadero.com.pl/tech/webinars/ wyświetl sobie opis FireDac i zobaczysz że jest to możliwe.
dłuższy
Obawiam się, że jednym skryptem wydajnie nie da się tego zrobić. Np. w PostgreSQL robienie tego INSERTami nawet z committem co 1000 rowków i tak będzie dużo mniej wydajne niż jedno wywołanie COPY z pliku csv. Inna rzecz, że 50 tys. rowków to jest tyle co nic. Nawet z committem co rowek to nie powinno trwać dłużej niż pół sekundy, no chyba że w tyych rowkach jakieś duże bloby trzymasz. Co Ty masz w tych rowkach, że się przejmujesz wydajnością?
@dluzszy, dzięki za info, co prawda na stronę dla programistów Delphi nie wejdę, ale może komuś się przyda. Tylko następnym razem patrz proszę na daty postów.
@Krolik, ja po trzech latach nawet nie pamiętam, po co zadałem to pytanie. :) Zdaje się że w tamtych czasach pisałem jakiś programik do migracji danych między różnymi bazami. Teraz pewno użyłbym NHibernate z providerami do różnych baz i nie przejmował się wydajnością, albo poszukał jakichś bulk insertów - skoro jest w MSSQL, to w innych SZBD pewno też.