INDEXPROPERTY در SQL Server؛ آموزش کامل و مثال عملی

آموزش تابع INDEXPROPERTY در SQL Server؛ مثال‌ها و نکات حرفه‌ای

توسط admin | گروه SQL Server | 1405/04/29

نظرات 0

آموزش جامع تابع INDEXPROPERTY در SQL Server؛ از Syntax تا بهینه‌سازی

مقدمه و جایگاه تابع در SQL Server

تابع INDEXPROPERTY یکی از ابزارهای مهم متادیتا در Microsoft SQL Server است و برای خواندن ویژگی عددی یک ایندکس یا آمار مشخص استفاده می‌شود. متادیتا داده‌ای درباره ساختار و وضعیت داده‌هاست؛ بنابراین پاسخ این تابع به محتوای رکوردهای تجاری وابسته نیست، بلکه به Context پایگاه داده، کاتالوگ سیستم، نوع ورودی و سطح دسترسی کاربر ارتباط دارد.

در پروژه‌های واقعی، INDEXPROPERTY در ممیزی طراحی ایندکس، کنترل Unique و Clustered بودن، کشف ایندکس غیرفعال و اسکریپت‌های نگهداری شرطی به کار می‌رود. استفاده حرفه‌ای فقط نوشتن یک SELECT کوتاه نیست؛ باید تفاوت مقدار معتبر، صفر و NULL، اثر Metadata Visibility، نام‌گذاری Schema-qualified و هزینه اجرای تکراری تابع را نیز شناخت.

این راهنما از مثال پایه آغاز می‌کند و تا سناریوهای ممیزی، گزارش‌گیری و بهینه‌سازی پیش می‌رود. برای مشاهده نقشه کامل این خانواده، راهنمای جامع توابع متادیتا در SQL Server را نیز مطالعه کنید.

تعریف، Syntax و قرارداد خروجی INDEXPROPERTY

INDEXPROPERTY به زبان ساده خواندن ویژگی عددی یک ایندکس یا آمار مشخص را انجام می‌دهد. موتور SQL Server ورودی را در Context جاری تفسیر می‌کند و نتیجه‌ای با نوع int برمی‌گرداند. اگر ورودی به شیء معتبر اشاره نکند، property پشتیبانی نشود یا کاربر اجازه دیدن متادیتا را نداشته باشد، نتیجه می‌تواند NULL باشد.

نحو استاندارد

SELECT INDEXPROPERTY ( object_ID , index_or_statistics_name , property ) AS Result;
    

پارامترها

object_ID شناسه جدول یا View، آرگومان دوم نام Index یا Statistics و property ویژگی‌ای مانند IsUnique، IsClustered، IsDisabled یا IndexID است.

نوع خروجی و معنای NULL

نوع اعلام‌شده خروجی int است. برنامه مصرف‌کننده باید NULL را یک حالت مستقل بداند و پیش از تبدیل نوع یا تصمیم‌گیری، علت آن را بررسی کند. نام یا property نامعتبر و نبود مجوز می‌تواند NULL بدهد؛ بعضی propertyها فقط برای Index یا فقط برای Statistics معنا دارند.

موضوعتوضیح فنی
کاربرد اصلیخواندن ویژگی عددی یک ایندکس یا آمار مشخص
نوع خروجیint
Contextپایگاه داده یا نشست جاری، مطابق قرارداد تابع
حالت NULLورودی نامعتبر، نبود شیء یا نبود مجوز مشاهده متادیتا
کاربرد سازمانیممیزی طراحی ایندکس، کنترل Unique و Clustered بودن، کشف ایندکس غیرفعال و اسکریپت‌های نگهداری شرطی
اصل مهم: خروجی تابع INDEXPROPERTY را داده امنیتی قابل اعتماد فرض نکنید مگر اینکه مستندات همان property و مجوزهای Context این برداشت را تأیید کنند.

مثال‌های عملی مستقل و قابل اجرا

مثال 1: بررسی Unique بودن ایندکس

