مشاركة عبر


إنشاء إحصائيات الجدول وتحديثها في تجمع SQL مخصص

توفر هذه المقالة توصيات وأمثلة لإنشاء إحصائيات تحسين الاستعلام وتحديثها على الجداول في تجمع SQL المخصص.

لماذا تستخدم الإحصائيات

كلما عرف المثيل عن بياناتك، زادت سرعة تنفيذ الاستعلامات. بعد تحميل البيانات في تجمع SQL مخصص، يعد جمع الإحصائيات على بياناتك أحد أهم الأشياء التي يمكنك القيام بها لتحسين استعلاماتك.

محسّن استعلام تجمع SQL المخصص هو محسّن قائم على التكلفة. يقارن تكلفة خطط الاستعلام المختلفة ثم يختار الخطة ذات أقل تكلفة. في معظم الحالات، يختار الخطة التي تنفذ الأسرع.

على سبيل المثال، يحدد المحسن خطة معينة إذا قدر أن التاريخ الذي يقوم فيه الاستعلام بتصفية على يرجع صفا واحدا. إذا قدر المحسن أن التاريخ المحدد يرجع مليون صف، فإنه يختار خطة مختلفة.

الإنشاء التلقائي للإحصاءات

عند تشغيل خيار قاعدة البيانات AUTO_CREATE_STATISTICS ، يقوم تجمع SQL المخصص بتحليل استعلامات المستخدم الواردة للإحصائيات المفقودة.

في حالة فقدان الإحصائيات، يقوم محسن الاستعلام بإنشاء إحصائيات على أعمدة فردية في دالة تقييم الاستعلام أو حالة الربط؛ لتحسين تقديرات العلاقة الأساسية لخطة الاستعلام.

إشعار

يتم حاليًا تشغيل الإنشاء التلقائي للإحصائيات بشكل افتراضي.

يمكنك التحقق مما إذا كان تجمع SQL المخصص قد AUTO_CREATE_STATISTICS تم تكوينه عن طريق تشغيل أمر T-SQL التالي:

SELECT name, is_auto_create_stats_on
FROM sys.databases

إذا لم يتم AUTO_CREATE_STATISTICS تكوين تجمع SQL المخصص الخاص بك، نوصي بتمكين هذه الخاصية عن طريق تشغيل الأمر التالي. استبدل <your-datawarehouse-name> باسم تجمع SQL المخصص الخاص بك.

ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON

تؤدي هذه العبارات إلى الإنشاء التلقائي للإحصائيات:

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN عند احتواء صلة أو يتم الكشف عن وجود دالة تقييم

إشعار

لا يتم تنفيذ الإنشاء التلقائي للإحصائيات على جداول مؤقتة أو خارجية.

يتم الإنشاء التلقائي للإحصائيات بشكل متزامن لذلك قد تتدهور أداء الاستعلام قليلا إذا كانت الأعمدة الخاصة بك مفقودة من الإحصائيات. يعتمد وقت إنشاء الإحصائيات لعمود واحد على حجم الجدول.

لتجنب تدهور الأداء القابل للقياس، يجب التأكد من إنشاء الإحصائيات أولا من خلال تنفيذ حمل العمل المعياري قبل جمع معلومات النظام.

إشعار

يسجل إنشاء الإحصائيات في sys.dm_pdw_exec_requests ضمن سياق مستخدم مختلف.

عند إنشاء الإحصائيات التلقائية، فإنها تأخذ الشكل: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. يمكنك عرض الإحصائيات التي تم إنشاؤها بالفعل عن طريق تشغيل الأمر DBCC SHOW_STATISTICS:

DBCC SHOW_STATISTICS (<table_name>, <target>)

table_name هو اسم الجدول الذي يحتوي على الإحصائيات المراد عرضها. لا يمكن أن يكون هذا الجدول جدولًا خارجيًا. الهدف هو اسم الفهرس الهدف أو الإحصائيات أو العمود الذي تعرض معلومات الإحصائيات الخاصة به.

