pipekit/config/modules/pm30300.sql
Paul Trowbridge b855ab91d7 Make the three AP history modules incremental
The Accounts Payable group ran ~9.5 min, 83% of it in four full
reloads. The cost is the GPSERVER linked-server hop, not row volume
(pm30200 managed only ~590 rows/sec), so cutting rows crossing the link
is the whole win. Predicates go inside OPENQUERY to push down to the
remote — a 4-part name would drag the table across before filtering.

  pm30200  own DEX_ROW_TS
  pm30600  changed set: parent PM30200
  pm30300  changed set: PM30200 union PM20000

All three key on (vchrnmbr, doctype), verified exactly unique in
PM30200 at 108,803/108,803. Watermark resolves off gp.pm30200 with a
7-day lookback, so run order within the group must stay pm30200 first
and the lookback must exceed the sync interval.

The two-parent union on pm30300 is load-bearing: 38 rows have a parent
only in the open table, and a PM30200-only join would strand them
permanently. pm30600 needs no union (0 orphans, verified).

pm30700 stays full — 213 of its rows have no parent in either table, so
no changed-set join can reach them, and it only costs 13s. pm20100 and
pm00400 stay full because open and index tables delete rows, which a
delete-by-key incremental structurally cannot propagate (cf. icstt).

391s -> 15s. reconcile.py --super-quick reports IN SYNC for all three.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 00:21:59 -04:00

79 lines
2.7 KiB
SQL

SELECT * FROM OPENQUERY(GPSERVER, '
SELECT
RTRIM(d.[VENDORID]) AS vendorid,
d.[DOCDATE] AS docdate,
d.[DATE1] AS date1,
d.[GLPOSTDT] AS glpostdt,
d.[TIME1] AS time1,
RTRIM(d.[VCHRNMBR]) AS vchrnmbr,
d.[DOCTYPE] AS doctype,
RTRIM(d.[APFRDCNM]) AS apfrdcnm,
d.[ApplyFromGLPostDate] AS applyfromglpostdate,
RTRIM(d.[FROMCURR]) AS fromcurr,
d.[APFRMAPLYAMT] AS apfrmaplyamt,
d.[APFRMDISCTAKEN] AS apfrmdisctaken,
d.[APFRMDISCAVAIL] AS apfrmdiscavail,
d.[APFRMWROFAMT] AS apfrmwrofamt,
d.[ActualApplyToAmount] AS actualapplytoamount,
d.[ActualDiscTakenAmount] AS actualdisctakenamount,
d.[ActualDiscAvailTaken] AS actualdiscavailtaken,
d.[ActualWriteOffAmount] AS actualwriteoffamount,
d.[APFRMEXRATE] AS apfrmexrate,
d.[APFRMDENRATE] AS apfrmdenrate,
d.[APFRMRTCLCMETH] AS apfrmrtclcmeth,
d.[APFRMMCTRXSTT] AS apfrmmctrxstt,
RTRIM(d.[APTVCHNM]) AS aptvchnm,
d.[APTODCTY] AS aptodcty,
RTRIM(d.[APTODCNM]) AS aptodcnm,
d.[APTODCDT] AS aptodcdt,
d.[ApplyToGLPostDate] AS applytoglpostdate,
RTRIM(d.[CURNCYID]) AS curncyid,
d.[CURRNIDX] AS currnidx,
d.[APPLDAMT] AS appldamt,
d.[DISTKNAM] AS distknam,
d.[DISAVTKN] AS disavtkn,
d.[WROFAMNT] AS wrofamnt,
d.[ORAPPAMT] AS orappamt,
d.[ORDISTKN] AS ordistkn,
d.[ORDATKN] AS ordatkn,
d.[ORWROFAM] AS orwrofam,
d.[APTOEXRATE] AS aptoexrate,
d.[APTODENRATE] AS aptodenrate,
d.[APTORTCLCMETH] AS aptortclcmeth,
d.[APTOMCTRXSTT] AS aptomctrxstt,
d.[PPSAMDED] AS ppsamded,
d.[GSTDSAMT] AS gstdsamt,
RTRIM(d.[TAXDTLID]) AS taxdtlid,
d.[POSTED] AS posted,
d.[TEN99AMNT] AS ten99amnt,
d.[RLGANLOS] AS rlganlos,
d.[APYFRMRNDAMT] AS apyfrmrndamt,
d.[APYTORNDAMT] AS apytorndamt,
d.[APYTORNDDISC] AS apytornddisc,
d.[OAPYFRMRNDAMT] AS oapyfrmrndamt,
d.[OAPYTORNDAMT] AS oapytorndamt,
d.[OAPYTORNDDISC] AS oapytornddisc,
d.[Settled_Gain_CreditCurrT] AS settled_gain_creditcurrt,
d.[Settled_Loss_CreditCurrT] AS settled_loss_creditcurrt,
d.[Settled_Gain_DebitCurrTr] AS settled_gain_debitcurrtr,
d.[Settled_Loss_DebitCurrTr] AS settled_loss_debitcurrtr,
d.[Settled_Gain_DebitDiscAv] AS settled_gain_debitdiscav,
d.[Settled_Loss_DebitDiscAv] AS settled_loss_debitdiscav,
d.[Revaluation_Status] AS revaluation_status,
d.[Credit1099Amount] AS credit1099amount,
d.[DEFTEN99TYPE] AS deften99type,
d.[DEFTEN99BOXNUMBER] AS deften99boxnumber,
d.[DEX_ROW_ID] AS dex_row_id
FROM CHG.dbo.PM30300 d
WHERE EXISTS (
SELECT 1 FROM CHG.dbo.PM30200 p
WHERE p.VCHRNMBR = d.VCHRNMBR AND p.DOCTYPE = d.DOCTYPE
AND p.[DEX_ROW_TS] > ''{pm30300_ts}''
)
OR EXISTS (
SELECT 1 FROM CHG.dbo.PM20000 o
WHERE o.VCHRNMBR = d.VCHRNMBR AND o.DOCTYPE = d.DOCTYPE
AND o.[DEX_ROW_TS] > ''{pm30300_ts}''
)
')