در این سناریو می‌خواهیم بررسی Unique بودن ایندکس را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int = OBJECT_ID(N'dbo.tblNewsContent');
    SELECT INDEXPROPERTY(@Obj, N'PK_tblNewsContent', 'IsUnique') AS IsUnique;
    
فیلد یا ستونخروجی نمونه
IsUnique1

نکته کاربردی این مثال: نام واقعی ایندکس را از sys.indexes بگیرید. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 2: خواندن ویژگی نخستین ایندکس واقعی جدول

در این سناریو می‌خواهیم خواندن ویژگی نخستین ایندکس واقعی جدول را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int=OBJECT_ID(N'dbo.tblNewsContent');
    DECLARE @IndexName sysname=(SELECT TOP (1) name FROM sys.indexes WHERE object_id=@Obj AND index_id>0 ORDER BY index_id);
    SELECT @IndexName AS IndexName,INDEXPROPERTY(@Obj,@IndexName,'IsUnique') AS IsUnique;
    
فیلد یا ستونخروجی نمونه
IndexNamePK_tblNewsContent
IsUnique1

نکته کاربردی این مثال: نام ایندکس از کاتالوگ خوانده می‌شود و Hard-code نشده است. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 3: نمایش چند ویژگی در SELECT

در این سناریو می‌خواهیم نمایش چند ویژگی در SELECT را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int = OBJECT_ID(N'dbo.tblNewsContent');
    SELECT i.name,
           INDEXPROPERTY(@Obj, i.name, 'IsUnique') AS IsUnique,
           INDEXPROPERTY(@Obj, i.name, 'IsClustered') AS IsClustered
    FROM sys.indexes AS i WHERE i.object_id=@Obj AND i.index_id>0;
    
فیلد یا ستونخروجی نمونه
namePK_tblNewsContent
IsUnique1
IsClustered1

نکته کاربردی این مثال: شرط ایندکس Heap را از گزارش کنار می‌گذارد. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 4: فیلتر ایندکس‌های Unique

در این سناریو می‌خواهیم فیلتر ایندکس‌های Unique را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int = OBJECT_ID(N'dbo.tblNewsContent');
    SELECT name FROM sys.indexes
    WHERE object_id=@Obj AND index_id>0
      AND INDEXPROPERTY(@Obj, name, 'IsUnique')=1;
    
فیلد یا ستونخروجی نمونه
namePK_tblNewsContent

نکته کاربردی این مثال: ستون is_unique در sys.indexes نیز مستقیم در دسترس است. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 5: ترکیب با OBJECT_ID و IndexID

در این سناریو می‌خواهیم ترکیب با OBJECT_ID و IndexID را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int = OBJECT_ID(N'dbo.tblNewsContent');
    SELECT INDEXPROPERTY(@Obj, N'PK_tblNewsContent', 'IndexID') AS IndexId;
    
فیلد یا ستونخروجی نمونه
IndexId1

نکته کاربردی این مثال: IndexID برای اتصال به sys.index_columns کاربرد دارد. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 6: مدیریت نام ایندکس ناموجود

در این سناریو می‌خواهیم مدیریت نام ایندکس ناموجود را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

SELECT INDEXPROPERTY(OBJECT_ID(N'dbo.tblNewsContent'), N'NoSuchIndex', 'IsUnique') AS Result;
    
فیلد یا ستونخروجی نمونه
ResultNULL

نکته کاربردی این مثال: NULL را معادل غیر Unique ندانید. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 7: Property نامعتبر

در این سناریو می‌خواهیم Property نامعتبر را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

SELECT INDEXPROPERTY(OBJECT_ID(N'dbo.tblNewsContent'), N'PK_tblNewsContent', 'NoSuchProperty') AS Result;
    
فیلد یا ستونخروجی نمونه
ResultNULL

نکته کاربردی این مثال: نام property باید از فهرست پشتیبانی‌شده انتخاب شود. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 8: ممیزی ایندکس‌های غیرفعال