التحديث الخاص بالإحصائيات

أحد أفضل الممارسات هو تحديث الإحصائيات على أعمدة التاريخ كل يوم عند إضافة تواريخ جديدة. في كل مرة يتم تحميل صفوف جديدة في تجمع SQL المخصصة، يتم إضافة تواريخ تحميل جديدة أو تواريخ المعاملات. هذه الإضافات تغيير توزيع البيانات وجعل الإحصاءات قديمة.

قد لا تحتاج الإحصاءات الموجودة في عمود البلد/المنطقة في جدول العميل إلى التحديث لأن توزيع القيم لا يتغير بشكل عام. على افتراض أن التوزيع ثابت بين العملاء، فإن إضافة صفوف جديدة إلى تباين الجدول لن يغير توزيع البيانات.

ومع ذلك، إذا كان تجمع SQL المخصص يحتوي على بلد/منطقة واحدة فقط، وكنت تقوم بإحضار بيانات من بلد/منطقة جديدة، مما يؤدي إلى تخزين بيانات من بلدان/مناطق متعددة، فأنت بحاجة إلى تحديث الإحصائيات في عمود البلد/المنطقة.

في ما يلي توصيات من أجل تحديث الإحصاءات:

سمة الإحصائيات التوصية
تردد تحديثات الإحصائيات المحافظة: يوميا
بعد تحميل البيانات الخاصة بك أو تحويلها
أخذ العينات مع وجود أقل من مليار صف، استخدم أخذ العينات الافتراضية (بنسبة 20 بالمائة).
مع وجود أكثر من مليار صف، استخدم أخذ العينات بنسبة 2 بالمائة.

أحد الأسئلة الأولى التي يجب طرحها عند استكشاف أخطاء استعلام وإصلاحها هو "هل الإحصائيات محدثة؟"

لا يمكن الإجابة عن هذا السؤال حسب عمر البيانات. يمكن أن يكون عنصر الإحصائيات المحدث قديما في حالة عدم وجدود تغيير جوهري على البيانات الأساسية. عندما يتغير عدد الصفوف إل حد كبير، أو يحدث تغيير جوهري في توزيع القيم لعمود، فهذا يعني أن الوقت حان لتحديث الإحصائيات.

لا توجد طريقة عرض إدارة ديناميكية لتحديد ما إذا كانت البيانات داخل الجدول قد تغيرت منذ آخر مرة تم فيها تحديث الإحصائيات. يمكن أن يساعدك الاستعلامان التاليان في تحديد ما إذا كانت إحصاءاتك قديمة.

  • الاستعلام 1: ابحث عن الفرق بين عدد الصفوف من الإحصائيات (stats_row_count) وعدد الصفوف الفعلي (actual_row_count).

    select 
    objIdsWithStats.[object_id], 
    actualRowCounts.[schema], 
    actualRowCounts.logical_table_name, 
    statsRowCounts.stats_row_count, 
    actualRowCounts.actual_row_count,
    row_count_difference = CASE
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count
        ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count
    END,
    percent_deviation_from_actual = CASE
        WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count
        WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
        ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
    END
    from
    (
        select distinct object_id from sys.stats where stats_id > 1
    ) objIdsWithStats
    left join
    (
        select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id
    ) statsRowCounts
    on objIdsWithStats.object_id = statsRowCounts.object_id 
    left join
    (
        SELECT sm.name [schema] ,
            tb.name logical_table_name ,
            tb.object_id object_id ,
            SUM(rg.row_count) actual_row_count
        FROM sys.schemas sm
             INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id
             INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id
             INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name
             INNER JOIN sys.dm_pdw_nodes_db_partition_stats rg     ON rg.object_id = nt.object_id
                AND rg.pdw_node_id = nt.pdw_node_id
                AND rg.distribution_id = nt.distribution_id
        WHERE rg.index_id = 1
        GROUP BY sm.name, tb.name, tb.object_id
    ) actualRowCounts
    on objIdsWithStats.object_id = actualRowCounts.object_id
    
    
  • الاستعلام 2: ابحث عن عمر الإحصائيات الخاصة بك عن طريق التحقق من آخر مرة تم فيها تحديث الإحصائيات في كل جدول.

    إشعار

    إذا كان هناك تغيير جوهري في توزيع القيم لعمود، فيجب عليك تحديث الإحصائيات بغض النظر عن آخر مرة تم تحديثها.

    SELECT
        sm.[name] AS [schema_name],
        tb.[name] AS [table_name],
        co.[name] AS [stats_column_name],
        st.[name] AS [stats_name],
        STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date]
    FROM
        sys.objects ob
        JOIN sys.stats st
            ON  ob.[object_id] = st.[object_id]
        JOIN sys.stats_columns sc
            ON  st.[stats_id] = sc.[stats_id]
            AND st.[object_id] = sc.[object_id]
        JOIN sys.columns co
            ON  sc.[column_id] = co.[column_id]
            AND sc.[object_id] = co.[object_id]
        JOIN sys.types  ty
            ON  co.[user_type_id] = ty.[user_type_id]
        JOIN sys.tables tb
            ON  co.[object_id] = tb.[object_id]
        JOIN sys.schemas sm
            ON  tb.[schema_id] = sm.[schema_id]
    WHERE
        st.[user_created] = 1;
    

