آموزش جامع SQL Server (جلسه ۱۸: Viewها)
1398/03/23 13:10 , میلاد صاحب نظر

آموزش جامع SQL Server (جلسه ۱۸: Viewها)

حالا که کاملاً با اصول اولیه و دستورات مختلف SQL Server آشنا شدید وقت آن است که به سراغ مباحث پیشرفته‌تر و جذاب‌تر برویم. در این قسمت به صورت کامل و مثال محور با Viewها در SQL Server آشنا خواهید شد و در مورد مزایا و معایب viewهای پایگاه داده صحبت خواهیم کرد.

۱- نصب و آشنایی با SQL Server

۱۰-عملگرهای SET وCTEوPIVOT

۱۹-indexها بخش۱

۲۸-توابع تاریخ یا date بخش۲

۲-نوشتن query

۱۱-تغییر داده‌ها

۲۰-indexها بخش۲

۲۹-توابع رشته‌ای بخش۱

۳-محدود کردن ردیف‌ها

۱۲-تعریف داده‌ها بخش۱

۲۱-stored procedureها بخش۱

۳۰- توابع رشته‌ای بخش۲

۴-فیلتر کردن داده‌ها بخش ۱

۱۳-تعریف داده‌ها بخش۲

۲۲- stored procedureها بخش۲

۳۱- توابع رشته‌ای بخش۳

۵-فیلتر کردن داده‌ها بخش۲

۱۴-data typeهای بخش۱

۲۳- stored procedureها بخش۳

۳۲-توابع سیستمی بخش ۱

۶-اتصال جداول بخش۱

۱۵-data typeها بخش۲

۲۴-توابع تعریف شده توسط کاربر

۳۳-توابع سیستمی بخش۲

۷-اتصال جداول بخش۲

۱۶-ویژگی‌ها

۲۵-triggerها

۳۴-window functionها بخش۱

۸-گروه‌بندی داده‌ها

۱۷-expressionها

۲۶-توابع تجمعی

۳۵-window functionها بخش ۲

۹-subquery

۱۸-viewها

۲۷-توابع تاریخ یا date بخش۱

 

در این قسمت، هر چیزی که لازم است در مورد کار با viewها بدانید را خواهید آموخت. با ما همراه باشید!

Viewها در SQL Server

وقتی از دستور SELECT برای به دست آوردن داده‌ها از یک یا چند جدول استفاده می‌کنید، یک مجموعه نتایج به دست می‌آورید.

برای مثال، کد زیر نام محصول، برند و لیست قیمت تمام محصولات را از جداول products و brands بازمی‌گرداند:

SELECT
    product_name, 
    brand_name, 
    list_price
FROM
    production.products p
INNER JOIN production.brands b 
        ON b.brand_id = p.brand_id;

دفعه بعدی، اگر خواستید یک مجموعه نتیجه به دست آورید، می‌توانید خیلی راحت query بالا را در یک فایل متنی ذخیره کنید، سپس در زمان نیاز آن را باز کرده و در SQL Server اجرایش کنید.

اما SQL Server یک روش بهتر برای ذخیره این query در کاتالوگ پایگاه داده فراهم کرده است و این روش از طریق view انجام می‌شود.

View یک query دارای نام است که در کاتالوگ پایگاه داده ذخیره شده است و به شما امکان می‌دهد تا بعداً در صورت نیاز به آن اشاره کنید.

بنابراین query بالا را می‌توانید با استفاده از دستور CREATE VIEW به صورت یک view ذخیره کنید:

CREATE VIEW sales.product_info
AS
SELECT
    product_name, 
    brand_name, 
    list_price
FROM
    production.products p
INNER JOIN production.brands b 
        ON b.brand_id = p.brand_id;

سپس، بعداً هر موقع که نیاز داشتید می‌توانید داخل یک دستور SELECT، همانند یک جدول به view بالا اشاره کنید:

SELECT * FROM sales.product_info;

وقتی این query را دریافت کنید، SQL Server کد زیر را اجرا می‌کند:

SELECT 
    *
FROM (
    SELECT
        product_name, 
        brand_name, 
        list_price
    FROM
        production.products p
    INNER JOIN production.brands b 
        ON b.brand_id = p.brand_id;
);

