ใช้ฟังก์ชันข้อมูลผู้ใช้ใน Fabric คลังข้อมูล (ตัวอย่าง)

นําไปใช้กับ: < / c0 >< c1 / >คลังสินค้าใน Microsoft Fabric

Important

คุณลักษณะนี้อยู่ในตัวอย่าง

ใน Fabric คลังข้อมูล นักพัฒนา T-SQL สามารถเรียกใช้ฟังก์ชันข้อมูลผู้ใช้ Fabric จากคําสั่ง T-SQL ได้ ฟังก์ชันพร็อกซี T-SQL ในคลังข้อมูลจะเรียกใช้ฟังก์ชัน Python ที่อ้างอิงในรายการฟังก์ชันข้อมูลผู้ใช้ที่เผยแพร่

ใช้การผสานรวมนี้เพื่อขยาย T-SQL ด้วยตรรกะ Python ที่นํากลับมาใช้ใหม่ได้สําหรับสถานการณ์เช่น:

  • ใช้แพ็กเกจ PyPI เฉพาะสําหรับงานเชิงพื้นที่ ตัวเลข หรือวิทยาศาสตร์ข้อมูล
  • การนําตรรกะธุรกิจแบบกําหนดเองมาใช้ใน Python
  • การเรียกใช้ API ภายนอก
  • การโต้ตอบกับรายการ Fabric และบริการ Azure อื่น ๆ เช่น คลังสินค้า บ้านพักริมทะเลสาบ ฐานข้อมูล SQL หรือ Cosmos DB

แผนภาพแสดงวิธีที่คลังสินค้าโต้ตอบกับฟังก์ชันข้อมูลผู้ใช้ Fabric โดยเรียกใช้ฟังก์ชันตัวแทนคลังสินค้า

บทความนี้แสดงวิธีการอ้างอิงฟังก์ชันข้อมูลผู้ใช้ที่เผยแพร่จาก Fabric คลังข้อมูล และใช้ในคําสั่ง T-SQL

ข้อกําหนดเบื้องต้น

ในการใช้ฟังก์ชันข้อมูลผู้ใช้จาก Fabric คลังข้อมูล คุณต้องมี:

  • คลังสินค้าผ้า

  • รายการฟังก์ชันข้อมูลผู้ใช้ที่เผยแพร่ซึ่งมีฟังก์ชัน Python ที่คุณต้องการเรียกใช้

  • การเข้าถึงข้อมูลผู้ใช้ ฟังก์ชัน และสิทธิ์ในการเรียกใช้ฟังก์ชันที่เผยแพร่

  • สิทธิ์ในการสร้างฟังก์ชันในคลังสินค้าเป้าหมาย

  • ฟังก์ชัน Python ที่ปฏิบัติตามโมเดลการเขียนโปรแกรมฟังก์ชันข้อมูลผู้ใช้ สําหรับข้อกําหนดไวยากรณ์ ประเภทอินพุตและเอาต์พุตที่รองรับ และการใช้งานของตัวตกแต่ง ดูภาพรวมโมเดลโปรแกรมฟังก์ชันข้อมูลผู้ใช้ Fabric

  • หากคุณต้องการสร้างรายการฟังก์ชันข้อมูลผู้ใช้ใหม่ คุณก็ต้องมีความจุ Fabric ในภูมิภาคที่รองรับ และพื้นที่ทํางาน Fabric ที่กําหนดให้กับความจุนั้นด้วย สําหรับรายละเอียด ดูที่ สร้างรายการฟังก์ชันข้อมูลผู้ใช้ใน Fabric and Service รายละเอียดและข้อจํากัดของฟังก์ชันข้อมูลผู้ใช้ Fabric

สร้างและเผยแพร่ฟังก์ชันข้อมูลผู้ใช้

