انواع Views در SQL Server؛ راهنمای جامع با ۳۶ مثال عملی

راهنمای جامع Views در SQL Server؛ Standard، Indexed و Partitioned Views

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

نظرات 0

راهنمای جامع Views در SQL Server؛ از Standard تا Indexed و Partitioned View

دسترسی سریع

این مجموعه سه مسیر مستقل دارد: آموزش کامل Standard Views، آموزش کامل Indexed Views و آموزش کامل Partitioned Views. هر مسیر شامل Syntax، ده مثال اجرایی، خروجی نمونه، خطاهای رایج و نکات کارایی است.

مقدمه و جایگاه View در معماری داده

View یک شیء منطقی و Schema-scoped در SQL Server است که نتیجه یک Query را با نامی پایدار در اختیار مصرف‌کنندگان می‌گذارد. برنامه، گزارش، داشبورد یا کاربر به‌جای تکرار Joinها و محاسبات می‌تواند View را مانند یک جدول در SELECT به کار ببرد. این سادگی باید با درک رفتار Optimizer و وابستگی به جداول پایه همراه باشد.

در Standard View معمولاً فقط تعریف Query ذخیره می‌شود و داده جداگانه‌ای وجود ندارد. Indexed View با ایجاد Unique Clustered Index نتیجه را فیزیکی می‌کند و هزینه نگهداری را هنگام تغییر داده می‌پردازد. Partitioned View نیز چند جدول افقی یا حتی چند سرور را با UNION ALL زیر یک نام منطقی قرار می‌دهد.

انتخاب درست به هدف بستگی دارد. اگر هدف انتزاع، قرارداد ستون یا محدودسازی دسترسی باشد Standard View نقطه شروع است. اگر تجمیع ثابت و پرتکرار گلوگاه خواندن باشد Indexed View پس از Benchmark بررسی می‌شود. اگر داده در جدول‌های هم‌ساختار با مرزهای جدا قرار دارد Partitioned View مطرح است.

View مرز امنیتی خودکار نیست. مجوز روی جدول پایه، Ownership Chaining، Dynamic SQL و نقش‌ها باید هماهنگ طراحی شوند. همچنین View تضمین نمی‌کند Query سریع باشد؛ Optimizer تعریف آن را باز می‌کند و بر اساس Statistics، ایندکس‌ها و Predicate مصرف‌کننده Plan می‌سازد.

Grain مهم‌ترین پرسش طراحی است: هر ردیف خروجی دقیقاً نماینده چیست؟ سفارش، مشتری، مشتری در ماه یا ترکیب کالا و انبار؟ نبود پاسخ روشن باعث تکثیر ردیف در Join، Aggregate اشتباه و کلید غیر یکتا برای Indexed View می‌شود.

قرارداد Metadata نیز اهمیت دارد. نام، ترتیب، نوع و Nullable بودن ستون‌ها بخشی از API داده هستند. SELECT * این قرارداد را شکننده می‌کند؛ فهرست صریح ستون‌ها و CAST آگاهانه تغییر Schema را قابل کنترل‌تر می‌سازد.

مقایسه سه نوع View

نوع Viewکاربرد اصلینوع خروجی یا نکته مهملینک آموزش کامل
Standard Viewsانتزاع Query، امنیت ستون و استفاده مجددمعمولاً بدون ذخیره فیزیکی دادهمقاله Standard Views
Indexed Viewsشتاب تجمیع یا محاسبه پرتکرارذخیره فیزیکی همراه با هزینه DMLمقاله Indexed Views
Partitioned Viewsیکپارچه‌سازی جدول‌های افقی یا چند سرورUNION ALL و حذف عضو با CHECK Constraintمقاله Partitioned Views

جدول مقایسه نقطه شروع است و تصمیم نهایی باید با شواهد محیط هدف گرفته شود. نسخه SQL Server، Edition، Compatibility Level، نرخ نوشتن، حجم داده و SLA می‌توانند انتخاب را تغییر دهند.

معرفی مسیرهای تخصصی

Standard Views در SQL Server