عادة ما تحتاج أعمدة التاريخ في تجمع SQL مخصص، على سبيل المثال، إلى تحديثات إحصائيات متكررة. في كل مرة يتم تحميل صفوف جديدة في تجمع SQL المخصصة، يتم إضافة تواريخ تحميل جديدة أو تواريخ المعاملات. هذه الإضافات تغيير توزيع البيانات وجعل الإحصاءات قديمة.

على العكس من ذلك، قد لا تحتاج الإحصائيات الخاصة بعمود الجنس في جدول العملاء إلى التحديث مطلقًا. على افتراض أن التوزيع ثابت بين العملاء، فإن إضافة صفوف جديدة إلى تباين الجدول لن يغير توزيع البيانات.

إذا كان تجمع SQL المخصص الخاص بك يحتوي على جنس واحد فقط وأدى متطلب جديد إلى أجناس متعددة، فأنت بحاجة إلى تحديث الإحصائيات في عمود الجنس.

لمزيد من المعلومات، راجع الإرشادات العامة للإحصائيات.

التنفيذ الخاص بإدارة الإحصاءات

غالبا ما يكون من الجيد توسيع عملية تحميل البيانات للتأكد من تحديث الإحصائيات في نهاية الحمل لتجنب الحظر أو التنازع على الموارد بين الاستعلامات المتزامنة أو تقليلها.

يكون تحميل البيانات عندما تغير الجداول حجمها أو توزيعها للقيم بشكل متكرر. يعتبر تحميل البيانات مكانًا منطقيًا لتنفيذ بعض عمليات الإدارة.

يتم توفير المبادئ التوجيهية التالية لتحديث إحصاءاتك:

  • تأكد من أن كل جدول تم تحميله يحتوي على كائن إحصائي واحد على الأقل محدث. يؤدي هذا إلى تحديث معلومات حجم الجدول (عدد الصفوف وعدد الصفحات) كجزء من تحديث الإحصائيات.
  • ركز على الأعمدة المشاركة في جمل JOIN و GROUP BY و ORDER BY و DISTINCT.
  • ضع في اعتبارك تحديث الأعمدة الرئيسية التصاعدية مثل تواريخ المعاملات بشكل متكرر، لأن هذه القيم غير مضمنة في المدرج التكراري للإحصائيات.
  • ضع في اعتبارك تحديث أعمدة التوزيع الثابتة بشكل أقل تكرارًا.
  • تذكر أن كل عنصر إحصائي يحدث بالتسلسل. التنفيذ البسيط UPDATE STATISTICS <TABLE_NAME> ليس دائما أمرا مثاليا، خاصة للجداول العريضة التي تحتوي على الكثير من عناصر الإحصائيات.