ก่อนที่คุณจะเรียกใช้ฟังก์ชันข้อมูลผู้ใช้จากคลังข้อมูล ให้สร้างและเผยแพร่ฟังก์ชันนั้นในรายการฟังก์ชันข้อมูลผู้ใช้ สําหรับขั้นตอนทั้งหมดและตัวอย่างฟังก์ชัน Python ดูที่ สร้างรายการฟังก์ชันข้อมูลผู้ใช้ใน Fabric

ฟังก์ชันข้อมูลผู้ใช้ Python ที่คุณสามารถสร้างได้จะแสดงในตัวอย่างต่อไปนี้:

import fabric.functions as fn

udf = fn.UserDataFunctions()

@udf.function()
def hello_fabric(name: str) -> str:
    # Your function logic here
    return name

คุณใช้ชื่อฟังก์ชัน user data เพื่อผูกฟังก์ชันพร็อกซี T-SQL กับฟังก์ชัน Python

สร้างฟังก์ชันพร็อกซี T-SQL

สร้างฟังก์ชัน T-SQL ในคลังข้อมูลของคุณและผูกกับฟังก์ชัน Python ที่เผยแพร่โดยใช้ AS EXTERNAL FUNCTION clause

CREATE OR ALTER FUNCTION dbo.hello_fabric
AS EXTERNAL FUNCTION FunctionSetName.hello_fabric;

แทนที่FunctionSetNameด้วยชื่อของฟังก์ชันข้อมูลผู้ใช้ของคุณ และแทนที่hello_fabricด้วยชื่อของฟังก์ชัน Python ที่เผยแพร่

Tip

คุณสามารถสร้างโค้ดเรียกใช้งานจากประสบการณ์ฟังก์ชันข้อมูลผู้ใช้และใช้เป็นจุดเริ่มต้นสําหรับฟังก์ชันพร็อกซีคลังสินค้า

โดยค่าเริ่มต้น คําสั่ง CREATE FUNCTION จะอนุมานรายการพารามิเตอร์และประเภทที่ส่งกลับจากคํานิยามของ Remote Fabric User Data Function (UDF) คุณสามารถแทนที่ประเภทการคืนค่าที่อนุมานได้โดยระบุอย่างชัดเจนในนิยามฟังก์ชัน การระบุประเภทการคืนค่ามีประโยชน์เมื่อคุณต้องการเปิดเผยชนิดการคืนค่าที่แม่นยํากว่าชนิดที่สรุปได้จากเมตาดาต้าฟังก์ชันระยะไกล

CREATE OR ALTER FUNCTION dbo.hello_fabric
RETURNS VARCHAR(100)
AS EXTERNAL FUNCTION FunctionSetName.hello_fabric;

ตัวอย่างเช่น ค่าที่คืนค่าใน Python str มักจะถูกอนุมานเป็น VARCHAR(MAX)แต่ถ้าฟังก์ชันคืนค่าที่มีความยาวสูงสุดที่ทราบเสมอ คุณสามารถกําหนดประเภทVARCHAR(100)คืนค่าเป็นหรือความยาวที่เหมาะสมอื่น ๆ เพื่อให้ข้อมูลเมตาและประเภทข้อมูลแม่นยํายิ่งขึ้น

ใช้ฟังก์ชันพร็อกซีในคําสั่ง T-SQL

หลังจากสร้างฟังก์ชันพร็อกซีแล้ว ให้เรียกใช้จาก T-SQL เหมือนฟังก์ชันที่ผู้ใช้กําหนดเองอื่น ๆ

ใช้ฟังก์ชันพร็อกซีในนิพจน์คําสั่ง เช่น:

  • SELECT รายการ
  • WHERE ข้อกําหนด
  • GROUP BY ข้อกําหนด
  • การแสดงออกและUPDATEINSERTข้อความ

รูปแบบต่อไปนี้แสดงวิธีการเรียกฟังก์ชันพร็อกซีจากคําสั่งค้นหา:

SELECT dbo.<proxy_function_name>(<arguments>) AS function_result;