در این سناریو می‌خواهیم ممیزی ایندکس‌های غیرفعال را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

SELECT OBJECT_SCHEMA_NAME(i.object_id) AS SchemaName, OBJECT_NAME(i.object_id) AS TableName, i.name
    FROM sys.indexes AS i
    WHERE i.index_id>0 AND INDEXPROPERTY(i.object_id, i.name, 'IsDisabled')=1;
    
فیلد یا ستونخروجی نمونه
SchemaNameSales
TableNameArchive
nameIX_Archive_Date

نکته کاربردی این مثال: فعال‌سازی ایندکس باید پس از تحلیل علت غیرفعال شدن باشد. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 9: روش اشتباه و مدیریت سه‌حالته

در این سناریو می‌خواهیم روش اشتباه و مدیریت سه‌حالته را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @P int=INDEXPROPERTY(OBJECT_ID(N'dbo.tblNewsContent'),N'NoSuchIndex','IsUnique');
    SELECT CASE WHEN @P=1 THEN N'Unique' WHEN @P=0 THEN N'Non-unique' ELSE N'Unknown' END AS State;
    
فیلد یا ستونخروجی نمونه
StateUnknown

نکته کاربردی این مثال: حالت ناشناخته را جداگانه گزارش کنید. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 10: گزارش کاراتر از sys.indexes

در این سناریو می‌خواهیم گزارش کاراتر از sys.indexes را با تابع INDEXPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

SELECT name, is_unique, type_desc, is_disabled
    FROM sys.indexes
    WHERE object_id=OBJECT_ID(N'dbo.tblNewsContent') AND index_id>0;
    
فیلد یا ستونخروجی نمونه
namePK_tblNewsContent
is_unique1
type_descCLUSTERED
is_disabled0

نکته کاربردی این مثال: برای فهرست انبوه، ستون‌های کاتالوگ از تابع تکراری مناسب‌ترند. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

خطاهای رایج و روش عیب‌یابی

نخستین خطای رایج در INDEXPROPERTY اجرای Query در پایگاه داده نادرست است. قبل از تحلیل نتیجه، DB_NAME()، نام Schema و شناسه ورودی را ثبت کنید. اگر خروجی NULL است، جداگانه وجود شیء، صحت نام، نوع شیء و مجوز VIEW DEFINITION یا مجوز مرتبط را بررسی کنید.

خطای دوم، چسباندن خروجی تابع به SQL پویا بدون اعتبارسنجی است. نامی که قرار است به‌عنوان Identifier استفاده شود باید از منبع مورد اعتماد بیاید و با QUOTENAME محصور شود؛ مقدارهای تجاری نیز باید با sp_executesql پارامتری شوند. نام یا property نامعتبر و نبود مجوز می‌تواند NULL بدهد؛ بعضی propertyها فقط برای Index یا فقط برای Statistics معنا دارند.

  • Context جاری را با SELECT DB_NAME() کنترل کنید.
  • نام‌های شیء را همراه Schema بنویسید و از حدس Schema پیش‌فرض دوری کنید.
  • برای NULL پیام تشخیصی بسازید و آن را خودکار به صفر تبدیل نکنید.
  • نتیجه را با نمای کاتالوگ مرتبط، مانند sys.objects، sys.columns یا sys.types، تطبیق دهید.
  • مجوز مشاهده متادیتا را با کمترین سطح دسترسی لازم طراحی کنید.

ملاحظات کارایی و بهینه‌سازی Query

هزینه یک اجرای INDEXPROPERTY معمولاً در مقایسه با خواندن داده‌های بزرگ ناچیز است، ولی قرار دادن آن روی هر ردیف یک DMV یا کاتالوگ بزرگ می‌تواند CPU و زمان اجرای قابل مشاهده بسازد. وقتی ورودی ثابت است، مقدار را یک‌بار در متغیر ذخیره کنید. وقتی چند ویژگی از هزاران شیء لازم است، Join مستقیم به نماهای sys اغلب Plan شفاف‌تری ایجاد می‌کند.