لمزيد من المعلومات، يرجي مراجعة تقدير العلاقة الأساسية.

أمثلة: إنشاء الإحصائيات

توضح هذه الأمثلة كيفية استخدام خيارات متنوعة من أجل إنشاء الإحصائيات. تعتمد الخيارات التي تستخدمها لكل عمود على خصائص البيانات وكيفية استخدام العمود في الاستعلامات.

إنشاء إحصائيات ذات عمود واحد مع الخيارات الافتراضية

لإنشاء إحصائيات في عمود، وفر اسم لعنصر الإحصائيات واسم العمود.

يستخدم بناء الجملة هذا جميع الخيارات الافتراضية. بشكل افتراضي، يتم أخذ عينات من 20 بالمائة من الجدول عند إنشاء الإحصائيات.

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);

على سبيل المثال:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

إنشاء إحصائيات من عمود واحد من خلال فحص كل صف

يعد معدل أخذ العينات الافتراضي البالغ 20 بالمائة كاف لمعظم الحالات. رغم ذلك، يمكنك ضبط معدل أخذ العينات.

لأخذ عينة من الجدول الكامل، استخدم الصيغة التالية:

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;

على سبيل المثال:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;

إنشاء إحصائيات ذات عمود واحد عن طريق تحديد حجم العينة

بدلاً من ذلك، يمكنك تحديد حجم العينة كنسبة مئوية:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;

إنشاء إحصائيات أحادية العمود على بعض الصفوف فحسب

يمكنك أيضًا إنشاء إحصائيات على جزء من الصفوف في الجدول. وهذا ما يسمى إحصائية تمت تصفيتها.

على سبيل المثال، يمكنك استخدام الإحصائيات التي تمت تصفيتها عندما تخطط للاستعلام عن قسم معين في جدول مقسم كبير. من خلال إنشاء إحصائيات على قيم القسم فقط، تتحسن دقة الإحصائيات، مما يحسن أداء الاستعلام.

ينشئ هذا المثال إحصائيات حول نطاق من القيم. يمكن تعريف القيم بسهولة لتناسب نطاق القيم في القسم.

CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';

إشعار

لكي يأخذ محسن الاستعلام في الاعتبار استخدام الإحصائيات المصفاة عند اختيار خطة الاستعلام الموزعة، يجب أن يلاءم الاستعلام داخل عنصر الإحصائيات. من خلال استخدام المثال السابق، تحتاج عبارة WHERE الخاصة بالاستعلام إلى تحديد قيم col1 بين 2000101 20001231.

إنشاء إحصائيات خاصة بعمود واحد مع الخيارات الافتراضية

يمكنك أيضا الجمع بين الخيارات معا. ينشئ المثال التالي عنصر إحصائيات مصفاة بحجم عينة مخصص:

CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;

للحصول على المرجع الكامل، يرجي مراجعة CREATE STATISTICS.

إنشاء خاص بإحصائيات متعددة الأعمدة

من أجل إنشاء عنصر إحصائيات متعدد الأعمدة، استخدم الأمثلة السابقة، ولكن حدد المزيد من الأعمدة.

إشعار

يتاح المدرج التكراري، المستخدم لتقدير عدد الصفوف في نتيجة الاستعلام، فقط للعمود الأول المدرج في تعريف عنصر الإحصائيات.

في هذا المثال، المدرج التكراري موجود على product_category. يتم حساب الإحصائيات عبر الأعمدة على product_category و product_sub_category:

CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;

نظرا لوجود ارتباط بين product_category و product_sub_category، يمكن أن يكون كائن الإحصائيات متعدد الأعمدة مفيدا إذا تم الوصول إلى هذه الأعمدة في نفس الوقت.

إنشاء إحصائيات على كافة الأعمدة في جدول