สําหรับรูปแบบ Python ขั้นสูง ประเภทที่รองรับ การเชื่อมต่อ และวัตถุบริบท ดูภาพรวมโมเดลโปรแกรมฟังก์ชันข้อมูลผู้ใช้ Fabric

กําหนดค่าการทํางานในโหมดแบตช์

Fabric คลังข้อมูล สามารถรันฟังก์ชันข้อมูลผู้ใช้ภายนอกในโหมดแบตช์ได้

การทํางานในโหมดแบตช์จะส่งการเรียกใช้งานฟังก์ชันหลายรายการในคําขอเดียวไปยังบริการ Fabric User Data Function (UDF) ระยะไกล ช่วยลดภาระเครือข่ายและความหน่วงของคําขอ ชุดงานหนึ่งสามารถบรรจุการเรียกใช้ฟังก์ชันได้สูงสุด 900 รายการ

โหมดแบตช์มักใช้เมื่อฟังก์ชันเดียวกันถูกนําไปใช้กับค่าจากคอลัมน์ตารางหนึ่งหรือมากกว่า ทําให้โปรเซสเซอร์คําค้นสามารถประเมินหลายแถวในการเรียกระยะไกลครั้งเดียวแทนที่จะส่งคําขอแยกสําหรับแต่ละแถว วิธีนี้สามารถปรับปรุงประสิทธิภาพการสืบค้นได้อย่างมาก โดยเฉพาะสําหรับชุดข้อมูลขนาดใหญ่และการเรียกใช้ฟังก์ชันภายนอกที่มีความหน่วงสูง

ตัวอย่างเช่น เมื่อคําสั่งค้นหาใช้ฟังก์ชันข้อมูลผู้ใช้กับทุกค่าในคอลัมน์ Fabric คลังข้อมูล สามารถจัดกลุ่มค่าที่นําเข้าเป็นชุดและส่งรวมกันเพื่อประมวลผลระยะไกล บริการระยะไกลจะส่งผลลัพธ์ชุดที่สอดคล้องกัน ซึ่งจะถูกรวมเข้ากับกระบวนการประมวลผลคําสั่ง

วิธีเปิดใช้งานโหมดแบตช์สําหรับฟังก์ชันข้อมูลผู้ใช้:

  1. เปิดรายการฟังก์ชันข้อมูลผู้ใช้
  2. ไปที่การตั้งค่าการจัดการ>ห้องสมุด
  3. เปิดใช้งานฟีเจอร์ดูตัวอย่าง

ตั้งค่า max_batch_size=900 ในตัว @udf.function() ตกแต่งให้คลังสินค้าสามารถส่งแถวอินพุตได้สูงสุด 900 แถวในแต่ละการเรียกใช้:

Note

อาร์กิวเมนต์นี้จะ max_batch_size ใช้งานได้เฉพาะเมื่อเปิดใช้งานการแสดงตัวอย่างโหมดแบตช์เท่านั้น

import fabric.functions as fn

udf = fn.UserDataFunctions()

@udf.function(max_batch_size=900)
def normalizeText(value: str) -> str:
    return value.strip().lower()

หลังจากที่คุณสร้างฟังก์ชันพร็อกซี T-SQL ที่อ้างอิงฟังก์ชันข้อมูลผู้ใช้ที่เปิดใช้งานแบบแบตช์ (UDF) Fabric คลังข้อมูล จะตรวจจับการกําหนดค่าแบตช์โดยอัตโนมัติ รวมถึงขนาดแบตช์สูงสุดที่กําหนดโดยฟังก์ชันระยะไกล เมื่อรูปแบบคําสั่งรองรับการเป็นกลุ่ม ตัวประมวลผลคําสั่งจะจัดกลุ่มการเรียกฟังก์ชันหลายรายการเป็นชุดและส่งไปยังบริการระยะไกลเพื่อดําเนินการแทนการส่งคําขอแยกสําหรับแต่ละแถว

แสดงฟังก์ชันข้อมูลผู้ใช้ในคลังสินค้า

