กําหนดค่าและจัดการสถิติตารางอัตโนมัติใน Fabric Spark

นําไปใช้กับ:✅ วิศวกรรมข้อมูล Fabric และวิทยาศาสตร์ข้อมูล

สถิติตารางอัตโนมัติใน Microsoft Fabric ช่วยให้ Spark เพิ่มประสิทธิภาพการดําเนินการคิวรีโดยการรวบรวมเมตริกตารางและคอลัมน์สําหรับตารางเดลต้าโดยอัตโนมัติ

  • จํานวนแถว
  • จํานวน Null ต่อคอลัมน์
  • ค่าต่ําสุดและสูงสุดต่อคอลัมน์
  • จํานวนค่าที่แตกต่างกันต่อคอลัมน์
  • ความยาวคอลัมน์เฉลี่ยและสูงสุด

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

ด้วยเหตุนี้ ปริมาณงานจํานวนมากจึงสามารถลดเวลาแฝงในการสืบค้นและคํานวณการใช้งานได้ด้วยการบํารุงรักษาสถิติด้วยตนเองน้อยลง

สําหรับคําแนะนําข้ามปริมาณงานเกี่ยวกับกลยุทธ์การเพิ่มประสิทธิภาพตาราง โปรดดู การบํารุงรักษาและการเพิ่มประสิทธิภาพตารางข้ามปริมาณงาน

ประโยชน์ที่สำคัญ

สถิติอัตโนมัติให้ประโยชน์ดังต่อไปนี้:

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

วิธีการทำงาน

Fabric Spark รวบรวมสถิติเพิ่มเติม ณ เวลาเขียนและใช้ในระหว่างการวางแผน

ขอบเขตและพฤติกรรมการรวบรวม:

  • สถิติจะถูกรวบรวมในเวลาเขียน
  • คอลเลกชันกําหนดเป้าหมาย 32 คอลัมน์แรก (รวมถึงคอลัมน์ที่ซ้อนกัน)
  • คุณสมบัติของตารางสามารถแทนที่ลักษณะการทํางานระดับเซสชันได้
  • การกําหนดค่าจะควบคุมว่า Spark จะแทรกสถิติลงในเครื่องมือเพิ่มประสิทธิภาพหรือไม่

เมตริกเหล่านี้ช่วยให้ Spark เลือกกลยุทธ์การรวมที่ดีขึ้นปรับปรุงการตัดแต่งพาร์ติชันและเพิ่มประสิทธิภาพแผนการรวม

เปิดหรือปิดการรวบรวมสถิติ

ใช้การกําหนดค่าเซสชัน (พื้นที่ทํางานหรือขอบเขตสมุดบันทึก) หรือคุณสมบัติของตาราง (ขอบเขตต่อตาราง)

การกําหนดค่าเซสชัน

คุณสามารถเปิดใช้งานหรือปิดใช้งานคอลเลกชันสถิติแบบขยายเวลาและการใส่ตัวปรับให้เหมาะสมในระดับเซสชันได้

การตั้งค่าเหล่านี้สามารถนําไปใช้ผ่าน Spark SQL, PySpark หรือ Scala Spark

รันคําสั่ง Spark SQL ต่อไปนี้เพื่อเปิดใช้งานการฉีด collection และ optimizer:

SET spark.microsoft.delta.stats.collect.extended=true;
SET spark.microsoft.delta.stats.injection.enabled=true;

หากต้องการปิดใช้งานการตั้งค่าใด ๆ ให้ใช้คําสั่งเดียวกันโดยตั้งค่าเป็น false.

หมายเหตุ

ต้องเปิดใช้งานคอลเลกชันสถิติของบันทึกส่วนที่แตกต่าง (spark.databricks.delta.stats.collect) (ค่าเริ่มต้น: จริง)

Important

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

  • ขอบเขตเซสชัน: ตั้งค่าspark.microsoft.delta.stats.injection.enabledเป็นfalse
  • ขอบเขตตาราง: ตั้งค่าคุณสมบัติตารางdelta.stats.extended.injectเป็นfalse

คุณสามารถเปิดใช้งานการรวบรวมสถิติได้ สําหรับตารางที่ใช้เวกเตอร์การลบ ให้ปิดใช้งานเฉพาะการแทรกลงในเครื่องมือเพิ่มประสิทธิภาพเท่านั้น

กลยุทธ์การดูแลตารางอย่างสม่ําเสมอช่วยลดความเสี่ยงนี้ OPTIMIZE จะล้างไฟล์โดยอัตโนมัติเมื่อมีเวกเตอร์ REORG TABLE ... APPLY (PURGE) ลบมากกว่า 5% แถวอ้างอิง และสามารถบังคับให้เขียนใหม่ต่ํากว่าค่าที่กําหนดได้ เนื่องจากสถิติขยายถูกเก็บรวบรวมในขณะเขียน การเขียนซ้ําจะรีเฟรชสถิติสําหรับไฟล์ที่ได้รับผลกระทบ สําหรับตารางที่มีการอัปเดตหรือลบบ่อย ให้ปิดการฉีดระหว่างรอบการบํารุงรักษา

คุณสมบัติของตาราง (แทนที่การกําหนดค่าเซสชัน)

คุณสมบัติของตารางช่วยให้คุณสามารถควบคุมคอลเลกชันสถิติในแต่ละตาราง โดยแทนที่การตั้งค่าเซสชัน

เปิดใช้งานบนตาราง:

