مثالهای عملی
مثال 1: ساخت پایه روی ستون پرتکرار با CREATE INDEX ... WITH (DROP_EXISTING = ON)
یک مسیر دسترسی اولیه برای جستوجوی پرتکرار ساخته میشود و سپس متادیتای آن کنترل میگردد. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE1', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE1;
CREATE TABLE dbo.DemoDropExistingE1
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE1
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E1
ON dbo.DemoDropExistingE1(CustomerID);
CREATE INDEX IX_DemoDropExisting_E1
ON dbo.DemoDropExistingE1(CustomerID, OrderDate) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE1')
AND name = N'IX_DemoDropExisting_E1';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE1
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E1 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: این الگو نقطه شروع است؛ در سامانه واقعی باید انتخاب ستون با Execution Plan و آمار مصرف تأیید شود. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 2: کلید مرکب برای جستوجوی چندشرطی با CREATE INDEX ... WITH (DROP_EXISTING = ON)
دو ستون با ترتیب هدفمند در تعریف ایندکس قرار میگیرند تا شرطهای ترکیبی و مرتبسازی رایج پوشش داده شوند. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE2', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE2;
CREATE TABLE dbo.DemoDropExistingE2
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE2
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E2
ON dbo.DemoDropExistingE2(CustomerID);
CREATE INDEX IX_DemoDropExisting_E2
ON dbo.DemoDropExistingE2(CustomerID, OrderDate DESC) INCLUDE (Amount) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE2')
AND name = N'IX_DemoDropExisting_E2';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE2
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E2 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: ستون سمت چپ کلید نقش تعیینکننده دارد و تغییر ترتیب ستونها میتواند شکل Seek را عوض کند. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 3: پشتیبانی از مرتبسازی نزولی با CREATE INDEX ... WITH (DROP_EXISTING = ON)
تعریف ایندکس با ترتیب نزولی برای گزارشهایی بررسی میشود که تازهترین دادهها را در ابتدای نتیجه میخواهند. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE3', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE3;
CREATE TABLE dbo.DemoDropExistingE3
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE3
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E3
ON dbo.DemoDropExistingE3(CustomerID);
CREATE INDEX IX_DemoDropExisting_E3
ON dbo.DemoDropExistingE3(OrderDate DESC, CustomerID) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE3')
AND name = N'IX_DemoDropExisting_E3';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE3
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E3 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: جهت کلید زمانی مهمتر میشود که Query ترکیبی از چند ستون با جهتهای متفاوت داشته باشد. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 4: استفاده در شرط و اتصال جدولها با CREATE INDEX ... WITH (DROP_EXISTING = ON)
نمونهای نزدیک به گزارش عملی ساخته میشود تا نقش ایندکس در Predicate و Join یا بازیابی ردیفهای هدف دیده شود. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE4', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE4;
CREATE TABLE dbo.DemoDropExistingE4
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE4
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E4
ON dbo.DemoDropExistingE4(CustomerID);
CREATE INDEX IX_DemoDropExisting_E4
ON dbo.DemoDropExistingE4(Status, CustomerID) INCLUDE (Amount) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE4')
AND name = N'IX_DemoDropExisting_E4';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE4
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E4 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: وجود ایندکس تضمین استفاده از آن نیست؛ Optimizer بر پایه آمار، تعداد ردیف و هزینه تخمینی تصمیم میگیرد. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 5: تنظیم گزینههای ساخت و نگهداری با CREATE INDEX ... WITH (DROP_EXISTING = ON)
یکی از گزینههای متداول ساخت ایندکس مانند FILLFACTOR، SORT_IN_TEMPDB یا فشردهسازی در یک سناریوی کنترلشده نمایش داده میشود. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE5', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE5;
CREATE TABLE dbo.DemoDropExistingE5
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE5
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E5
ON dbo.DemoDropExistingE5(CustomerID);
CREATE INDEX IX_DemoDropExisting_E5
ON dbo.DemoDropExistingE5(CustomerID) INCLUDE (OrderDate, Amount) WITH (DROP_EXISTING = ON, FILLFACTOR = 90);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE5')
AND name = N'IX_DemoDropExisting_E5';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE5
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E5 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: هر گزینه هزینه و پیشنیاز خود را دارد؛ مقدار مناسب باید با نسخه SQL Server، Edition و الگوی بار واقعی آزموده شود. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 6: رفتار با NULL و دادههای اختیاری با CREATE INDEX ... WITH (DROP_EXISTING = ON)
دادهای دارای مقدار NULL وارد میشود تا اثر آن بر تعریف، انتخابپذیری و نتیجه Query روشن شود. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE6', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE6;
CREATE TABLE dbo.DemoDropExistingE6
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE6
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E6
ON dbo.DemoDropExistingE6(CustomerID);
CREATE INDEX IX_DemoDropExisting_E6
ON dbo.DemoDropExistingE6(Status, CustomerID) INCLUDE (ExternalCode) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE6')
AND name = N'IX_DemoDropExisting_E6';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE6
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E6 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: NULL مقدار عادی نیست و قواعد یکتایی، فیلتر و برآورد Cardinality را باید آگاهانه بررسی کرد. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 7: سناریوی مرزی با دامنه تاریخی با CREATE INDEX ... WITH (DROP_EXISTING = ON)
یک بازه تاریخی و حجم منطقی داده برای نشاندادن اثر ترتیب کلید، فیلتر یا Segment Elimination به کار میرود. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE7', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE7;
CREATE TABLE dbo.DemoDropExistingE7
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE7
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E7
ON dbo.DemoDropExistingE7(CustomerID);
CREATE INDEX IX_DemoDropExisting_E7
ON dbo.DemoDropExistingE7(OrderDate, CustomerID) INCLUDE (Amount) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE7')
AND name = N'IX_DemoDropExisting_E7';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE7
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E7 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: در بازههای بسیار بزرگ، بهروز بودن Statistics و هماهنگی نوع پارامتر با نوع ستون اهمیت ویژه دارد. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 8: گزارش سازمانی و ستونهای خروجی با CREATE INDEX ... WITH (DROP_EXISTING = ON)
نمونه گزارش فروش یا عملیات با چند ستون خروجی ارائه میشود تا مرز میان کلید جستوجو و داده موردنیاز نمایش مشخص شود. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE8', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE8;
CREATE TABLE dbo.DemoDropExistingE8
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE8
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E8
ON dbo.DemoDropExistingE8(CustomerID);
CREATE INDEX IX_DemoDropExisting_E8
ON dbo.DemoDropExistingE8(CustomerID, Status) INCLUDE (OrderDate, Amount, Description) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE8')
AND name = N'IX_DemoDropExisting_E8';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE8
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E8 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: هدف کاهش خواندن صفحه و حذف عملیات اضافه است، نه افزودن همه ستونهای جدول به هر ایندکس. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 9: روش اشتباه و نسخه اصلاحشده با CREATE INDEX ... WITH (DROP_EXISTING = ON)
یک خطای طراحی رایج ابتدا در Comment توضیح داده میشود و سپس تعریف اصلاحشده و قابل اجرا قرار میگیرد. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE9', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE9;
CREATE TABLE dbo.DemoDropExistingE9
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE9
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
-- روش اشتباه: ساخت ایندکس بسیار عریض بدون بررسی الگوی Query
-- نسخه اصلاحشده و هدفمند در ادامه اجرا میشود.
CREATE INDEX IX_DemoDropExisting_E9
ON dbo.DemoDropExistingE9(CustomerID);
CREATE INDEX IX_DemoDropExisting_E9
ON dbo.DemoDropExistingE9(CustomerID, OrderDate) INCLUDE (Amount, Description) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE9')
AND name = N'IX_DemoDropExisting_E9';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE9
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E9 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: بازبینی نام، نوع داده، ترتیب ستون و قابلیتهای مجاز پیش از اجرای DDL از خطا و Downtime جلوگیری میکند. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.
مثال 10: کنترل نتیجه و سنجش کارایی با CREATE INDEX ... WITH (DROP_EXISTING = ON)
پس از ساخت، نمای سیستمی و یک Query نمونه برای کنترل نوع ایندکس و آمادهسازی ارزیابی کارایی استفاده میشوند. در این مثال، هدف عملی جایگزینی تعریف ایندکس موجود در یک عملیات کنترلشده برای تغییر کلید، INCLUDE یا نوع ساختار است.
IF OBJECT_ID(N'dbo.DemoDropExistingE10', N'U') IS NOT NULL
DROP TABLE dbo.DemoDropExistingE10;
CREATE TABLE dbo.DemoDropExistingE10
(
RowID int IDENTITY(1,1) NOT NULL,
CustomerID int NOT NULL,
ExternalCode varchar(30) NULL,
OrderDate date NOT NULL,
Status tinyint NULL,
Amount decimal(12,2) NOT NULL,
Description nvarchar(200) NULL
);
INSERT INTO dbo.DemoDropExistingE10
(CustomerID, ExternalCode, OrderDate, Status, Amount, Description)
VALUES
(101, 'A-1001', '2026-07-01', 1, 125000.00, N'سفارش فعال'),
(102, 'A-1002', '2026-07-12', 2, 84000.00, N'سفارش بسته'),
(101, 'A-1003', '2026-07-20', NULL, 99000.00, N'در انتظار بررسی');
CREATE INDEX IX_DemoDropExisting_E10
ON dbo.DemoDropExistingE10(CustomerID);
CREATE INDEX IX_DemoDropExisting_E10
ON dbo.DemoDropExistingE10(CustomerID, OrderDate DESC) INCLUDE (Status, Amount) WITH (DROP_EXISTING = ON);
SELECT name, type_desc, is_unique, has_filter
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.DemoDropExistingE10')
AND name = N'IX_DemoDropExisting_E10';
SELECT CustomerID, OrderDate, Amount
FROM dbo.DemoDropExistingE10
WHERE CustomerID = 101
ORDER BY OrderDate DESC;
| نام یا شاخص کنترل | نوع مورد انتظار | نتیجه نمونه |
|---|
| IX_DemoDropExisting_E10 | REPLACED NONCLUSTERED | تعریف در نمای سیستمی قابل مشاهده است و Query کنترل بدون خطای ساختاری اجرا میشود. |
نکته کاربردی: نتیجه نهایی باید با Actual Execution Plan، STATISTICS IO و زمان اجرا در محیط آزمایشی مقایسه شود. برای بازسازی یا تغییر ایندکس با DROP_EXISTING همچنین باید برآورد Log، فضای موقت، قفل، گزینه ONLINE و برنامه بازگشت در محیط عملیاتی را در بازبینی نهایی ثبت کرد.