Watz
03/05/2021, 4:23 PMWatz
03/05/2021, 7:27 PMrequire(['N/query'],(query)=>{
console.log('start');
var t_total = performance.now();
[39,1043,1143,143].forEach(subsidiaryId =>{
var t_exec = performance.now();
var results = query.runSuiteQL(`
SELECT
T.recordtype AS type,
T.number,
T.trandate AS date,
TL.entity,
C.symbol as "Transaction Currency",
nvl(TAL.debit,0) AS "Debit",
nvl(TAL.credit,0) AS "Credit",
nvl(TL.debitforeignamount,0) AS "Debit (FX)",
nvl(TL.creditforeignamount,0) AS "Credit (FX)",
TL.memo
FROM
transactionLine TL
INNER JOIN "TRANSACTION" T
ON T."ID" = TL."TRANSACTION"
INNER JOIN transactionaccountingline TAL
ON T."ID" = TAL.transaction AND TL.ID = TAL.transactionline
INNER JOIN currency C
ON T.currency = C.id
WHERE
TL.subsidiary = ${subsidiaryId}
AND TAL.account = 115
AND TAL.posting = 'T'
AND ROWNUM <= 5`).asMappedResults();
console.log(`Execution for subsidiary ${subsidiaryId} complete. Time to execute: ${((performance.now()-t_exec)/1000).toFixed(2)}s`);
})
console.log(`end: ${((performance.now()-t_total)/1000).toFixed(2)}s`);
});
With custom (almost admin-role):
start
Execution for subsidiary 39 complete. Time to execute: 3.16s
Execution for subsidiary 1043 complete. Time to execute: 3.09s
Execution for subsidiary 1143 complete. Time to execute: 3.04s
Execution for subsidiary 143 complete. Time to execute: 3.09s
end: 12.39s
With a role that has restrictions on subsidiaries:
start
Execution for subsidiary 39 complete. Time to execute: 39.87s
Execution for subsidiary 1043 complete. Time to execute: 38.98s
Execution for subsidiary 1143 complete. Time to execute: 40.08s
Execution for subsidiary 143 complete. Time to execute: 39.41s
end: 158.34s
Bad SQL? Any ideas are welcome!Watz
03/05/2021, 7:30 PMJoseph Miller
03/05/2021, 10:34 PMtransaction
, transactionline
, and transactionaccountingline
tables. So, try re-ordering your JOINs in increasing levels of cardinality:
FROM
"TRANSACTION" T
INNER JOIN transactionLine TL
ON TL."TRANSACTION" = T."ID"
INNER JOIN transactionaccountingline TAL
ON T."ID" = TAL.transaction AND TL.ID = TAL.transactionline
(We originally had transactionline
as the starting point too, fwiw)
After reordering our query, the performance was back to expected levels, so hopefully this helps. fingers crossedWatz
03/05/2021, 10:40 PMJoseph Miller
03/05/2021, 10:43 PM