Standard View برای پنهان‌سازی Join، ثابت‌کردن Alias، محدودسازی ستون و ایجاد منبع گزارش‌گیری مناسب است. داده در جدول‌های پایه باقی می‌ماند و ایندکس همان جدول‌ها معمولاً اثر اصلی را دارد. آموزش Standard Views با ۱۰ مثال عملی تمام قواعد و خطاها را تشریح می‌کند.

Indexed Views در SQL Server

Indexed View نتیجه را با Unique Clustered Index نگهداری می‌کند و برای خواندن پرتکرار مفید است. SCHEMABINDING، توابع قطعی، SET Options و COUNT_BIG از الزامات کلیدی‌اند. آموزش Indexed Views و سنجش کارایی هزینه خواندن و نوشتن را کنار هم بررسی می‌کند.

Partitioned Views در SQL Server

Partitioned View جدول‌های هم‌ساختار را بر اساس مرز سال، منطقه یا کلید دیگر با UNION ALL ترکیب می‌کند. Constraint بدون هم‌پوشانی و Predicate سازگار امکان Partition Elimination را ایجاد می‌کند. آموزش Partitioned Views و UNION ALL شامل طراحی محلی و توزیع‌شده است.

فرایند مهندسی طراحی View

  1. Queryها و مصرف‌کنندگان واقعی را فهرست و SLA هرکدام را مشخص کنید.
  2. Grain، کلید منطقی، قواعد NULL و نوع داده خروجی را بنویسید.
  3. نوع View را بر اساس هدف انتخاب کنید، نه صرفاً نام یا عادت تیم.
  4. مجوز Roleها و دسترسی مستقیم به جدول پایه را طراحی کنید.
  5. Baseline کارایی شامل Duration، CPU و Logical Reads بگیرید.
  6. تعریف و وابستگی‌ها را در Source Control و Migration قرار دهید.
  7. با داده نماینده، پارامترهای متنوع و حساب مصرف‌کننده تست کنید.
  8. پس از انتشار Query Store، خطا، Blocking و رشد Log را پایش کنید.

انواع داده تاریخ و زمان در View

View می‌تواند ستون‌های date، time، datetime2 و datetimeoffset را نمایش دهد، اما باید دقت و معنای آن‌ها روشن باشد. برای ثبت رویداد جدید datetime2 معمولاً دقت و دامنه بهتری از datetime قدیمی دارد و datetimeoffset Offset را نیز نگه می‌دارد.

ذخیره زمان رویداد به UTC و تبدیل در مرز گزارش، اختلاف سرورها و کاربران را کاهش می‌دهد. AT TIME ZONE برای تبدیل قواعد منطقه زمانی مفید است، ولی استفاده از تابع وابسته به زمان جاری در Indexed View مجاز نیست و باید خارج از تعریف انجام شود.

مرز زمانی نیمه‌باز مانند Column >= Start AND Column < NextStart برای datetime ایمن‌تر از BETWEEN تا انتهای روز است. این الگو دقت کسری ثانیه را از دست نمی‌دهد و معمولاً Predicate ایندکس‌پذیرتری می‌سازد.

فرمت YYYYMMDD برای literal تاریخ مستقل از DATEFORMAT است. رشته فارسی در SQL باید N prefix داشته باشد. این دو جزئیات کوچک از خطاهای محیطی و خراب‌شدن Unicode در اسکریپت‌های انتشار جلوگیری می‌کنند.

مثال‌های عملی ترکیبی

مثال 1: ساخت یک Standard View برای گزارش فروش

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

CREATE OR ALTER VIEW dbo.vw_SalesSummary
    AS
        SELECT SaleID,
               SaleDate,
               CustomerID,
               CAST(Quantity * UnitPrice AS decimal(18,2)) AS TotalAmount
        FROM dbo.Sales;
    GO
    SELECT SaleID, SaleDate, TotalAmount
    FROM dbo.vw_SalesSummary
    WHERE SaleDate >= DATEFROMPARTS(2026, 7, 1);