ALTER TABLE tableName
SET TBLPROPERTIES(
    'delta.stats.extended.collect' = 'true',
    'delta.stats.extended.inject' = 'true'
)

หากต้องการปิดใช้งานคุณสมบัติตารางใด ๆ ให้ตั้งค่าเป็น false.

ลักษณะการทํางานเริ่มต้นของการสร้างตาราง

ใช้การตั้งค่าระดับเซสชันนี้เพื่อปิดใช้งานการประทับตราอัตโนมัติของคุณสมบัติของตารางสถิติเพิ่มเติมเมื่อมีการสร้างตารางใหม่

ใช้คําสั่ง Spark SQL นี้เพื่อปิดใช้งานการตั้งค่าอัตโนมัติเมื่อสร้างตาราง:

SET spark.microsoft.delta.stats.collect.extended.property.setAtTableCreation=false;

ตรวจสอบสถิติ

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

ตรวจสอบจํานวนแถวและขนาดตาราง (ตัวอย่างสเกลา):

println(spark.read.table("tableName").queryExecution.optimizedPlan.stats)

ตรวจสอบสถิติของคอลัมน์โดยละเอียด:

val stats = spark.read.table("tableName").queryExecution.optimizedPlan.stats

stats.attributeStats.foreach { case (attrName, colStat) =>
    println(s"colName: $attrName distinctCount: ${colStat.distinctCount} min: ${colStat.min} max: ${colStat.max} nullCount: ${colStat.nullCount} avgLen: ${colStat.avgLen} maxLen: ${colStat.maxLen}")
}

คํานวณสถิติใหม่

สถิติอาจล้าสมัยหลังจากการเปลี่ยนแปลงสคีมาหรือการอัปเดตบางส่วน ใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อคํานวณใหม่

เขียนตารางใหม่ (หมายเหตุ: ประวัติการรีเซ็ตนี้):

spark.read.table("targetTable").write.partitionBy("partCol").mode("overwrite").saveAsTable("targetTable")

วิธีที่แนะนํา (Fabric Spark >= 3.2.0.19):

from pyspark.sql.delta import StatisticsStore

StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

หากสคีมาเปลี่ยนแปลง (เช่น คุณเพิ่มหรือลบคอลัมน์) ให้ลบสถิติเก่าก่อนคํานวณใหม่:

from pyspark.sql.delta import StatisticsStore

StatisticsStore.removeStatisticsData(spark, "testTable1")
StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

ใช้ ANALYZE TABLE

ใช้เพื่อ ANALYZE TABLE คํานวณสถิติแคตตาล็อก Spark ในทุกคอลัมน์ คําสั่งนี้จะไม่คํานวณสถิติขยายที่เก็บโดย Automated Table Statistics ใหม่ เพื่อคํานวณสถิติเหล่านั้นใหม่ ให้ใช้ StatisticsStore.recomputeStatisticsWithCompaction.

เรียกใช้คําสั่ง:

เรียกใช้คําสั่ง Spark SQL ต่อไปนี้:

ANALYZE TABLE tableName COMPUTE STATISTICS FOR ALL COLUMNS

เปิดใช้งานการใส่สถิติแค็ตตาล็อก:

ใช้คําสั่ง Spark SQL นี้เพื่อเปิดใช้งานการฉีดสถิติแคตตาล็อก:

SET spark.microsoft.delta.stats.injection.catalog.enabled=true;

หากต้องการปิดการฉีดสถิติแคตตาล็อก ให้ใช้การตั้งค่าเดียวกันโดยตั้งค่าเป็นfalse

ข้อจำกัด

เป็นสิ่งสําคัญที่ต้องทําความเข้าใจข้อจํากัดในปัจจุบันของสถิติอัตโนมัติของ Fabric เพื่อให้คุณสามารถวางแผนได้ตามต้องการ

  • สถิติจะถูกรวบรวมในเวลาเขียนเท่านั้น
  • การอัปเดตจากกลไกจัดการอื่นจะไม่ถูกรวมโดยอัตโนมัติ
  • รวมเฉพาะ 32 คอลัมน์แรกเท่านั้น (รวมถึงคอลัมน์ที่ซ้อนกัน)
  • การลบและการอัปเดตอาจทําให้สถิติล้าสมัย สําหรับตารางที่ใช้เวกเตอร์การลบ ตาราง OPTIMIZE ปกติหรือ REORG TABLE ... APPLY (PURGE) แบบบํารุงรักษาจะเขียนไฟล์ที่ได้รับผลกระทบใหม่และรีเฟรชสถิติของไฟล์เหล่านั้น ปิดการฉีดสถิติระหว่างรอบการบํารุงรักษาในตารางที่มีการอัปเดตหรือลบบ่อยครั้ง
  • การคํานวณใหม่ต้องมีการดําเนินการ API การเขียนใหม่หรือสถิติ
  • การแทรกสถิติใช้ไม่ได้กับคอลัมน์ที่ซ้อนกัน
  • ในปริมาณงานบางอย่าง สถิติที่ค้างหรือไม่สมบูรณ์อาจนําไปสู่การถดถอยได้
  • ANALYZE TABLE การสนับสนุนจํากัดอยู่ที่ FOR ALL COLUMNS.
  • การเปลี่ยนแปลงการเรียงลําดับคอลัมน์หรือการตั้งค่าคอนฟิกอาจต้องมีการรีเฟรชทั้งหมด