bcquality/microsoft/knowledge/performance/batch-number-series-instead-of-getnextno-per-row.md
Jesper Schulz-Wedde 4f0a13a801
Promote knowledge for Microsoft review skills (#153)
Move canonical knowledge for Microsoft-owned review domains into the Microsoft layer and document the skill/knowledge co-location policy.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Co-authored-by: Jesper Schulz-Wedde <jesper.schulzwedde@microsoft.com>
Copilot-Session: 2a6ea875-d38e-4f30-aadb-0d606f9be231
2026-09-03 15:06:01 +02:00

1.8 KiB

bc-version domain keywords technologies countries application-area
22..
performance
no-series
getnextno
no-series-batch
savestate
numbersequence
lock
al
w1
all

Batch number-series calls instead of GetNextNo per insert

Contributions welcome — open a PR to refine or extend this article.

Description

Codeunit "No. Series".GetNextNo on a gapless (Normal) series updates and locks the number-series line on every call. A tight Insert loop that asks for a number per row serializes every concurrent writer on that series — the classic SaaS posting bottleneck. Training data still copies the per-row C/AL NoSeriesManagement shape. Series configured with Allow Gaps instead obtain numbers through NumberSequence and do not hold the series-line lock between calls, so they are not affected by this pattern. Codeunit "No. Series - Batch" issues gapless numbers in memory and writes the series line once via SaveState.

Best Practice

Inside a multi-row insert, call "No. Series - Batch".GetNextNo per row and SaveState once after the loop when the series must remain gapless. Use NumberSequence.Next when holes are allowed. Do not replace a single OnInsert GetNextNo for one master record; that path is not the hotspot.

See sample: batch-number-series-instead-of-getnextno-per-row.good.al.

Anti Pattern

NoSeries.GetNextNo(...) inside repeat ... Insert ... until Next() = 0 where the series is gapless (Allow Gaps = false). Each iteration takes the series-line lock. The signal is "No. Series" (not "No. Series - Batch") in a loop that inserts more than one row; do not flag the same pattern when the series has Allow Gaps enabled, as the NumberSequence path already avoids the lock.

See sample: batch-number-series-instead-of-getnextno-per-row.bad.al.