SaleIDSaleDateTotalAmount
10012026-07-032450000.00
10022026-07-06980000.00

فیلتر تاریخ در Query مصرف‌کننده نوشته شده است تا Optimizer بتواند Predicate را به جدول پایه منتقل کند. Standard View داده را کپی نمی‌کند و نتیجه آن با داده جدول پایه همگام است.

مثال 2: محدود کردن ستون‌های حساس در لایه دسترسی

در سامانه منابع انسانی نباید شماره حساب و اطلاعات محرمانه مستقیماً در اختیار گزارش‌ساز قرار گیرد. یک View محدود همراه با مجوز SELECT سطح حمله و خطای انسانی را کاهش می‌دهد.

CREATE OR ALTER VIEW dbo.vw_EmployeeDirectory
    AS
        SELECT EmployeeID, FullName, DepartmentName, WorkEmail
        FROM dbo.Employees;
    GO
    GRANT SELECT ON dbo.vw_EmployeeDirectory TO ReportingRole;
    SELECT EmployeeID, FullName, DepartmentName
    FROM dbo.vw_EmployeeDirectory;
EmployeeIDFullNameDepartmentName
12سارا احمدیفروش
18علی رضاییفناوری اطلاعات

امنیت View زمانی مؤثر است که به نقش گزارش‌گیری روی جداول پایه مجوز مستقیم داده نشود. مالکیت یکسان اشیا نیز Ownership Chaining را قابل پیش‌بینی می‌کند.

مثال 3: خلاصه‌سازی قابل ایندکس برای داشبورد

داشبورد مالی مجموع فروش هر مشتری را بارها محاسبه می‌کند. Indexed View با رعایت SCHEMABINDING و COUNT_BIG می‌تواند نتیجه تجمیع را به‌صورت فیزیکی نگهداری کند و خواندن پرتکرار را سریع‌تر سازد.

SET NUMERIC_ROUNDABORT OFF;
    SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT,
        CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
    CREATE VIEW dbo.vw_CustomerSalesAgg
    WITH SCHEMABINDING
    AS
        SELECT CustomerID,
               COUNT_BIG(*) AS RowCount,
               SUM(ISNULL(Amount, CONVERT(decimal(18,2),0))) AS TotalAmount
        FROM dbo.Sales
        GROUP BY CustomerID;
    GO
    CREATE UNIQUE CLUSTERED INDEX CUX_vw_CustomerSalesAgg
    ON dbo.vw_CustomerSalesAgg(CustomerID);
CustomerIDRowCountTotalAmount
1014268000000.00
2051723500000.00

هزینه نگهداری Indexed View در زمان INSERT، UPDATE و DELETE پرداخت می‌شود؛ بنابراین قبل از ایجاد آن باید نسبت خواندن به نوشتن و طرح اجرای واقعی اندازه‌گیری شود.

مثال 4: یکپارچه‌سازی داده سالانه با Partitioned View

سازمان برای هر سال جدول جداگانه دارد و گزارش مدیریتی باید همه سال‌ها را از یک نام منطقی بخواند. UNION ALL همراه با CHECK Constraint مرز هر عضو را برای حذف پارتیشن‌های نامرتبط مشخص می‌کند.

CREATE OR ALTER VIEW dbo.vw_AllOrders
    AS
        SELECT OrderID, OrderDate, CustomerID, Amount
        FROM dbo.Orders_2025
        UNION ALL
        SELECT OrderID, OrderDate, CustomerID, Amount
        FROM dbo.Orders_2026;
    GO
    SELECT SUM(Amount) AS TirSales
    FROM dbo.vw_AllOrders
    WHERE OrderDate >= '20260701' AND OrderDate < '20260801';
TirSales
184500000.00

برای Partition Elimination باید روی جدول‌های عضو محدودیت CHECK معتبر، بدون هم‌پوشانی و قابل اعتماد وجود داشته باشد. فرمت تاریخ غیرمبهم YYYYMMDD نیز از وابستگی به زبان Session جلوگیری می‌کند.

مثال 5: نمایش زمان محلی و UTC در View گزارش رویداد