توجه کنید که viewها داده‌ها را ذخیره نمی‌کنند، مگر برای viewهای شاخص یا index دار که در همین جلسه در مورد آن‌ها صحبت خواهیم کرد.

یک View می‌تواند شامل ستون‌هایی از چند جدول باشد. برای این منظور از joinها یا یک زیرمجموعه از ستون‌های متعلق به یک جدول استفاده می‌کنیم. این امر باعث می‌شود viewها برای خلاصه و چکیده کردن یا مخفی کردن queryهای پیچیده مفید باشند.

تصویر زیر یک view را نشان می‌دهد که شامل ستون‌هایی از چندین جدول است:

view

مزایای viewها

در کل، viewها مزایای زیر را به ارمغان می‌آورند:

امنیت

می‌توانید دسترسی مستقیم کاربران به یک جدول را محدود کنید و به آن‌ها اجازه دهید که فقط با استفاده از viewها، به زیرمجموعه خاصی از داده‌ها دسترسی داشته باشند.

برای مثال، می‌توانید امکان دسترسی کاربران به نام، شماره تلفن و ایمیل مشتری را از طریق یک view فراهم کنید، اما دسترسی آن‌ها به حساب بانکی و دیگر اطلاعات حساس را محدود یا ممنوع کنید.

ساده‌سازی

یک پایگاه داده ارتباطی می‌تواند شامل جداول بسیار با روابط پیچیده (مثلاً یک به یک و یک به چند) باشد که در این صورت، جهت‌یابی در چنین پایگاه داده‌ای مشکل است.

به هر حال، می‌توانید با بهره‌گیری از یک مجموعه view و با استفاده از joinها و شرط‌ها، queryهای پیچیده را ساده‌سازی کنید.

سازگاری یا Consistency

گاهی، لازم است یک فرمول یا منطق پیچیده را در همه queryهای برنامه خود بنویسید.

برای سازگار یا consistent کردن برنامه، می‌توانید منطق و محاسبات queryهای پیچیده را در viewها مخفی کنید.

وقتی viewها تعریف شدند، به جای اینکه منطق و محاسبات را در هر query بنویسید، می‌توانید به آن اشاره کنید.

مدیریت viewها در SQL Server

برای استفاده و مدیریت viewها در SQL Server باید با مباحث زیر آشنا شوید:

  • ایجاد یک view جدید: نشان می‌دهد که چگونه می‌توانید یک view جدید در یک پایگاه داده SQL Server ایجاد کنید.

  • تغییر نام یک view: چگونگی تغییر نام یک view با استفاده از SQL Server Management Studio (یا SSMS) یا دستور Transact-SQL را خواهید آموخت.

  • لیست کردن viewها در SQL Server: در مورد روش‌های مختلف برای لیست کردن همه viewها در یک پایگاه داده SQL Server صحبت می‌کند.

  • به دست آوردن اطلاعات view: چگونگی به دست آوردن اطلاعات در مورد یک view را توضیح می‌دهد.

  • حذف یک view: شما را در چگونگی استفاده از دستور DROP VIEW برای حذف یک یا چند view از پایگاه داده راهنمایی می‌کند.

  • ایجاد یک view شاخص یا index دار: چگونگی ایجاد یک view شاخص یا index دار در مقابل جداولی که نیازمند به اصلاح داده‌های نادرست هستند را توضیح می‌دهد تا بتوانید عملکرد view را بهبود ببخشید.

حالا به صورت مفصل و با مثال به توضیح موارد بالا می‌پردازیم.

دستور CREATE VIEW در SQL Server

برای ایجاد یک view جدید در SQL Server، می‌توانید از دستور CREATE VIEW به شکل زیر استفاده کنید:

CREATE VIEW [OR ALTER] schema_name.view_name [(column_list)]
AS
    select_statement;

در این syntax:

  • ابتدا نام view پس از کلیدواژه‌های CREATE VIEW مشخص شده است. Schema_name نام شمایی است که view به آن تعلق دارد.

  • سپس، یک دستور SELECT (یعنی select_statement) استفاده شده است که view را بعد از کلیدواژه AS تعریف می‌کند. دستور SELECT می‌تواند به یک یا چند جدول اشاره کند.

