Filter auf Flowfield dauert ohne SUPER Rolle deutlich länger

12. Februar 2024 18:45

Hi,

kennt jemand dieses spezielle Problem?

Ich habe eine Programmierung innerhalb eines Reports erstellt, welche mittels mehrerer Felder die Artikeltabelle filtert. Unter anderem auch ein FlowField ("Menge in Auftrag" > 0)
Sobald dann das Item.FINDSET folgt, dauert dieser Vorgang bei einem User ohne SUPER Rolle ganze 32 Sekunden (statt 2 Sekunden mit SUPER Rolle). Die Anzahl der Artikel ohne FlowField-Filter beträgt ca. 80.000. Mit "Menge in Auftrag" > 0 sind es nur noch knapp 100.

Wie kann ich dieses Problem beheben?

Es hat eine Weile gedauert, bis ich herausgefunden habe, das das Problem bei den Rollen liegt.
Bei der Suche ist mir aufgefallen, dass eine manuelle Filterung der Artikelübersicht mit den gleichen Filtern aus der Programmierung nicht dieses Performanceproblem verursacht.

Der SQL Profiler zeigt mir folgende Unterschiede bei der SQL Anfrage. Die Anfrage mit der SUPER Rolle ist komplexer und enthält lauter ISNULL Funktionen.

Ohne SUPER Rolle:
Code:
SELECT "timestamp","No_","No_ 2","Description","Search Description","Description 2","Base Unit of Measure",
[...]
FROM "DATABASE".dbo."XYZ GmbH$Item" WITH(READUNCOMMITTED) 
WHERE ("No_">@0 AND ("Vendor No_"=@1 AND "Blocked"=@2 AND ("Auslaufdatum"=@3 OR "Auslaufdatum">=@4) AND "Nicht lieferbar"=@2 AND "Kein Bestellvorschlag"=@2))
ORDER BY "No_" ASC OPTION(OPTIMIZE FOR UNKNOWN, FAST 50)


Mit SUPER Rolle:
Code:
SELECT ISNULL("Item"."timestamp",@6) AS "timestamp",ISNULL("Item"."No_",@7) AS "No_",ISNULL("Item"."No_ 2",@7) AS "No_ 2",ISNULL("Item"."Description",@8) AS "Description",ISNULL("Item"."Search Description",@7) AS "Search Description",ISNULL("Item"."Description 2",@8) AS "Description 2",ISNULL("Item"."Base Unit of Measure",@7) AS "Base Unit of Measure",
[...] 
FROM "DATABASE".dbo."XYZ GmbH$Item" AS "Item" WITH(READUNCOMMITTED)  OUTER APPLY (SELECT TOP (1) ISNULL(SUM("Qty_ on Sales Order$Sales Line"."SUM$Outstanding Qty_ (Base)"),@12) AS "Qty_ on Sales Order$Sales Line$SUM$Outstanding Qty_ (Base)"
FROM "DATABASE".dbo."XYZ GmbH$Sales Line$VSIFT$2" AS "Qty_ on Sales Order$Sales Line" WITH(READUNCOMMITTED,NOEXPAND) 
WHERE (ISNULL("Qty_ on Sales Order$Sales Line"."Document Type",@10)=@16 AND ISNULL("Qty_ on Sales Order$Sales Line"."Type",@10)=@17 AND "Qty_ on Sales Order$Sales Line"."No_"="Item"."No_" AND ISNULL("Qty_ on Sales Order$Sales Line"."Location Code",@7)=@18)) AS "SUB$Qty_ on Sales Order" 
WHERE ("Item"."Vendor No_"=@0 AND "Item"."Blocked"=@1 AND ("Item"."Auslaufdatum"=@2 OR "Item"."Auslaufdatum">=@3) AND "Item"."Nicht lieferbar"=@4 AND "Item"."Kein Bestellvorschlag"=@5) AND (ISNULL("SUB$Qty_ on Sales Order"."Qty_ on Sales Order$Sales Line$SUM$Outstanding Qty_ (Base)",@12)>@19) AND (ISNULL("Item"."No_",@7)>@20)
ORDER BY "No_" ASC OPTION(OPTIMIZE FOR UNKNOWN, FAST 50)


So richtig etwas damit anfangen kann ich nicht. Ich hoffe darauf, dass jemand eine Einstellung kennt, die mir mehr performance für User ohne SUPER Rolle gibt.
:-?

Re: Filter auf Flowfield dauert ohne SUPER Rolle deutlich lä

13. Februar 2024 11:00

Ich konnte das Problem eingrenzen.

Es liegt an der Verwendung eines Sicherheitsfilters in den Berechtigungssätzen. Selbst wenn ein User nicht den entsprechenden Berechtigungssatz verwendet, tritt das Problem auf! Es muss also nur ein Sicherheitsfilter definiert sein und schon hat jeder ohne SUPER das Problem. Egal ob der Sicherheitsfilter für den jeweiligen User überhaupt von Belang ist.
Na klasse!

Re: Filter auf Flowfield dauert ohne SUPER Rolle deutlich lä

13. Februar 2024 13:12

Hi Raik,

ich hätte jetzt auch auf Sicherheitsfilter getippt, dass es aber auch bei Usern auftritt, die den Berechtigungssatz mit dem Sicherheitsfilter NICHT haben, ist natürlich maximal bescheiden.

Vielen Dank für die Recherche!

Re: Filter auf Flowfield dauert ohne SUPER Rolle deutlich lä

13. Februar 2024 14:28

vielleicht kannst du etwas mehr performance rausholen
-> SecurityFiltering

https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/security/security-filters#PerformanceImpact

steht anscheinend by default auf validated - stell das mal für deine Variable, die du via Findset durchrennst, auf filtered

Re: Filter auf Flowfield dauert ohne SUPER Rolle deutlich lä

14. Februar 2024 13:08

Danke sweikelt,

das hatte ich dann auch gefunden und probiert. Leider ohne Erfolg.

Code:
RecordVar.SecurityFiltering := SecurityFilter::<Disallowed|Filtered|Ignored|Validated> 


Ich hatte allerdings erst Zeit das bei einer RecordRef Variable zu machen. Sollte aber kein Unterschied sein.

Was mir noch aufgefallen ist:
Bei meinem Testbenutzer konnte ich den Sicherheitsfilter eindeutig als Problem identifizieren. Sicherheitsfilter entfernt: Schnelle Verarbeitung, wieder reingemacht: war es wieder langsam. Das Ganze habe ich ein paar mal gemacht.
Bei einem weiteren Benutzer blieb das Problem auch nach Entfernung des Sicherheitsfilters bestehen, bis ich dessen Berechtigungen entfernt und erneut hinzugefügt habe. Ggf. ist das noch nötig. Denn beim Testbenutzer hatte ich sowieso mit den Berechtigungen gespielt.