داده رخدادها بهتر است با UTC ذخیره شود اما مصرف‌کننده گاهی به Offset محلی نیاز دارد. این مثال هم مقدار اصلی را حفظ می‌کند و هم تبدیل صریح منطقه زمانی را برای گزارش فراهم می‌سازد.

CREATE OR ALTER VIEW dbo.vw_EventTimeline
    AS
        SELECT EventID,
               OccurredAtUtc,
               OccurredAtUtc AT TIME ZONE 'UTC'
                   AT TIME ZONE 'Iran Standard Time' AS OccurredAtIran
        FROM dbo.Events;
    GO
    SELECT EventID, OccurredAtUtc, OccurredAtIran
    FROM dbo.vw_EventTimeline;
EventIDOccurredAtUtcOccurredAtIran
90012026-07-20 08:00:002026-07-20 11:30:00 +03:30

تبدیل منطقه زمانی باید با نیاز کسب‌وکار هماهنگ باشد. استفاده از نام Windows Time Zone تغییرات تاریخی و قواعد DST ثبت‌شده در SQL Server را بهتر از افزودن عدد ثابت پوشش می‌دهد.

مثال 6: بررسی طرح اجرا و Predicate Pushdown

برای تشخیص اینکه View لایه اضافی و پرهزینه ساخته است یا نه، Query مصرف‌کننده را با آمار زمان و ورودی‌وخروجی اجرا می‌کنیم. SQL Server معمولاً تعریف Standard View را باز می‌کند و فیلتر را تا جدول پایه پایین می‌برد.

SET STATISTICS IO ON;
    SET STATISTICS TIME ON;
    SELECT SaleID, CustomerID, TotalAmount
    FROM dbo.vw_SalesSummary
    WHERE CustomerID = 101
      AND SaleDate >= '20260701';
    SET STATISTICS TIME OFF;
    SET STATISTICS IO OFF;
شاخص بررسینتیجه مورد انتظار
Logical Readsمتناسب با Seek یا Scan انتخاب‌شده
Execution Planاعمال فیلتر روی جدول Sales

وجود View به‌تنهایی تضمین‌کننده سرعت نیست. Actual Execution Plan، تعداد Logical Read، تخمین Cardinality و ایندکس جدول پایه معیارهای اصلی تصمیم‌گیری هستند.

امنیت، کارایی و نگهداری

اصل حداقل دسترسی می‌گوید Role مصرف‌کننده فقط ستون و ردیفی را ببیند که لازم دارد. GRANT روی View زمانی معنا دارد که مجوز مستقیم وسیع روی جدول پایه یا Schema مسیر جایگزین نسازد. برای سیاست ردیفی وابسته به کاربر، Row-Level Security را جداگانه بررسی کنید.

View تو در تو خوانایی ظاهری ایجاد می‌کند ولی می‌تواند Joinهای تکراری، ستون‌های بلااستفاده و تخمین ضعیف بسازد. تعریف نهایی Query را در Actual Plan دنبال کنید و فقط نام View را معیار هزینه ندانید.

در Standard View، ایندکس‌های جداول پایه و شکل Predicate تعیین‌کننده‌اند. در Indexed View، ایندکس خود View و هزینه هم‌زمان نگهداری مطرح است. در Partitioned View، Constraint معتبر و Elimination عضوها بیشترین اهمیت را دارد.

Query Store برای مشاهده Regression پس از تغییر View مفید است. Baseline را پیش از استقرار بگیرید و مدت، CPU، Reads، Memory Grant و تعداد اجرا را مقایسه کنید. یک Query سریع‌تر ممکن است در مجموع به‌دلیل افزایش هزینه DML انتخاب بدی باشد.

تغییر ستون جدول پایه یک تغییر قرارداد است. sys.sql_expression_dependencies، تست Compile، تست Metadata و Smoke Test گزارش‌ها باید در Pipeline انتشار باشند. sp_refreshview راه‌حل مدیریت نسخه نیست و فقط پس از ارزیابی سازگاری اجرا می‌شود.

