diff --git a/content/docs/BestPractices/if-isempty-then-findset/findset-only-after-optimization-query.png b/content/docs/BestPractices/if-isempty-then-findset/findset-only-after-optimization-query.png new file mode 100644 index 00000000..747938c7 Binary files /dev/null and b/content/docs/BestPractices/if-isempty-then-findset/findset-only-after-optimization-query.png differ diff --git a/content/docs/BestPractices/if-isempty-then-findset/findset-only-firstrun-query.png b/content/docs/BestPractices/if-isempty-then-findset/findset-only-firstrun-query.png new file mode 100644 index 00000000..2642951b Binary files /dev/null and b/content/docs/BestPractices/if-isempty-then-findset/findset-only-firstrun-query.png differ diff --git a/content/docs/BestPractices/if-isempty-then-findset/findset-only-full-flow-query.png b/content/docs/BestPractices/if-isempty-then-findset/findset-only-full-flow-query.png new file mode 100644 index 00000000..600cbdbe Binary files /dev/null and b/content/docs/BestPractices/if-isempty-then-findset/findset-only-full-flow-query.png differ diff --git a/content/docs/BestPractices/if-isempty-then-findset/index.md b/content/docs/BestPractices/if-isempty-then-findset/index.md new file mode 100644 index 00000000..19921ec2 --- /dev/null +++ b/content/docs/BestPractices/if-isempty-then-findset/index.md @@ -0,0 +1,82 @@ +--- +title: "if not IsEmpty then FindSet" +tags: ["AL","Performance"] +categories: ["Best Practice"] +--- + +_Created by SosicStefan, Described by SosicStefan_ + +## Introduction + +When retrieving records in Business Central, a common pattern is using `IsEmpty` before calling `FindSet` to check whether data exists. However, this approach is redundant and can lead to unnecessary database queries. Business Central’s runtime already optimizes `FindSet` to avoid unnecessary retrieval operations. + +## Why Not Use 'If Not IsEmpty Then FindSet'? + +The following pattern: + +```al +if not Customer.IsEmpty() then + Customer.FindSet(); +``` + +This introduces inefficiencies due to: +- Redundant checks: Business Central internally wraps FindSet in an IF EXISTS query when repeated on platform level itself. +- Extra queries: Calling IsEmpty separately can lead to duplicate execution of SELECT TOP 1 NULL, slowing down performance. + +## How Business Central Optimizes FindSet + +Consider the following loop: + +```al +internal procedure IsEmptyAndFindSet() +var + Customer: Record Customer; + i: Integer; +begin + for i := 1 to 10 do begin + Customer.SetRange("Country/Region Code", 'RS'); + if not Customer.IsEmpty() then + Customer.FindSet(); + end; +end; +``` + +With this code being executed, Business Central will run two queries on SQL: +- One for checking `IsEmpty` +- Second for getting dataset with `FindSet` + +![image](isempty-then-findset-query.png) + + +## Best Practice: Use FindSet Directly + +Instead of checking `IsEmpty` first, simply use only `FindSet`: +```al +internal procedure FindSetWithoutIsEmpty() +var + Customer: Record Customer; + i: Integer; +begin + for i := 1 to 10 do begin + Customer.SetRange("Country/Region Code", 'RS'); + if Customer.FindSet() then; + end; +end; +``` + +Initially, Business Central runs a normal `SELECT` query to retrieve the data. + +![image](findset-only-firstrun-query.png) + +However, after running this query for three times, on fourth time the system switches to an optimized query: + +![image](findset-only-after-optimization-query.png) + +After optimized query, the platform already applies the `IF EXISTS` logic dynamically. Means that explicitly calling `IsEmpty` before `FindSet` is unnecessary. + +Full query execution looks like this: + +![image](findset-only-full-flow-query.png) + +## Summary +Avoid using if not `IsEmpty` then `FindSet`, as Business Central optimizes `FindSet` at the runtime level. This approach eliminates redundant queries, improves performance, and ensures cleaner code. diff --git a/content/docs/BestPractices/if-isempty-then-findset/isempty-then-findset-query.png b/content/docs/BestPractices/if-isempty-then-findset/isempty-then-findset-query.png new file mode 100644 index 00000000..6d412ad2 Binary files /dev/null and b/content/docs/BestPractices/if-isempty-then-findset/isempty-then-findset-query.png differ