تتمثل إحدى طرق إنشاء الإحصائيات في إصدار CREATE STATISTICS الأوامر بعد إنشاء الجدول:

CREATE TABLE dbo.table1
(
   col1 int
,  col2 int
,  col3 int
)
WITH
  (
    CLUSTERED COLUMNSTORE INDEX
  )
;

CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);

استخدام إجراء مخزن لإنشاء إحصائيات على كافة الأعمدة في تجمع SQL

لا يحتوي تجمع SQL المخصص على إجراء مخزن للنظام يعادل sp_create_stats في SQL Server. ينشئ هذا الإجراء المخزن عنصر إحصائيات عمود واحد على كل عمود في تجمع SQL الذي لا يحتوي بالفعل على إحصائيات.

يوضح المثال التالي كيفية البدء في تصميم تجمع SQL. لا تتردد في تكييفه مع احتياجاتك.

CREATE PROCEDURE    [dbo].[prc_sqldw_create_stats]
(   @create_type    tinyint -- 1 default 2 Fullscan 3 Sample
,   @sample_pct     tinyint
)
AS

IF @create_type IS NULL
BEGIN
    SET @create_type = 1;
END;

IF @create_type NOT IN (1,2,3)
BEGIN
    THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;

IF @sample_pct IS NULL
BEGIN;
    SET @sample_pct = 20;
END;

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
    DROP TABLE #stats_ddl;
END;

CREATE TABLE #stats_ddl
WITH    (   DISTRIBUTION    = HASH([seq_nmbr])
        ,   LOCATION        = USER_DB
        )
AS
WITH T
AS
(
SELECT      t.[name]                        AS [table_name]
,           s.[name]                        AS [table_schema_name]
,           c.[name]                        AS [column_name]
,           c.[column_id]                   AS [column_id]
,           t.[object_id]                   AS [object_id]
,           ROW_NUMBER()
            OVER(ORDER BY (SELECT NULL))    AS [seq_nmbr]
FROM        sys.[tables] t
JOIN        sys.[schemas] s         ON  t.[schema_id]       = s.[schema_id]
JOIN        sys.[columns] c         ON  t.[object_id]       = c.[object_id]
LEFT JOIN   sys.[stats_columns] l   ON  l.[object_id]       = c.[object_id]
                                    AND l.[column_id]       = c.[column_id]
                                    AND l.[stats_column_id] = 1
LEFT JOIN    sys.[external_tables] e    ON    e.[object_id]        = t.[object_id]
WHERE       l.[object_id] IS NULL
AND            e.[object_id] IS NULL -- not an external table
)
SELECT  [table_schema_name]
,       [table_name]
,       [column_name]
,       [column_id]
,       [object_id]
,       [seq_nmbr]
,       CASE @create_type
        WHEN 1
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
        WHEN 2
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
        WHEN 3
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
        END AS create_stat_ddl
FROM T
;

DECLARE @i INT              = 1
,       @t INT              = (SELECT COUNT(*) FROM #stats_ddl)
,       @s NVARCHAR(4000)   = N''
;

WHILE @i <= @t
BEGIN
    SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);

    PRINT @s
    EXEC sp_executesql @s
    SET @i+=1;
END

DROP TABLE #stats_ddl;

لإنشاء إحصائيات على كافة الأعمدة في الجدول باستخدام الإعدادات الافتراضية، قم بتنفيذ الإجراء المخزن.

EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;

لإنشاء إحصائيات على كافة الأعمدة في الجدول باستخدام fullscan استدعاء هذا الإجراء.

EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;

لإنشاء إحصائيات نموذجية على جميع الأعمدة في الجدول، أدخل 3، وعينة النسبة المئوية. يستخدم هذا الإجراء معدل عينة 20 بالمائة.

EXEC [dbo].[prc_sqldw_create_stats] 3, 20;

أمثلة: تحديث خاص بالإحصائيات