نام‌گذاری ثابت، توضیح Grain، مالک فنی، تاریخ بازبینی و فهرست مصرف‌کننده‌ها مستندات حداقلی هر View هستند. بدون مالکیت مشخص، اشیای قدیمی حذف نمی‌شوند و پیچیدگی پایگاه داده به‌مرور افزایش می‌یابد.

خطاهای رایج

  • استفاده از SELECT * و شکستن قرارداد Metadata
  • تصور ذخیره‌شدن داده در Standard View
  • اعتماد به ORDER BY داخلی برای ترتیب خروجی
  • ایجاد Indexed View بدون سنجش هزینه نوشتن
  • تعریف Partitioned View با UNION به‌جای UNION ALL
  • Constraint هم‌پوشان یا غیر Trusted در اعضای پارتیشن
  • فیلتر تاریخ با تابع روی ستون و کاهش SARGability
  • مجوز مستقیم گسترده روی جداول پایه
  • لایه‌های متعدد View و وابستگی پنهان
  • انتشار بدون Actual Plan، Query Store و Rollback Plan

سؤالات متداول

1. View در SQL Server داده را ذخیره می‌کند؟

Standard View فقط Query ذخیره‌شده است و داده را از جداول پایه می‌خواند. Indexed View پس از ایجاد Unique Clustered Index نتیجه را فیزیکی نگهداری می‌کند و Partitioned View داده اعضا را یکپارچه نشان می‌دهد.

2. آیا View همیشه باعث افزایش سرعت می‌شود؟

خیر؛ View معمولی بیشتر ابزار انتزاع، امنیت و استفاده مجدد است. سرعت به Query بازشده، ایندکس‌های پایه، Cardinality و فیلتر مصرف‌کننده وابسته است و باید با Actual Execution Plan اندازه‌گیری شود.

3. تفاوت View و Stored Procedure چیست؟

View مانند یک منبع جدولی در SELECT و JOIN شرکت می‌کند و پارامتر ندارد؛ Stored Procedure جریان دستورات، پارامتر و عملیات متنوع‌تری دارد. انتخاب به قرارداد مصرف و نیاز امنیتی بستگی دارد.

4. برای داشبورد سازمانی کدام نوع View بهتر است؟

اگر Query سبک است Standard View کافی است؛ برای تجمیع بسیار پرتکرار و خواندن سنگین Indexed View قابل ارزیابی است؛ برای جدول‌های افقی هم‌ساختار Partitioned View مناسب است. مشاوره طراحی باید با اندازه‌گیری بار واقعی همراه باشد.

5. آیا می‌توان از طریق View داده را ویرایش کرد؟

Viewهای ساده تک‌جدولی اغلب قابل Update هستند، اما Join، Aggregate، DISTINCT و UNION محدودیت ایجاد می‌کنند. عملیات حساس بهتر است با API داده یا Stored Procedure کنترل‌شده و تست Transaction انجام شود.

6. چگونه خطای Metadata بعد از تغییر جدول را رفع کنیم؟

وابستگی‌ها و قرارداد ستون‌ها را بررسی کنید، سپس در صورت سازگاری sp_refreshview یا sp_refreshsqlmodule را اجرا کنید. Migration خودکار و تست Regression برای پروژه حرفه‌ای ضروری است.

7. مهم‌ترین خطای کارایی در طراحی View چیست؟

Viewهای تو در تو، SELECT *، تبدیل تابعی روی ستون فیلتر و Joinهای بدون کلید مناسب از خطاهای رایج‌اند. Query Store، STATISTICS IO و Plan واقعی برای یافتن علت استفاده شوند.

8. بهترین روش نام‌گذاری View چیست؟

یک قرارداد ثابت مانند vw_ به‌همراه نام دامنه و هدف خروجی انتخاب کنید، Grain و مالک را مستند کنید و نام را صرفاً بر اساس شکل فعلی جدول نگذارید تا قرارداد معنایی روشن بماند.

9. آیا View جایگزین لایه امنیتی کامل است؟