برای اندازه‌گیری واقعی، SET STATISTICS IO, TIME ON و Actual Execution Plan را در محیط آزمایشی فعال کنید. نسخه تابعی و نسخه Join را با داده و مجوز یکسان مقایسه کنید. از Scalar Function در سمت ستون شرط، اگر تبدیل مستقیم به شناسه یا Join ممکن است، پرهیز کنید تا Predicate ساده‌تر باقی بماند.

SET STATISTICS IO, TIME ON;
    DECLARE @ContextName sysname = DB_NAME();
    -- Query مبتنی بر متادیتا را اینجا اجرا و Plan واقعی را بررسی کنید.
    SELECT @ContextName AS DatabaseContext;
    SET STATISTICS IO, TIME OFF;
    

هدف بهینه‌سازی حذف کورکورانه تابع نیست؛ هدف آن است که تابع در نقطه‌ای اجرا شود که اطلاعات لازم را با کمترین تکرار و روشن‌ترین قرارداد فراهم کند. تغییر باید با اندازه‌گیری قبل و بعد تأیید شود.

بهترین روش‌ها و کاربرد در پروژه سازمانی

  1. نام پایگاه داده و Schema را بخشی از قرارداد اجرای اسکریپت بدانید.
  2. خروجی INDEXPROPERTY را به‌همراه ورودی و Context در لاگ خطا ثبت کنید.
  3. برای Migration، شرط وجود را با نوع شیء مورد انتظار ترکیب کنید.
  4. در کد تولیدی، شاخه جداگانه‌ای برای NULL و نبود مجوز در نظر بگیرید.
  5. برای گزارش‌های انبوه، نماهای کاتالوگ را با نسخه تابعی Benchmark کنید.
  6. شناسه‌های داخلی را میان Development، Test و Production کپی نکنید.
  7. SQL پویا را با QUOTENAME و sp_executesql ایمن کنید.
  8. تست خودکار را پس از تغییر Schema و ارتقای نسخه SQL Server اجرا کنید.

یک کاربرد واقعی INDEXPROPERTY، ساخت ماژول Metadata-driven برای ممیزی طراحی ایندکس، کنترل Unique و Clustered بودن، کشف ایندکس غیرفعال و اسکریپت‌های نگهداری شرطی است. چنین ماژولی باید خروجی نسخه‌بندی‌شده، کنترل مجوز، ثبت زمان اجرا و تست بازگشت داشته باشد. در پروژه‌های حساس، نتیجه با منبع دوم مانند نمای کاتالوگ تطبیق داده می‌شود تا تغییرات غیرمنتظره سریع شناسایی شوند.

سؤالات متداول اختصاصی

۱. تابع INDEXPROPERTY دقیقاً چه مسئله‌ای را حل می‌کند؟

INDEXPROPERTY برای خواندن ویژگی عددی یک ایندکس یا آمار مشخص به کار می‌رود. مزیت آن این است که به‌جای حدس‌زدن یا Hard-code کردن شناسه‌ها و نام‌ها، پاسخ را از متادیتای همان Context دریافت می‌کنیم. در یک سامانه حرفه‌ای، خروجی باید همراه با کنترل NULL و ثبت Context مصرف شود تا نتیجه قابل اعتماد و قابل عیب‌یابی باشد.

۲. برای شروع استفاده از INDEXPROPERTY چه پیش‌نیازی لازم است؟

کاربر باید در پایگاه داده درست متصل باشد، ورودی معتبر بدهد و اجازه مشاهده متادیتای شیء هدف را داشته باشد. بهتر است ابتدا نمونه ساده مقاله اجرا شود و سپس Query با نام‌های واقعی Schema و اشیای سازمان جایگزین گردد. برای رشته‌های فارسی نیز پیشوند N باید حفظ شود.

۳. آیا آموزش و پیاده‌سازی سازمانی INDEXPROPERTY ارزش تجاری دارد؟