ฟังก์ชันข้อมูลผู้ใช้ที่คุณสร้างด้วยAS EXTERNAL FUNCTIONจะปรากฏในsys.objectsประเภทวัตถุXF

หากต้องการแสดงฟังก์ชันข้อมูลผู้ใช้ในคลังข้อมูล ให้กรอง sys.objects ด้วย type = 'XF'.

SELECT SCHEMA_NAME(schema_id) AS schema_name, name, object_id, type, type_desc
FROM sys.objects
WHERE type = 'XF';

เพื่อแสดงรายการฟังก์ชันสเกลาร์ปกติ (FN) และฟังก์ชันข้อมูลผู้ใช้ (XF) พร้อมกับลายเซ็นพารามิเตอร์และชนิดการส่งกลับ ให้ใช้ sys.parameters และ sys.types:

WITH metadata AS
(
    SELECT o.schema_id, o.object_id, o.name, p.parameter_id, p.name AS parameter_name, t.name AS type_name
    FROM sys.objects AS o
    INNER JOIN sys.parameters AS p
        ON p.object_id = o.object_id
    INNER JOIN sys.types AS t
        ON t.user_type_id = p.user_type_id
    WHERE o.type IN ('FN', 'XF')
),
signature AS
(
    SELECT SCHEMA_NAME(schema_id) AS schema_name,
           name,
           ANY_VALUE(
               CASE WHEN parameter_id = 0 THEN type_name END
           ) AS return_type,
           CONCAT(
               SCHEMA_NAME(schema_id),
               '.',
               name,
               '(',
               STRING_AGG(
                   CASE
                       WHEN parameter_id > 0
                       THEN CONCAT(parameter_name, ' ', type_name)
                   END,
                   ', '
               ) WITHIN GROUP (ORDER BY parameter_id),
               ') -> ',
               MAX(CASE WHEN parameter_id = 0 THEN type_name END)
           ) AS signature
    FROM metadata
    GROUP BY schema_id, object_id, name
)
SELECT *
FROM signature;

หมายเหตุ

  • ฟังก์ชันพร็อกซี T-SQL ขึ้นอยู่กับรายการฟังก์ชันข้อมูลผู้ใช้ที่เผยแพร่และชื่อฟังก์ชัน หากคุณเปลี่ยนชื่อหรือลบฟังก์ชัน Python ให้อัปเดตฟังก์ชันพร็อกซีคลังสินค้าตามนั้น
  • โมเดลการเขียนโปรแกรมฟังก์ชันข้อมูลผู้ใช้กําหนดประเภทอินพุตและเอาต์พุตที่รองรับ ตรวจสอบว่าพารามิเตอร์ Python และคําอธิบายประกอบที่ส่งกลับรองรับค่าที่คําสั่ง T-SQL ของคุณผ่าน
  • ฟังก์ชันข้อมูลผู้ใช้มีขีดจํากัดของขนาดภาระงานคําขอ, เวลาหมดอายุในการดําเนินการ, ขนาดการตอบสนอง, ขนาดไลบรารี และการเก็บบันทึก สําหรับขีดจํากัดปัจจุบัน โปรดดูรายละเอียดบริการและข้อจํากัดของฟังก์ชันข้อมูลผู้ใช้ Fabric
  • ชื่อพารามิเตอร์ต้องใช้ camelCase และต้องมีคําอธิบายประเภท ฟังก์ชันที่ตกแต่งด้วย @udf.function() ต้องระบุประเภทการคืนค่าด้วย สําหรับกฎไวยากรณ์ฉบับสมบูรณ์ ดูภาพรวมโมเดลการเขียนโปรแกรมฟังก์ชันข้อมูลผู้ใช้ Fabric
  • สําหรับฟังก์ชันแปลงข้อความในตัวที่ไม่ต้องใช้โค้ด Python แบบกําหนดเอง ดูที่ ใช้ฟังก์ชัน AI (ตัวอย่าง)
  • ฟังก์ชันข้อมูลผู้ใช้มีขีดจํากัดของขนาดภาระงานคําขอ, เวลาหมดอายุในการดําเนินการ, ขนาดการตอบสนอง, ขนาดไลบรารี และการเก็บบันทึก สําหรับขีดจํากัดปัจจุบัน โปรดดูรายละเอียดบริการและข้อจํากัดของฟังก์ชันข้อมูลผู้ใช้ Fabric
  • ชื่อพารามิเตอร์ต้องใช้ camelCase และต้องมีคําอธิบายประเภท ฟังก์ชันที่ตกแต่งด้วย @udf.function() ต้องระบุประเภทการคืนค่าด้วย สําหรับกฎไวยากรณ์ฉบับสมบูรณ์ ดูภาพรวมโมเดลการเขียนโปรแกรมฟังก์ชันข้อมูลผู้ใช้ Fabric
  • สําหรับฟังก์ชันแปลงข้อความในตัวที่ไม่ต้องใช้โค้ด Python แบบกําหนดเอง ดูที่ ใช้ฟังก์ชัน AI (ตัวอย่าง)