اگر به صورت واضح لیستی از ستون‌ها را برای View مشخص نکنید، SQL Server از لیست ستون به دست آمده از دستور SELECT استفاده خواهد کرد.

در صورتی که می‌خواهید یک view را تغییر دهید، مثلاً می‌خواهید چند ستون به آن اضافه کنید یا چند ستون از آن حذف کنید، می‌توانید از کلیدواژه‌های OR  ALTER بعد از کلیدواژه‌های CREATE VIEW استفاده کنید.

مثال‌های CREATE VIEW در SQL Server

برای مثال‌ها از جداول order_items، orders و products از پایگاه داده نمونه Bikestores استفاده می‌کنیم.

جداول order_items، orders و products

مثال ایجاد یک view ساده

دستور زیر یک view به نام daily_sales بر اساس جداول order_items، orders و products ایجاد می‌کند:

CREATE VIEW sales.daily_sales
AS
SELECT
    year(order_date) AS y,
    month(order_date) AS m,
    day(order_date) AS d,
    p.product_id,
    product_name,
    quantity * i.list_price AS sales
FROM
    sales.orders AS o
INNER JOIN sales.order_items AS i
    ON o.order_id = i.order_id
INNER JOIN production.products AS p
    ON p.product_id = i.product_id;

وقتی daily_sales ایجاد شد، می‌توانید با استفاده از یک دستور SELECT ساده، از جداول موجود در آن اطلاعات به دست آورید:

SELECT 
    * 
FROM 
    sales.daily_sales
ORDER BY
    y, m, d, product_name;

تصویر زیر خروجی را نشان می‌دهد:

نتایج

مثال تغییر یک view

برای اضافه کردن ستون نام به sales.daily_sales می‌توانید از دستور CREATE VIEW OR ALTER به شکل زیر استفاده کنید:

CREATE OR ALTER sales.daily_sales (
    year,
    month,
    day,
    customer_name,
    product_id,
    product_name
    sales
)
AS
SELECT
    year(order_date),
    month(order_date),
    day(order_date),
    concat(
        first_name,
        ' ',
        last_name
    ),
    p.product_id,
    product_name,
    quantity * i.list_price
FROM
    sales.orders AS o
    INNER JOIN
        sales.order_items AS i
    ON o.order_id = i.order_id
    INNER JOIN
        production.products AS p
    ON p.product_id = i.product_id
    INNER JOIN sales.customers AS c
    ON c.customer_id = o.customer_id;

در این مثال، ما لیست ستون را برای View به صورت واضح مشخص کردیم.

کد زیر داده‌ها را از Sales.daily_sales به دست می‌آورد:

SELECT 
    * 
FROM 
    sales.daily_sales
ORDER BY 
    y, 
    m, 
    d, 
    customer_name;

خروجی به این شکل است:

نتایج

مثال ایجاد یک view با استفاده از توابع جمع

کد زیر یک view به نام staff_sales ایجاد می‌کند که جمع فروش‌های انجام شده توسط کارمندان و سال‌های فروش را با استفاده از تابع جمع ()SUM به دست می‌آورد:

CREATE VIEW sales.staff_sales (
        first_name, 
        last_name,
        year, 
        amount
)
AS 
    SELECT 
        first_name,
        last_name,
        YEAR(order_date),
        SUM(list_price * quantity) amount
    FROM
        sales.order_items i
    INNER JOIN sales.orders o
        ON i.order_id = o.order_id
    INNER JOIN sales.staffs s
        ON s.staff_id = o.staff_id
    GROUP BY 
        first_name, 
        last_name, 
        YEAR(order_date);

کد زیر محتوای view را بازمی‌گرداند:

SELECT  
    * 
FROM 
    sales.staff_sales
ORDER BY 
 first_name,
 last_name,
 year;

خروجی به این شکل است:

نتایج

به این شکل، چگونگی ایجاد یک view با استفاده از دستور CREATE VIEW را آموختید.

تغییر نام View در SQL Server

