We zien in de actieven queries op SQL Server dat synchronize to een select * from gigabytesofdata doet die zeer lang duurt, terwijl een equivalent (native) merge statement in een paar seconden klaar is.
We hebben een stagingtabel (een beetje data) en een doel-tabel (een tabel van 55 GB op disk).
Het statement:
synchronize gigabytesofdata
from stagingtable
with update or insert
identified
by kolommen, uit, de, primary, key
In de actieve queries zien we, terwijl dit statement bezig is:
select * from gigabytesofdata
En dat hadden we niet verwacht (en dat duurt natuurlijk ook heel lang).
De verwachting is dat voor de synchronisatie alleen naar de data in de staging-tabel gekeken wordt, waarbij records ge-insert worden in gigabytesofdata als records met die key-kolommen daar niet bestaan, en anders ge-update.
Doen we iets verkeerd (zo ja, graag uitleg), of is dit een scenario dat het synchronize statement niet goed afhandelt? Dit synchronize statement lijkt uit de beschrijving namelijk precies wat we nodig hebben!
Het beschreven gedrag is zoals de code momenteel uitgevoerd wordt. Echter, zoals terecht gezegd is het mogelijk om de uitvoering te optimaliseren. In een ander topic is hier al verder op ingegaan:
Als idee voor verbetering. De basis is dat als alleen insert en update gebruikt worden, en het doelplatform ondersteunt server-side filtering, het mogelijk is om de brondataset te analyseren op eigenschappen zoals een beperkt waardenbereik van een datumveld of getal, en alleen een doorsnede op te halen van de doeltabel die voldoet aan deze eigenschappen qua waardenbereik. Dit kan makkelijk duizenden keren sneller zijn als het gaat om bijladen, terwijl het volledig ophalen van de doeltabel dan veel onnodige I/O’s veroorzaakt.
Advies is om in te haken op het idee uit bovenstaande link door daar een reactie achter te laten.
Deze vraag is automatisch gesloten na 2 weken inactiviteit. Het laatste gegeven antwoord is gemarkeerd als oplossing.
Gelieve een nieuwe vraag te stellen via een apart topic als het probleem opnieuw optreedt. Gelieve in de nieuwe vraag een link naar dit topic op te nemen door de URL er van in de tekst te plakken.