لتحديث الإحصائيات، يمكنك القيام بما يلي:

  • تحديث خاص بعنصر إحصائي واحد. حدد اسم عنصر الإحصائيات المراد تحديثه.
  • تحديث جميع عناصر الإحصائيات على جدول. حدد اسم الجدول بدلا من عنصر إحصائي واحد معين.

تحديث عنصر إحصائي واحد معين

استخدم الصيغة التالية لتحديث عنصر إحصائي معين:

UPDATE STATISTICS [schema_name].[table_name]([stat_name]);

على سبيل المثال:

UPDATE STATISTICS [dbo].[table1] ([stats_col1]);

من خلال تحديث عناصر إحصائية معينة، يمكنك تقليل الوقت والموارد المطلوبة لإدارة الإحصائيات. يتطلب القيام بذلك بعض التفكير في اختيار أفضل كائنات الإحصائيات لتحديثها.

تحديث جميع الإحصائيات في جدول

طريقة بسيطة لتحديث جميع العناصر الإحصائيات على جدول:

UPDATE STATISTICS [schema_name].[table_name];

على سبيل المثال:

UPDATE STATISTICS dbo.table1;

العبارة UPDATE STATISTICS سهلة الاستخدام. فقط تذكر أنه يقوم بتحديث كافة الإحصائيات على الجدول، وبالتالي قد يؤدي المزيد من العمل أكثر مما هو ضروري. إذا لم يكن الأداء مشكلة، فهذه هي الطريقة الأسهل والأكثر اكتمالا لضمان تحديث الإحصائيات.

إشعار

عند تحديث جميع الإحصائيات على جدول، يقوم تجمع SQL المخصص بإجراء مسح ضوئي لعينة من الجدول لكل كائن إحصائي. في حالة كان الجدول كبيرا ويحتوي على العديد من الأعمدة والعديد من الإحصائيات، فيمكن أن يكون تحديث الإحصائيات الفردية بناء على الحاجة أكثر فعالية.

لتنفيذ UPDATE STATISTICS إجراء، راجع الجداول المؤقتة. أسلوب التنفيذ يختلف قليلا عن الإجراء السابق CREATE STATISTICS ولكن النتيجة هي نفسها.

للحصول على بناء الجملة الكامل، راجع تحديث الإحصائيات.

بيانات تعريف خاصة بالإحصائيات

يوجد العديد من طرق عرض النظام ووظائفه التي يمكنك استخدامها للعثور على معلومات عن الإحصائيات. على سبيل المثال، يمكنك معرفة ما إذا كان كائن إحصائيات قد يكون قديما باستخدام دالة تاريخ الإحصائيات لمعرفة آخر مرة تم فيها إنشاء الإحصائيات أو تحديثها.

الطرق الخاصة بعرض الكتالوج للإحصائيات

تتيح طرق عرض النظام هذه معلومات حول الإحصائيات:

الطريقة الخاصة بعرض الكتالوج ‏‏الوصف
أعمدة sys صف واحد لكل عمود
sys.objects صف واحد لكل كائن في قاعدة البيانات
sys.schemas صف واحد لكل مخطط في قاعدة البيانات
sys.stats صف واحد لكل كائن إحصائي
sys.stats_columns صف واحد لكل عمود في كائن الإحصائيات؛ ارتباطات مرة أخرى إلى sys.columns
جداول sys.tables صف واحد لكل جدول (يتضمن جداول خارجية)
sys.table_types صف واحد لكل نوع بيانات

وظائف النظام من أجل الإحصائيات

تعد وظائف النظام هذه مفيدة للعمل مع الإحصائيات:

وظيفة النظام ‏‏الوصف
STATS_DATE تاريخ آخر تحديث لكائن الإحصائيات
DBCC SHOW_STATISTICS مستوى الملخص ومعلومات مفصلة حول توزيع القيم كما يفهمها كائن الإحصائيات

دمج الأعمدة الخاصة بالإحصائيات والدالات في طريقة عرض واحدة