ตัวอย่าง

สถานการณ์ต่อไปนี้แสดงวิธีการทั่วไปในการขยาย Fabric คลังข้อมูล ด้วยฟังก์ชันข้อมูลผู้ใช้

ตอบ ขยาย T-SQL ด้วยการแยกวิเคราะห์ที่อยู่ IP

ใช้ฟังก์ชันข้อมูลผู้ใช้ Python เมื่อการค้นหาคลังข้อมูลของคุณต้องการฟังก์ชันที่ไม่มีในฟังก์ชัน T-SQL ที่มีอยู่ในตัว ตัวอย่างเช่น คุณสามารถใช้แพ็กเกจที่อยู่ IP เพื่อคืนค่าซับเน็ตสําหรับที่อยู่ IP คุณสามารถใช้ฟังก์ชันนี้เป็นชุดเมื่อคําสั่งค้นหาประมวลผลที่อยู่ IP จากหลายแถว สําหรับขั้นตอนการกําหนดค่า ดูที่ กําหนดค่าโหมดแบตช์

Note

หากฟังก์ชันใช้แพ็กเกจที่ไม่ได้เป็นส่วนหนึ่งของไลบรารีมาตรฐาน Python ให้เพิ่มแพ็กเกจในการจัดการไลบรารีก่อนที่จะเผยแพร่ฟังก์ชันข้อมูลผู้ใช้ ตัวอย่างนี้ใช้แพ็กเกจnetaddr

กําหนดและเผยแพร่ฟังก์ชัน Python ในรายการฟังก์ชันข้อมูลผู้ใช้:

from netaddr import IPNetwork
import fabric.functions as fn

udf = fn.UserDataFunctions()

@udf.function(max_batch_size=900)
def ipSubnet(ipAddress: str, prefixLength: int = 24) -> str:
    return str(IPNetwork(f"{ipAddress}/{prefixLength}").cidr)

สร้างฟังก์ชันพร็อกซี T-SQL ในคลังข้อมูลที่อ้างอิงฟังก์ชัน Python ที่เผยแพร่:

CREATE OR ALTER FUNCTION dbo.ip_subnet
AS EXTERNAL FUNCTION inet.ipSubnet;

เรียกใช้ฟังก์ชันพร็อกซีจากคําสั่งคลังสินค้า:

SELECT dbo.ip_subnet('192.168.1.25', 24) AS subnet;

ผลลัพธ์ที่คาดหวัง:192.168.1.0/24

B. เรียกใช้ API สาธารณะภายนอก

ใช้ฟังก์ชันข้อมูลผู้ใช้เมื่อการสืบค้นคลังข้อมูลจําเป็นต้องเรียกใช้ API ภายนอกเป็นส่วนหนึ่งของเวิร์กโฟลว์การเพิ่มความเข้มข้นของข้อมูล