View برای محدودسازی ستون و مجوزدهی مفید است، اما برای سیاست وابسته به کاربر، Audit و جداسازی دقیق باید Row-Level Security، نقش‌ها، Ownership و اصل حداقل دسترسی نیز طراحی شوند.

10. Viewها با کدام نسخه‌های SQL Server سازگارند؟

Standard View از نسخه‌های قدیمی پشتیبانی می‌شود؛ جزئیات Indexed و Distributed Partitioned View و قابلیت‌هایی مانند CREATE OR ALTER به نسخه و سطح سازگاری وابسته‌اند. پیش از استقرار مستندات همان نسخه و محیط آزمایشی را کنترل کنید.

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

سؤال 1: تفاوت اصلی Standard و Indexed View چیست؟

Standard View عموماً فقط تعریف Query دارد؛ Indexed View با Unique Clustered Index نتیجه را فیزیکی نگهداری می‌کند و در DML هزینه اضافی دارد.

سؤال 2: چرا ORDER BY در View قابل اتکا نیست؟

مدل رابطه‌ای مجموعه بدون ترتیب است و فقط ORDER BY در Query نهایی ترتیب ارائه را تضمین می‌کند. TOP ممکن است انتخاب ردیف را محدود کند، نه قرارداد ترتیب مصرف‌کننده را.

سؤال 3: SCHEMABINDING چه مزیت و هزینه‌ای دارد؟

وابستگی را محافظت و شرط Indexed View را فراهم می‌کند، اما تغییر Schema پایه را تا تغییر یا حذف وابستگی مسدود می‌سازد.

سؤال 4: Partition Elimination به چه چیز وابسته است؟

Constraintهای Trusted و بدون هم‌پوشانی، نوع داده سازگار و Predicate مستقیم روی ستون پارتیشن عوامل اصلی‌اند.

سؤال 5: چگونه اثر View را اندازه می‌گیرید؟

Query نهایی را با Actual Plan، STATISTICS IO/TIME و Query Store روی داده و پارامتر نماینده قبل و بعد مقایسه می‌کنم.

سؤال 6: چه زمانی View انتخاب نامناسبی است؟

وقتی منطق به پارامتر، چند مرحله پردازش، مدیریت خطا یا تغییرات کنترل‌شده نیاز دارد، TVF یا Stored Procedure ممکن است قرارداد شفاف‌تری باشد.

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

  • Grain و کلید منطقی خروجی مشخص است.
  • ستون‌ها صریح و نوع داده پایدار است.
  • نوع View با هدف کسب‌وکار تطبیق دارد.
  • تمام لینک‌ها و وابستگی‌ها کنترل شده‌اند.
  • مجوزها با حساب واقعی مصرف‌کننده تست شده‌اند.
  • Predicateهای تاریخ و عدد SARGable هستند.
  • Actual Plan و Logical Reads ثبت شده‌اند.
  • هزینه DML و Log برای Indexed View سنجیده شده است.
  • Constraint اعضای Partitioned View معتبر است.
  • اسکریپت Rollback و پایش پس از انتشار آماده است.

جمع‌بندی و ادامه مطالعه

Views ابزار قدرتمندی برای قرارداد داده، امنیت، خوانایی و گاهی کارایی هستند، اما هر نوع هزینه و محدودیت خاص دارد. Standard View انتخاب پیش‌فرض برای انتزاع است، Indexed View یک ابزار بهینه‌سازی مبتنی بر مادی‌سازی و Partitioned View راهی برای یکپارچه‌سازی افقی است.

مطالعه را با نیاز خود ادامه دهید: راهنمای Standard Views، راهنمای Indexed Views و راهنمای Partitioned Views. هر مقاله مثال‌های مستقل و چک‌لیست اجرای واقعی دارد.

در محیط عملیاتی هیچ نسخه واحدی برای همه سامانه‌ها وجود ندارد. داده نماینده، Query Store، Plan واقعی و آزمون نرخ نوشتن باید تصمیم را پشتیبانی کنند.

 

0 نظر

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

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

حرف 500 حداکثر

اطلاعات تماس

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