قبل از تغییر نام یک view، باید توجه داشته باشید که تمام اشیائی که به view وابسته هستند ممکن است از دست بروند. این اشیاء عبارت‌اند از stored procedureها، توابع تعریف شده توسط کاربر، triggerها، queryها، viewهای دیگر و برنامه‌های client.

از این رو، بعد از تغییر نام view، باید دقت کنید که همه اشیائی که به نام قبلی view اشاره می‌کردند، حالا به نام جدید آن اشاره کنند تا این اشیاء را از دست ندهید.

تغییر نام view با استفاده از SSMS

برای تغییر نام یک view، می‌توانید مراحل زیر را طی کنید:

ابتدا، در Object Explorer، شاخه Databases را باز کنید، نام پایگاه داده‌ای که شامل view مورد نظر شما است را انتخاب کنید و سپس فولدر views را باز کنید.

سپس، روی view که می‌خواهید نامش را تغییر دهید کلیک راست کنید و روی Rename کلیک کنید.

روی view که می‌خواهید نامش را تغییر دهید کلیک راست کنید و روی Rename کلیک کنید

بعد، نام جدید را برای view تایپ کنید.

 نام جدید را برای view تایپ کنید

تغییر نام view با استفاده از Transact-SQL

اگر می‌خواهید نام یک view را با استفاده از برنامه‌نویسی تغییر دهید، می‌توانید از stored procedure به نام sp_rename استفاده کنید:

EXEC sp_rename 
    @objname = 'sales.product_catalog',
    @newname = 'product_list';

در این کد:

  • ابتدا، نام view که می‌خواهید نام آن تغییر کند را با استفاده از پارامتر objname@ و نام جدید view را با استفاده از پارامتر newname@ مشخص کنید. توجه کنید که در objname@ باید نام شمای view را مشخص کنید. اما در پارامتر newname@ نیاز نیست.

  • سپس، دستور را اجرا کنید.

حالا sp_name پیغام زیر را نمایش می‌دهد:

Caution: Changing any part of an object name could break scripts and stored procedures.

به این شکل، چگونگی تغییر نام یک view در یک پایگاه داده SQL Server با استفاده از Management Studio و Transact_SQL را آموختید.

لیست کردن viewها در SQL Server

برای لیست کردن تمام viewها در یک پایگاه داده SQL Server، می‌توانید catalog viewهای sys.views یا sys.objects را در query بنویسید. یک مثال در کد زیر مشاهده می‌کنید:

SELECT 
 OBJECT_SCHEMA_NAME(v.object_id) schema_name,
 v.name
FROM 
 sys.views as v;

این quuery لیستی از نام‌های شما و نام‌های view را به شکل زیر بازمی‌گرداند:

نتایج

در این مثال ما از تابع ()OBJECT_SCHEMA_NAME برای به دست آوردن نام شماهای viewها استفاده کردیم.

Query زیر لیست viewها را از طریق view سیستم به نام sys.objects بازمی‌گرداند:

SELECT 
 OBJECT_SCHEMA_NAME(o.object_id) schema_name,
 o.name
FROM
 sys.objects as o
WHERE
 o.type = 'V';

ایجاد یک stored procedure برای نشان دادنviewها در یک پایگاه دادهSQL Server

 Stored procedure زیر query بالا را احاطه می‌کند تا تمام viewها را بر اساس نام شما و نام view ورودی، در پایگاه داده  SQL Server  لیست کند:

CREATE PROC usp_list_views(
 @schema_name AS VARCHAR(MAX)  = NULL,
 @view_name AS VARCHAR(MAX) = NULL
)
AS
SELECT 
 OBJECT_SCHEMA_NAME(v.object_id) schema_name,
 v.name view_name
FROM 
 sys.views as v
WHERE 
 (@schema_name IS NULL OR 
 OBJECT_SCHEMA_NAME(v.object_id) LIKE '%' + @schema_name + '%') AND
 (@view_name IS NULL OR
 v.name LIKE '%' + @view_name + '%');

برای مثال، اگر می‌خواهید viewهایی که شامل واژه sales هستند را ببینید، می‌توانید stored procedure به نام usp_list_views را فراخوانی کنید:

EXEC usp_show_views @view_name = 'sales'

نتایج به این شکل هستند:

نتایج

در نتیجه، روش‌های مختلف لیست کردن viewها در یک پایگاه داده SQL Server با روش به دست آوردن داده از catalog viewهای سیستم را آموختید.

چگونه اطلاعات راجع به یک view در SQL Server را به دست آوریم؟

برای به دست آوردن اطلاعات از یک view، می‌توانید از کاتالوگ سیستم sys.sql_module و تابع ()OBJECT_ID استفاده می‌کنیم:

SELECT
    definition,
    uses_ansi_nulls,
    uses_quoted_identifier,
    is_schema_bound
FROM
    sys.sql_modules
WHERE
    object_id
    = object_id(
            'sales.daily_sales'
        );

در این query، نام view را در تابع ()OBJECT_ID درون دستور WHERE قرار می‌دهیم. تابع ()OBJECT_ID یک شماره شناسایی از یک شیء پایگاه داده موجود در شما بازمی‌گرداند.

خروجی به این شکل است:

نتایج

توجه کنید که باید نتایج را به فرمت متنی خروجی بگیرید تا بتانید دستور SELECT را مانند تصویر بالا به وضوح ببینید.

برای نمایش نتایج به  شکل متن، از طریق query editor، می‌توانید کلیدهای میانبر Ctrl-T را بزنید یا روی آیکن Results to Text که در تصویر زیر می‌بینید کلیک کنید:

روی آیکن Results to Text که در تصویر می‌بینید کلیک کنید

به دست آوردن اطلاعات view با استفاده از stored procedure به نام sp_helptext

Stored procedure به نام sp_helptext تعریف یک شیء تعریف شده توسط کاربر را بازمی‌گرداند (مثلاً یک view را).

برای به دست آوردن اطلاعات یک view، باید نام view را به sp_helptext بفرستید. برای مثال، کد زیر اطلاعات view به نام sales.product_catalog را بازمی‌گرداند:

EXEC sp_helptext 'sales.product_catalog' ;

تصویر زیر خروجی را نشان می‌دهد:

نتایج

به دست آوردن اطلاعات view با استفاده از تابع ()OBJECT_DEFINITION

یک روش دیگر برای به دست آوردن اطلاعات view، استفاده از توابع ()OBJECT_DEFINITION و ()OBJECT_ID  به شکل زیر است:

SELECT 
    OBJECT_DEFINITION(
        OBJECT_ID(
            'sales.staff_sales'
        )
    ) view_info;

تصویر زیر خروجی را نشان می‌دهد:

نتایج

به این صورت، روش‌های مختلف به دست آوردن اطلاعات راجع به یک view در پایگاه داده SQL Server را آموختید.

دستور DROP VIEW در SQL Server

برای حذف یک view از یک پایگاه داده، می‌توانید از دستور DROP VIEW به شکل زیر استفاده کنید:

DROP VIEW [IF EXISTS] schema_name.view_name;

در این syntax، نام view که می‌خواهید drop شود را پس از کلیدواژه‌های DROP VIEW مشخص می‌شود. اگر view به یک شما تعلق دارد، باید به وضوح نام شمایی که view به آن تعلق دارد را مشخص کنید.

اگر سعی کنید یک view که وجود ندارد را حذف کنید، SQL Server ارور می‌دهد. دستور  IF EXISTS باعث می‌شود که وقتی سعی می‌کنید یک view که وجود ندارد را پاک کنید، سیستم ارور ندهد.

برای حذف چند view، می‌توانید از syntax زیر استفاده کنید:

DROP VIEW [IF EXISTS] 
    schema_name.view_name1, 
    schema_name.view_name2,
    ...;

در این syntax، مشاهده می‌کنید که viewها با ویرگول از هم جدا شده‌اند.

توجه کنید که وقتی یک view را Drop می‌کنید، SQL Server تمام مجوزهای view را حذف می‌کند.

مثال‌های DROP VIEW در SQL Server

برای مثال‌ها از view های sales.daily_sales و sales.staff_sales که در قسمت دستور CREATE VIEW در بخش مثال‌ها ایجاد کردیم، استفاده می‌کنیم.

مثال حذف یک view