ใน SQL database in Fabric, Azure SQL Database และ Azure SQL Managed Instance sys.sp_invoke_external_rest_endpoint จะเรียกใช้ HTTPS REST endpoint ใน Fabric คลังข้อมูล ฟังก์ชันข้อมูลผู้ใช้สามารถสร้างรูปแบบทางเลือกโดยการห่อหุ้มการเรียก HTTPS ใน Python และเปิดเผยไปยัง T-SQL ผ่านฟังก์ชันพร็อกซี

ข้อควรระวัง

การโทรหาอุปกรณ์ปลายทางภายนอกสามารถโอนย้ายข้อมูลออกนอกคลังสินค้าของคุณได้ ใช้อุปกรณ์ปลายทางที่ได้รับอนุมัติ หลีกเลี่ยงการส่งข้อมูลที่ละเอียดอ่อนเว้นแต่จะได้รับอนุญาต และปฏิบัติตามข้อกําหนดด้านความปลอดภัยและการปฏิบัติตามข้อกําหนดขององค์กรของคุณ

Note

เพิ่มไลบรารีของบุคคลที่สามที่จําเป็น เช่น requests, ใน การจัดการไลบรารี ก่อนเผยแพร่ฟังก์ชัน

กําหนดและเผยแพร่ฟังก์ชัน Python ในรายการฟังก์ชันข้อมูลผู้ใช้ ตัวอย่างนี้ใช้ชื่อพารามิเตอร์ที่ sys.sp_invoke_external_rest_endpointคล้ายกับ :

import json
import requests
import fabric.functions as fn

udf = fn.UserDataFunctions()

@udf.function()
def invokeExternalRestEndpoint(
    url: str,
    method: str = "GET",
    payload: str | None = None,
    headers: str | None = None,
    timeout: int = 30
) -> str:
    requestHeaders = json.loads(headers) if headers else None
    requestPayload = payload if payload else None

    response = requests.request(
        method=method,
        url=url,
        data=requestPayload,
        headers=requestHeaders,
        timeout=timeout
    )
    response.raise_for_status()
    return response.text

สร้างฟังก์ชันพร็อกซี T-SQL ในคลังสินค้า:

CREATE OR ALTER FUNCTION dbo.invoke_external_rest_endpoint
AS EXTERNAL FUNCTION api.invokeExternalRestEndpoint;

เรียกใช้ฟังก์ชันพร็อกซีจากคําสั่งคลังสินค้า:

SELECT dbo.invoke_external_rest_endpoint(
    'https://ipapi.co/8.8.8.8/country_name/',
    'GET',
    NULL,
    NULL,
    30
) AS response;

C. ใช้ระยะเวลาการเก็บรักษาที่ปรับแต่งได้

ใช้ฟังก์ชันข้อมูลผู้ใช้เมื่อการสืบค้นคลังสินค้าต้องการค่าการกําหนดค่าที่จัดการจากศูนย์กลางจากไลบรารีตัวแปร Fabric ตัวอย่างเช่น เก็บช่วงเวลาการเก็บรักษาไว้ในไลบรารีตัวแปร ดึงข้อมูลผ่านฟังก์ชันพร็อกซี และใช้เป็นอาร์กิวเมนต์ ตัวเลข ของ DATEADD ฟังก์ชัน T-SQL

ก่อนที่คุณจะเผยแพร่ฟังก์ชัน ให้เพิ่มการเชื่อมต่อจากรายการฟังก์ชันข้อมูลผู้ใช้ไปยังไลบรารีตัวแปรและจดบันทึกชื่อแฝงการเชื่อมต่อ ไลบรารีตัวแปรในตัวอย่าง RETENTION_DAYS นี้มีค่าเช่น 90.

กําหนดและเผยแพร่ฟังก์ชัน Python ในรายการฟังก์ชันข้อมูลผู้ใช้:

import fabric.functions as fn

udf = fn.UserDataFunctions()

@udf.connection(argName="varLib", alias="WarehouseConfig")
@udf.function()
def getRetentionDays(varLib: fn.FabricVariablesClient) -> int:
    variables = varLib.getVariables()
    return int(variables["RETENTION_DAYS"])

แทนที่ WarehouseConfig ด้วยชื่อแฝงของการเชื่อมต่อไลบรารีตัวแปรของคุณ

สร้างฟังก์ชันพร็อกซี T-SQL ในคลังสินค้า:

CREATE OR ALTER FUNCTION dbo.get_retention_days
AS EXTERNAL FUNCTION config.getRetentionDays;

บนการเชื่อมต่อ T-SQL แบบถาวร ให้ดึงค่าที่กําหนดค่าไว้หนึ่งครั้งและเก็บไว้โดยใช้ sp_set_session_context:

DECLARE @retention_days int = dbo.get_retention_days();

EXECUTE sys.sp_set_session_context
    @key = N'retention_days',
    @value = @retention_days,
    @read_only = 1;

ค่านี้จะยังคงใช้ได้ตลอดอายุการใช้งานของเซสชัน ดึงข้อมูลกับ SESSION_CONTEXT และแปลงจาก sql_variant เป็น int ก่อนใช้งานกับ DATEADD และGETDATE ตัวอย่างเช่น คํานวณค่าตัดการเก็บรักษา:

SELECT DATEADD(
    day,
    -CONVERT(int, SESSION_CONTEXT(N'retention_days')),
    GETDATE()
) AS retention_cutoff;

ใช้ค่าเซสชันเดียวกันซ้ําในคําสั่งอื่นเพื่อกรองตาราง:

SELECT *
FROM dbo.events
WHERE event_timestamp >= DATEADD(
    day,
    -CONVERT(int, SESSION_CONTEXT(N'retention_days')),
    GETDATE()
);

Important

ใช้รูปแบบนี้จากไคลเอนต์ที่ดูแลการเชื่อมต่อ T-SQL แบบถาวร เช่น SQL Server Management Studio หรือส่วนขยาย MSSQL สําหรับ Visual Studio Code ตัวแก้ไขคําสั่ง SQL ในพอร์ทัล Fabric ไม่รองรับ sp_set_session_contextและแต่ละรันจะใช้เซสชันแยกต่างหาก สําหรับข้อมูลเพิ่มเติม โปรดดูที่ข้อจํากัดของตัวแก้ไขคําสั่ง SQL

แก้ไขปัญหาฟังก์ชันข้อมูลผู้ใช้

Query Insights ให้ข้อมูลการทํางานและประสิทธิภาพที่คุณต้องการเพื่อแก้ไขปัญหาฟังก์ชันของ Fabric คุณสามารถระบุคําสั่งที่เรียกใช้ฟังก์ชัน ตรวจสอบว่าฟังก์ชันนั้นใช้การประมวลผลแบบแบตช์หรือแถว และตรวจสอบความหน่วงของบริการภายนอก การรีไทร์ แถวที่ล้มเหลว และขนาดของภาระงาน ใช้มุมมองสองแบบต่อไปนี้เพื่อเปลี่ยนจากภาพรวมระดับคําสั่งไปยังสถิติโดยละเอียดสําหรับแต่ละฟังก์ชัน:

  • ใช้เพื่อqueryinsights.exec_requests_historyระบุคําค้นที่เรียกใช้ฟังก์ชัน Fabric หรือ AI มุมมองนี้ประกอบด้วยข้อความคําค้น สถานะ เวลาส่ง และเวลารวมที่ผ่านไป
  • ใช้เพื่อ queryinsights.external_api_call_stats เก็บสถิติรายละเอียดสําหรับแต่ละฟังก์ชันที่ถูกเรียกใช้โดยคําสั่งค้นหา มุมมองนี้รวมถึงประเภทฟังก์ชัน โหมดการทํางาน จํานวนการโทรและลองใหม่ เวลารอบริการภายนอก ขนาดภาระงาน และผลลัพธ์ของแถว