بله؛ استفاده صحیح از متادیتا زمان توسعه ابزارهای گزارش‌گیری، مهاجرت، ممیزی و نگهداری را کم می‌کند و خطای انسانی ناشی از مقادیر ثابت را کاهش می‌دهد. در دوره آموزشی یا مشاوره SQL Server می‌توان این تابع را در قالب یک چارچوب Metadata-driven واقعی، همراه با تست و کنترل مجوزها، پیاده‌سازی کرد.

۴. INDEXPROPERTY چگونه هزینه پروژه‌های پایگاه داده را کاهش می‌دهد؟

وقتی قواعد کشف Schema یک‌بار و درست نوشته شوند، همان کد در چند محیط و چند نسخه پایگاه داده قابل استفاده است. این کار دوباره‌کاری در Deployment و گزارش‌سازی را کم می‌کند. البته صرف استفاده از تابع کافی نیست و باید قرارداد نام‌گذاری، ثبت خطا و آزمون تغییرات نیز در پروژه تعریف شود.

۵. تفاوت استفاده از INDEXPROPERTY با خواندن مستقیم نماهای sys چیست؟

INDEXPROPERTY برای دریافت یک ویژگی یا تبدیل مشخص، کوتاه و خواناست؛ در مقابل، نماهای کاتالوگ sys برای گزارش انبوه، فیلتر چندویژگی و Joinهای تحلیلی انعطاف بیشتری دارند. انتخاب درست به حجم داده، نیاز به جزئیات و شکل Plan بستگی دارد و در بسیاری از ابزارها هر دو روش کنار هم استفاده می‌شوند.

۶. آیا می‌توان برای طراحی ابزار یا گزارش اختصاصی INDEXPROPERTY مشاوره گرفت؟

بله؛ در یک خدمت تحلیل یا اجرای پروژه SQL Server ابتدا سناریو، مجوزها، نسخه موتور و اندازه کاتالوگ بررسی می‌شود. سپس Queryهای متادیتا با خروجی پایدار، لاگ خطا، تست خودکار و مستندات تحویل داده می‌شوند تا ابزار به یک نمونه نمایشی محدود نماند.

۷. رایج‌ترین خطای INDEXPROPERTY چیست؟

رایج‌ترین خطا تفسیر NULL به‌عنوان پاسخ منفی قطعی است؛ درحالی‌که NULL ممکن است از ورودی نامعتبر، Context اشتباه یا نبود مجوز مشاهده متادیتا ناشی شود. خطای دیگر استفاده از نام بدون Schema یا فرض ثابت بودن شناسه‌ها میان پایگاه‌های داده است. نام یا property نامعتبر و نبود مجوز می‌تواند NULL بدهد؛ بعضی propertyها فقط برای Index یا فقط برای Statistics معنا دارند.

۸. اجرای INDEXPROPERTY چه اثری بر Performance دارد؟

یک فراخوانی منفرد معمولاً بسیار سبک است، اما اجرای تابع برای هر ردیف یک مجموعه بزرگ یا در شرطی که Join مستقیم کاتالوگ مناسب‌تر است می‌تواند هزینه اضافی بسازد. مقدارهای ثابت را یک‌بار در متغیر محاسبه کنید، Actual Execution Plan و STATISTICS IO را بررسی کنید و برای گزارش‌های انبوه از نماهای sys استفاده آگاهانه داشته باشید.

۹. Best Practice اصلی برای INDEXPROPERTY چیست؟

Context را صریح نگه دارید، نام‌ها را Schema-qualified بنویسید، ورودی و خروجی NULL را کنترل کنید و شناسه‌های متادیتا را در محیط دیگر Hard-code نکنید. همچنین اگر خروجی وارد SQL پویا می‌شود، نام اشیا را با QUOTENAME محصور کنید و مقدارهای داده را پارامتری نگه دارید.

۱۰. INDEXPROPERTY با کدام نسخه‌های SQL Server سازگار است؟