مثال زیر چگونگی حذف view به نام Sales.daily_sales از پایگاه داده نمونه را نشان می‌دهد:

DROP VIEW IF EXISTS sales.daily_sales;
مثال حذف چند view

کد زیر یک view به نام product_catalog ایجاد می‌کند که متناسب با نیاز مثال ما است:

CREATE VIEW sales.product_catalog
AS
SELECT 
    product_name, 
    category_name, 
 brand_name,
    list_price
FROM 
    production.products p
INNER JOIN production.categories c 
    ON c.category_id = p.category_id
INNER JOIN production.brands b
 ON b.brand_id = p.brand_id;

کد زیر هر دو viewهای sales.staff_sales و Sales.product_catalog را به صورت هم‌زمان حذف می‌کند:

DROP VIEW IF EXISTS 
    sales.staff_sales, 
    sales.product_catalogs;

به این شکل، چگونگی استفاده از دستور DROP VIEW برای حذف یک یا چند view از پایگاه داده را نیز آموختید.

View شاخص یا index دار در SQL Server

Viewهای معمولی SQL Server در واقع queryهای ذخیره شده هستند که مزیت‌هایی مانند ساده‌سازی query، سازگاری یا consistency منطق برنامه و امنیت را به همراه دارند. اما، عملکرد query داخلشان را بهبود نمی‌دهند.

بر خلاف viewهای معمولی، viewهای شاخص یا index دار در واقع viewهای فیزیکی هستند، یعنی داده‌ها را به صورت فیزیکی ذخیره می‌کنند (مثلاً به شکل جدول)، بنابراین اگر به درستی مورد استفاده قرار بگیرند، مزایای عملکردی خوبی در بر خواهند داشت.

برای ایجاد یک view شاخص یا index دار، مراحل زیر را انجام دهید:

  • ابتدا، یک view ایجاد کنید که از آپشن WITH SCHEMABINDING برخوردار باشد. این آپشن می‌تواند view را به شمای جداول درون آن متصل کند.

  • سپس، یک شاخص یا index دسته‌بندی شده (clustered) منحصر به فرد در view ایجاد کنید. این کار باعث می‌شود view فیزیکی یا materialized شود.

به خاطر آپشن WITH SCHEABINDING، اگر بخواهید ساختار جداول داخل آن را که بر تعریف view شاخص یا index دار تاثیر می‌گذارند را تغییر دهید، باید view شاخص یا index دارا را قبل از اینکه تغییرات را اعمال کنید، Drop کنید.

علاوه بر این، SQL Server به تمام رفرنس‌های شیء موجود در یک view شاخص یا indexدار نیاز دارد تا بتواند مدل نام‌گذاری دو بخشی (مثل schema.object) را پیاده‌سازی کند و تمام اشیاء اشاره شده در یک پایگاه داده قرار دارند.

وقتی داده‌های جداول مورد نظر تغییر کردند، آنگاه داده‌های موجود در view شاخص یا index دار نیز به صورت خودکار به روز رسانی می‌شوند. این امر باعث به وجود آمدن یک مرحله نوشتن اضافی برای جداول مورد اشاره یا رفرنس شده می‌شود.

یعنی اینکه وقتی شما در یک جدول مورد نظر چیزی می‌نویسید، SQL Server همچنین باید آن‌ها را در view شاخص یا indexدار نیز بنویسد. از این رو، شما فقط باید برای جداولی که خیلی کم نیاز به، به روز رسانی داده‌ها دارند، viewهای شاخص یا index دار را ایجاد کنید.

مثال ایجاد یک view شاخص یا index دار در SQL Server

کد زیر یک view شاخص دار بر اساس ستون‌های جداول production.brands، production.products و production.categories از پایگاه داده نمونه Bikestores ایجاد می‌کند:

جداول production.brands، production.products و production.categories

CREATE VIEW product_master
WITH SCHEMABINDING
AS 
SELECT
    product_id,
    product_name,
    model_year,
    list_price,
    brand_name,
    category_name
FROM
    production.products p
INNER JOIN production.brands b 
    ON b.brand_id = p.brand_id
INNER JOIN production.categories c 
    ON c.category_id = p.category_id;

