同期してターゲットテーブルから(大量の)データを選択

SQL Serverのアクティブクエリを見ると、synchronize toがselect * from gigabytesofdataを実行しており、これに非常に時間がかかっています。一方、同等の(ネイティブな)merge文であれば数秒で完了します。

ステージングテーブル(少量のデータ)と、ターゲットテーブル(ディスク上で55GBのテーブル)があります。

ステートメントは以下の通りです:

synchronize gigabytesofdata
from        stagingtable
with        update or insert
identified 
by          kolommen, uit, de, primary, key

このステートメントが実行されている間、アクティブクエリに以下が表示されます:

select * from gigabytesofdata

これは予想していませんでした(そして当然、これにも非常に時間がかかります)。

想定していたのは、同期処理ではステージングテーブルのデータのみを参照し、そのキー列を持つレコードがgigabytesofdataに存在しない場合は挿入し、存在する場合は更新する、というものでした。

私たちが何か間違ったことをしているのでしょうか(もしそうなら、説明していただけると助かります)。それとも、これはsynchronizeステートメントがうまく処理できないシナリオなのでしょうか?この説明を見る限り、このsynchronizeステートメントはまさに私たちが必要としているもののように思えるのですが!

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.