มุมมองเหล่านี้ใช้เพื่อ distributed_statement_id ระบุการดําเนินการค้นหาเดียวกัน

ค้นหาคําค้นที่ใช้ฟังก์ชัน Fabric

ใช้เพื่อqueryinsights.exec_requests_historyค้นหาข้อความล่าสุดที่เรียกใช้ฟังก์ชัน Fabric หรือ AI:

SELECT TOP 100
       h.distributed_statement_id,
       h.submit_time,
       h.status,
       h.total_elapsed_time_ms,
       h.command
FROM queryinsights.exec_requests_history AS h
WHERE h.is_using_external_api = 1
ORDER BY h.submit_time DESC;

คัดลอกสําหรับ distributed_statement_id คําสั่งที่คุณต้องการตรวจสอบ คําค้นหาถัดไปจะกรองสถิติรายละเอียดไปยังฟังก์ชัน Fabric

ดูสถิติสําหรับแต่ละฟังก์ชันในคําสั่ง

แทนที่ <distributed_statement_id> ด้วยตัวระบุที่ส่งคืนจากคําค้นหาก่อนหน้า คําสั่งต่อไปนี้จะคืนค่าหนึ่งแถวสําหรับแต่ละฟังก์ชัน Fabric ที่แตกต่างกันซึ่งถูกเรียกใช้โดยคําสั่งนี้:

DECLARE @distributed_statement_id uniqueidentifier =
    '<distributed_statement_id>';

SELECT function_name,
       execution_mode,
       call_count,
       batch_call_count,
       row_call_count,
       call_retry_count,
       external_service_wait_time_ms,
       external_service_wait_time_ms
           / call_count AS average_wait_time_ms_per_call,
       rows_total,
       rows_succeeded,
       rows_failed,
       data_sent_bytes,
       data_received_bytes
FROM queryinsights.external_api_call_stats
WHERE distributed_statement_id = @distributed_statement_id
  AND function_type = 'FABRIC_FUNCTION'
ORDER BY external_service_wait_time_ms DESC;

ผลลัพธ์มีลักษณะคล้ายกับตัวอย่างต่อไปนี้:

function_name execution_mode call_count batch_call_count row_call_count call_retry_count external_service_wait_time_ms average_wait_time_ms_per_call rows_total rows_succeeded rows_failed data_sent_bytes data_received_bytes
inet.ipSubnet batch 12 12 0 0 840 70 600 600 0 12,000 9,600
api.invokeExternalRestEndpoint row 4 0 4 1 1,920 480 4 4 0 1,024 512

คำแนะนำในการแก้ไขปัญหา

  • ค่า high row_call_count หรือ execution_mode value of row อาจบ่งบอกว่าฟังก์ชันไม่ได้ใช้การประมวลผลแบบ batch หากคุณคาดหวังว่าจะมีการแบตช์ ให้ตรวจสอบว่าการดูตัวอย่างโหมดแบตช์เปิดใช้งานอยู่และฟังก์ชันใช้อาร์กิวเมนต์นั้นmax_batch_size
  • ใช้ external_service_wait_time_ms และ average_wait_time_ms_per_call ระบุการตอบสนองภายนอกที่ช้า ถ้าค่าเหล่านี้สูงในขณะที่ data_sent_bytes และ data_received_bytes ต่ํา เวลาตอบสนองของบริการภายนอกน่าจะเป็นความล่าช้าหลัก
  • ค่าหรือค่าที่ใหญ่data_sent_bytesdata_received_bytesก็สามารถเพิ่มเวลาการดําเนินการได้เช่นกัน ลดภาระข้อมูลอินพุตหรือเอาต์พุตเมื่อฟังก์ชันถ่ายโอนข้อมูลมากกว่าที่สถานการณ์ต้องการ