به آپشن WITH SCHEMABINDING که بعد از نام view آمده است دقت کنید. بقیه قسمت‌های کد مثل دفعات قبل است.

قبل از اینکه یک شاخص clustered یا دسته‌بندی شده منحصر به فرد برای view ایجاد کنیم، اجازه دهید با به دست آوردن داده‌ها از یک view معمولی و استفاده از دستور SET STATISTICS IO، آمارهای I/O cost برای query را بررسی کنیم:

SET STATISTICS IO ON
GO
 
SELECT 
    * 
FROM
    production.product_master
ORDER BY
    product_name;
GO 

SQL Serverآمارهای I/O cost برای query را به شکل زیر بازمی‌گرداند:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'products'. Scan count 1, logical reads 5, physical reads 1, read-ahead reads 3, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'categories'. Scan count 1, logical reads 2, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'brands'. Scan count 1, logical reads 2, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

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

حالا یک شاخص clustered منحصر به فرد به view اضافه می‌کنیم:

CREATE UNIQUE CLUSTERED INDEX 
    ucidx_product_id 
ON production.product_master(product_id);

این کد view را materialize یا فیزیکی می‌کند و باعث می‌شود در پایگاه داده حضور فیزیکی داشته باشد.

همچنین می‌توانید یک شاخص غیر clustered به ستون product_name در view اضافه کنید:

CREATE NONCLUSTERED INDEX 
    ucidx_product_name
ON production.product_master(product_name);

حالا، اگر داده‌ها را از view به دست آورید، متوجه می‌شوید که آمارها تغییر کرده‌اند:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'product_master'. Scan count 1, logical reads 6, physical reads 1, read-ahead reads 11, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

به جای خواندن داده از سه جدول، SQL Server حالا داده‌ها را مستقیماً از view فیزیکی یا materialize شده به نام product_master می‌خواند.

توجه کنید که این ویژگی فقط در SQL Server Enterprise Edition موجود است. اگر از ورژن‌های SQL Server Standard یا Developer استفاده می‌کنید، باید از کد اعلام جدول WITH (NOEXPAND) در دستور FROM از query که می‌خواهید view در آن استفاده شود، استفاده کنید. درست مانند query زیر:

SELECT 
    * 
FROM
    production.product_master WITH (NOEXPAND)
ORDER BY
    product_name;

در نتیجه، چگونگی ایجاد یک view شاخص یا index دار در SQL Server مناسب برای جداولی که خیلی کم نیاز به به روز رسانی داده‌هایشان دارند و به منظور بهبود عملکرد query، آشنا شدید.

خلاصه

در این جلسه به مبحث شیرین و جذاب Viewها در SQL Server پرداختیم. تعریف کردیم که view چیست، هدفش چیست، کجا و چگونه استفاده می‌شود و انواع روش‌های استفاده از آن را همراه با مثال به شما آموختیم.

مباحثی که در این جلسه پوشش داده شدند عبارت بودند از ایجاد یک view جدید، تغییر نام view، لیست کردن viewها، به دست آوردن اطلاعات از view، حذف view و ایجاد view شاخص دار. در جلسه بعدی به صورت کامل به بررسی indexها در SQL Server خواهیم پرداخت.

با MUG همراه باشید!

منبع: sqlservertutorial

 مطالب مرتبط

۱۳ دستور مهم SQL که هر برنامه‌نویس باید بداند
چگونه از حملات نفوذ کننده به SQL جلوگیری کنیم؟
 طبقه بندی زبان های برنامه نویسی
روش‌های هوشمندانه برای استفاده از "تلفیق" در SQL
 LINQ(زبان جستجوی یکپارچه)
برنامه نویسی شیءگرا چیست؟

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامع SQL Server (جلسه ۱۲)
آموزش جامع SQL Server (جلسه ۱۲)

دستور UPDATE در SQL Server برای تغییر داده‌های موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

آموزش جامع SQL Server (جلسه ۱۵)
آموزش جامع SQL Server (جلسه ۱۵)

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفاده‌ای ندارد را حذف کنید. برای ...

آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)
آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...

آخرین دیدگاه ها

دیدگاه خود را درباره این پست بنویسید

فرم ارسال نظرات