این تابع از توابع جاافتاده Transact-SQL است، اما دامنه propertyها، مجوزهای لازم و سطح پشتیبانی در SQL Server، Azure SQL Database، Managed Instance و سرویس‌های تحلیلی می‌تواند متفاوت باشد. پیش از استقرار، مستندات نسخه هدف و Compatibility Level را بررسی و Query را در محیط آزمایشی همان پلتفرم اجرا کنید.

سؤالات مصاحبه SQL Server

۱. چرا INDEXPROPERTY ممکن است NULL برگرداند؟

ورودی نامعتبر، Context نادرست، property ناسازگار یا محدودیت Metadata Visibility از علت‌های اصلی هستند. پاسخ حرفه‌ای باید روش تفکیک این علت‌ها را نیز توضیح دهد.

۲. چه زمانی نمای sys را به INDEXPROPERTY ترجیح می‌دهید؟

وقتی چند ستون متادیتا برای مجموعه بزرگی از اشیا لازم است، Join و فیلتر مستقیم کاتالوگ معمولاً خواناتر و قابل‌بهینه‌سازی‌تر است. برای یک تبدیل یا ویژگی منفرد، تابع می‌تواند ساده‌تر باشد.

۳. چرا شناسه‌های متادیتا نباید Hard-code شوند؟

زیرا شناسه‌ها در پایگاه دیگر، پس از بازسازی شیء یا در محیط استقرار متفاوت می‌توانند تغییر کنند. نام معتبر یا کاتالوگ باید در زمان اجرا شناسه را حل کند.

۴. Metadata Visibility چه اثری بر نتیجه دارد؟

کاربر معمولاً فقط متادیتای Securableهایی را می‌بیند که مالک آن‌هاست یا مجوز مرتبط دارد. بنابراین NULL الزاماً نبود شیء را ثابت نمی‌کند.

۵. چگونه کارایی Query متادیتا را می‌سنجید؟

نسخه‌ها را با IO، TIME، Plan واقعی، تعداد ردیف و مجوز یکسان مقایسه می‌کنم و تکرار تابع، Predicate و Joinهای کاتالوگ را بررسی می‌کنم.

چک‌لیست نهایی

  • Syntax تابع INDEXPROPERTY با نوع ورودی صحیح نوشته شده است.
  • Context پایگاه داده و Schema پیش از اجرا کنترل شده‌اند.
  • NULL، صفر و یک بر اساس قرارداد property از هم تفکیک شده‌اند.
  • هیچ شناسه داخلی بین محیط‌ها Hard-code نشده است.
  • نام‌های واردشده به SQL پویا با QUOTENAME ایمن شده‌اند.
  • نسخه کاتالوگی برای گزارش‌های انبوه بررسی و Benchmark شده است.
  • مجوز مشاهده متادیتا با اصل حداقل دسترسی تنظیم شده است.
  • تست پس از تغییر Schema و ارتقای SQL Server وجود دارد.

جمع‌بندی

INDEXPROPERTY ابزاری دقیق برای خواندن ویژگی عددی یک ایندکس یا آمار مشخص است، به شرط آنکه Context، مجوز و معنای NULL جدی گرفته شود. مثال‌های این مقاله نشان دادند چگونه از Query ساده به ممیزی سازمانی، مدیریت خطا و انتخاب روش کاراتر برسیم.

برای مقایسه این تابع با سایر اعضای خانواده و دسترسی به مقاله‌های مرتبط، به مقاله مادر توابع Metadata در SQL Server بازگردید. در پیاده‌سازی نهایی، مستندات نسخه هدف و Plan واقعی Query مرجع تصمیم باشند.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر

اطلاعات تماس

  • آدرس:اصفهان-خیابان ام کلثوم غربی - بعد خیابان تخم چی - بیست متر بعد از پیتزا ننه شب - کوچه تعمیر گاه سمار زغالی - پلاک 354 - درب مشکی - طبقه هفتم
  • آدرس ایمیل:najafzade@gmail.com
  • وب سایت:http://www.a00b.com/
  • تلفن ثابت:(+98)9131253620
  • تلفن همراه:09131253620