تجمع طريقة العرض هذه الأعمدة التي تتعلق بالإحصاءات والنتائج من الدالة STATS_DATE() معا.

CREATE VIEW dbo.vstats_columns
AS
SELECT
        sm.[name]                           AS [schema_name]
,       tb.[name]                           AS [table_name]
,       st.[name]                           AS [stats_name]
,       st.[filter_definition]              AS [stats_filter_definition]
,       st.[has_filter]                     AS [stats_is_filtered]
,       STATS_DATE(st.[object_id],st.[stats_id])
                                            AS [stats_last_updated_date]
,       co.[name]                           AS [stats_column_name]
,       ty.[name]                           AS [column_type]
,       co.[max_length]                     AS [column_max_length]
,       co.[precision]                      AS [column_precision]
,       co.[scale]                          AS [column_scale]
,       co.[is_nullable]                    AS [column_is_nullable]
,       co.[collation_name]                 AS [column_collation_name]
,       QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS two_part_name
,       QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS three_part_name
FROM    sys.objects                         AS ob
JOIN    sys.stats           AS st ON    ob.[object_id]      = st.[object_id]
JOIN    sys.stats_columns   AS sc ON    st.[stats_id]       = sc.[stats_id]
                            AND         st.[object_id]      = sc.[object_id]
JOIN    sys.columns         AS co ON    sc.[column_id]      = co.[column_id]
                            AND         sc.[object_id]      = co.[object_id]
JOIN    sys.types           AS ty ON    co.[user_type_id]   = ty.[user_type_id]
JOIN    sys.tables          AS tb ON  co.[object_id]        = tb.[object_id]
JOIN    sys.schemas         AS sm ON  tb.[schema_id]        = sm.[schema_id]
WHERE   1=1
AND     st.[user_created] = 1
;

أمثلة علي SHOW_STATISTICS () DBCC

DBCC SHOW_STATISTICS() يعرض البيانات المحتفظ بها داخل كائن إحصائي. تأتي البيانات في ثلاثة أجزاء:

  • الرأس
  • المتجه الخاص بالكثافة
  • المدرج التكراري

بيانات تعريف العنوان حول الإحصائيات. يعرض المدرج التكراري توزيع القيم في العمود الرئيسي الأول لعنصر الإحصائيات. يقيس متجه الكثافة الارتباط عبر الأعمدة.

إشعار

يحسب تجمع SQL المخصص تقديرات العلاقة الأساسية مع أي من البيانات في عنصر الإحصائيات.

إظهار العنوان والكثافة بالإضافة إلي المدرج التكراري

يوضح هذا المثال البسيط كافة الأجزاء الثلاثة لعنصر إحصائي:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)

على سبيل المثال:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

إظهار جزء أو أكثر من DBCC SHOW_STATISTICS()

في حالة اهتمامك فقط بعرض أجزاء معينة، فاستخدم العبارة WITH وحدد الأجزاء التي تريد رؤيتها:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector

على سبيل المثال:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector

الاختلافات الخاصة بـ DBCC SHOW_STATISTICS()

DBCC SHOW_STATISTICS()ينفذ بصرامة أكبر في تجمع SQL المخصص مقارنة بـ SQL Server:

  • الميزات الغير موثقة غير مدعومة.
  • لا يمكن استخدام Stats_stream.
  • لا يمكن ضم نتائج لمجموعات فرعية محددة من بيانات الإحصاء. على سبيل المثال، STAT_HEADER JOIN DENSITY_VECTOR
  • NO_INFOMSGS لا يمكن تعيين لمنع الرسائل.
  • لا يمكن استخدام أقواس مربعة حول الأسماء الخاصة بالإحصائيات.
  • لا يمكن استخدام أسماء الأعمدة لتعريف عنصر الإحصائيات.
  • يعد الخطأ المخصص 2767 غير مدعوم.

مراقبة حمل عمل تجمع SQL المخصص ل Azure Synapse Analytics باستخدام DMVs