ابراهیم حمزه
ابراهیم حمزه
خواندن ۱۰ دقیقه·۵ سال پیش

افزایش سرعت SQL SERVER قسمت ۳ (مفاهیم اولیه Page و DBCC)

این قسمت می‌خوایم کمی عملی کار کنیم تا شاید کمی دوره جزاب بشه

در ابتدا بگم که من از SQL SERVER 2019 استفاده می‌کنم در کنار آن از SQL Server Management Studio 15. اما تمام دستورات از SQL SERVER 2008 به بعد قابل اجرا هستند و فکر می‌کنم 2005 آن هم بتونه این موارد اجرا کنه. و این هم بگم که من نسخه اصلی دارم و CE یا Express نیست.

برای ایجاد دیتابیس از دستور زیر استفاده می‌کنیم.

CREATE DATABASE SqlSample01

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

دستور بعدی sys.sysfiles که یک جدول سیستمی است و هر دیتابیس این جدول داره. اما اگر من دستور زیر اجرا کنم.

همون طور که می‌بینید داره اطلاعات دیتابیس master به من میده در صورتی که من SqlSample01 می‌خوام. برای رفع این مشکل از دستور زیر در ابتدا بعد از ایجاد دیتابیس استفاده می‌کنم.

البته از SP_HELPFILE میتونید استفاده کنید که خود یک SP سیستمی میباشد و اطلاعات جمع و جور‌تری نسبت به sys.sysfiles به ما میده

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

در دستور دیگر جدول Customer‌ها را ایجاد می‌کنیم.

CREATE TABLE Customers( [CustomerID] [nchar](5), [CompanyName] [nvarchar](40), [ContactName] [nvarchar](30), [ContactTitle] [nvarchar](30), ) GO

نکته: اگر دستور بالا را اجزا کنید با صفحه‌ی زیر روبرو می‌شوید. احتمالا کمی برای شما آزاردهنده است(اگر اهل کیبورد باشید و کمتر با ماوس کار کنید که دیگر هیچ). برای مخفی کردن آن می‌توانید از کلید میانبر Ctrl + R استفاده کنید.

دستور درج اطلاعات

INSERT INTO Customers (CustomerID, CompanyName, ContactName, ContactTitle) VALUES (1, 'CompanyName1', 'ContactName1', 'ContactTitle1'), (2, 'CompanyName2', 'ContactName2', 'ContactTitle2'), (3, 'CompanyName3', 'ContactName3', 'ContactTitle3'), (4, 'CompanyName4', 'ContactName4', 'ContactTitle4'), (5, 'CompanyName5', 'ContactName5', 'ContactTitle5') GO

خوب تمام این موارد گام به گام با هم اومدیم تا درباره‌ی درستور زیر با هم صحبت کنیم.

DBCC IND ('SqlSample01', 'Customers', 1)

DBCC دستور پر کاردی است و ما هم در آینده بیشتر ازش استفاده می‌کنیم چون اطلاعات زیادی درباره‌ی موارد مورد نیاز ما به ما می‌دهد. اما ما در اینجا با کمک این دستور می‌خواهیم بررسی کنیم جدول ایجاد شده ما در چند Page قرار گرفته و اطلاعات به چه شکلی درش ذخیره شده. اطلاعات بیشتر

پارامتر اول این دستور، نام دیتابیس را دریافت می‌کند و پارامتر دوم نام جدول را اما پارامتر سوم پیش‌فرض این دستور است.

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

درباره‌ی دستورات DBCC سرچ کنید و از مستندات مایکروسافت استفاده کنید حتما.

حال که ما متوجه شدیم جدول مورد استفاده‌ی ما یک Page دارد، برای مشاهده‌ی محتوای آن Page باید از دستور زیر استفاده کرد.

DBCC PAGE ('SqlSample01', 1, 264, 3)

پارامتر اول آن نام دیتابیس است و پارامتر دوم آن Page File Id است(یا PagePID) که ما از طریق دستور قبل به آن‌ها رسیدیم. پارامتر سوم آن نیز PagePID و پارمتر چهارم آن نمایان‌گر درخواست ما برای واکشی اطلاعات به حافظه است. اما اجرای آن با پیام زیر روبرو می‌شود.

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

برای رفع آن و امکان مشاهده اطلاعات اصلی باید از Flag زیر استفاده کرد تا بتوانیم اطلاعات را ردیابی کنیم.

DBCC TRACEON(3604)

با اجرای این دستور و بعد اجرای دستور قبل با خروجی باینری روبرو می‌شویم. آن هم همان اطلاعاتی است که خود SQL SERVER از آن استفاده می‌کند و بیشتر برای او قابل فهم است تا برای ما. البته می‌توایند اطلاعات ذخیره شده‌ی ما را هم آن‌جا پیدا کنید اما اطلاعات پراکنده شده‌اند.

PAGE: (1:264) BUFFER: BUF @0x0000019AF63B1140 bpage = 0x0000019AD2AA8000 bPmmpage = 0x0000000000000000 bsort_r_nextbP = 0x0000019AF63B2A10 bsort_r_prevbP = 0x0000019AF63B2A00 bhash = 0x0000000000000000 bpageno = (1:264) bpart = 0 ckptGen = 0x0000000000000000 bDirtyRefCount = 0 bstat = 0x10b breferences = 0 berrcode = 0 bUse1 = 9206 bstat2 = 0x0 blog = 0x212121cc bsampleCount = 0 bIoCount = 0 resPoolId = 0 bcputicks = 0 bReadMicroSec = 15313 bDirtyContext = 0x0000019AEE55D2C0 bDbPageBroker = 0x0000000000000000 bdbid = 8 bpru = 0x0000019ADBD10040 PAGE HEADER: Page @0x0000019AD2AA8000 m_pageId = (1:264) m_headerVersion = 1 m_type = 1 m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000 m_objId (AllocUnitId.idObj) = 179 m_indexId (AllocUnitId.idInd) = 256 Metadata: AllocUnitId = 72057594049658880 Metadata: PartitionId = 72057594043170816 Metadata: IndexId = 0 Metadata: ObjectId = 581577110 m_prevPage = (0:0) m_nextPage = (0:0) pminlen = 14 m_slotCnt = 5 m_freeCnt = 7591 m_freeData = 591 m_reservedCnt = 0 m_lsn = (37:397:31) m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 m_tornBits = 0 DB Frag ID = 1 Allocation Status GAM (1:2) = ALLOCATED SGAM (1:3) = NOT ALLOCATED PFS (1:1) = 0x41 ALLOCATED 50_PCT_FULL DIFF (1:6) = CHANGED ML (1:7) = NOT MIN_LOGGED Slot 0 Offset 0x60 Length 99 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Size = 99 Memory Dump @0x0000005CF6778060 0000000000000000: 30000e00 31002000 20002000 20000400 00030031 0...1. . . . ......1 0000000000000014: 00490063 0043006f 006d0070 0061006e 0079004e .I.c.C.o.m.p.a.n.y.N 0000000000000028: 0061006d 00650031 0043006f 006e0074 00610063 .a.m.e.1.C.o.n.t.a.c 000000000000003C: 0074004e 0061006d 00650031 0043006f 006e0074 .t.N.a.m.e.1.C.o.n.t 0000000000000050: 00610063 00740054 00690074 006c0065 003100 .a.c.t.T.i.t.l.e.1. Slot 0 Column 1 Offset 0x4 Length 10 Length (physical) 10 CustomerID = 1 Slot 0 Column 2 Offset 0x19 Length 24 Length (physical) 24 CompanyName = CompanyName1 Slot 0 Column 3 Offset 0x31 Length 24 Length (physical) 24 ContactName = ContactName1 Slot 0 Column 4 Offset 0x49 Length 26 Length (physical) 26 ContactTitle = ContactTitle1 Slot 1 Offset 0xc3 Length 99 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Size = 99 Memory Dump @0x0000005CF67780C3 0000000000000000: 30000e00 32002000 20002000 20000400 00030031 0...2. . . . ......1 0000000000000014: 00490063 0043006f 006d0070 0061006e 0079004e .I.c.C.o.m.p.a.n.y.N
0000000000000028: 0061006d 00650032 0043006f 006e0074 00610063 .a.m.e.2.C.o.n.t.a.c
000000000000003C: 0074004e 0061006d 00650032 0043006f 006e0074 .t.N.a.m.e.2.C.o.n.t
0000000000000050: 00610063 00740054 00690074 006c0065 003200 .a.c.t.T.i.t.l.e.2.
Slot 1 Column 1 Offset 0x4 Length 10 Length (physical) 10 CustomerID = 2 Slot 1 Column 2 Offset 0x19 Length 24 Length (physical) 24 CompanyName = CompanyName2 Slot 1 Column 3 Offset 0x31 Length 24 Length (physical) 24 ContactName = ContactName2 Slot 1 Column 4 Offset 0x49 Length 26 Length (physical) 26 ContactTitle = ContactTitle2 Slot 2 Offset 0x126 Length 99 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Size = 99 Memory Dump @0x0000005CF6778126 0000000000000000: 30000e00 33002000 20002000 20000400 00030031 0...3. . . . ......1 0000000000000014: 00490063 0043006f 006d0070 0061006e 0079004e I.c.C.o.m.p.a.n.y.N 0000000000000028: 0061006d 00650033 0043006f 006e0074 00610063 a.m.e.3.C.o.n.t.a.c 000000000000003C: 0074004e 0061006d 00650033 0043006f 006e0074 .t.N.a.m.e.3.C.o.n.t 0000000000000050: 00610063 00740054 00690074 006c0065 003300 .a.c.t.T.i.t.l.e.3. Slot 2 Column 1 Offset 0x4 Length 10 Length (physical) 10 CustomerID = 3 Slot 2 Column 2 Offset 0x19 Length 24 Length (physical) 24 CompanyName = CompanyName3 Slot 2 Column 3 Offset 0x31 Length 24 Length (physical) 24 ContactName = ContactName3 Slot 2 Column 4 Offset 0x49 Length 26 Length (physical) 26 ContactTitle = ContactTitle3 Slot 3 Offset 0x189 Length 99 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Size = 99 Memory Dump @0x0000005CF6778189 0000000000000000: 30000e00 34002000 20002000 20000400 00030031 0...4. . . . ......1 0000000000000014: 00490063 0043006f 006d0070 0061006e 0079004e .I.c.C.o.m.p.a.n.y.N 0000000000000028: 0061006d 00650034 0043006f 006e0074 00610063 .a.m.e.4.C.o.n.t.a.c 000000000000003C: 0074004e 0061006d 00650034 0043006f 006e0074 .t.N.a.m.e.4.C.o.n.t 0000000000000050: 00610063 00740054 00690074 006c0065 003400 .a.c.t.T.i.t.l.e.4. Slot 3 Column 1 Offset 0x4 Length 10 Length (physical) 10 CustomerID = 4 Slot 3 Column 2 Offset 0x19 Length 24 Length (physical) 24 CompanyName = CompanyName4 Slot 3 Column 3 Offset 0x31 Length 24 Length (physical) 24 ContactName = ContactName4 Slot 3 Column 4 Offset 0x49 Length 26 Length (physical) 26 ContactTitle = ContactTitle4 Slot 4 Offset 0x1ec Length 99 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Size = 99 Memory Dump @0x0000005CF67781EC 0000000000000000: 30000e00 35002000 20002000 20000400 00030031 0...5. . . . ......1 0000000000000014: 00490063 0043006f 006d0070 0061006e 0079004e .I.c.C.o.m.p.a.n.y.N 0000000000000028: 0061006d 00650035 0043006f 006e0074 00610063 .a.m.e.5.C.o.n.t.a.c 000000000000003C: 0074004e 0061006d 00650035 0043006f 006e0074 .t.N.a.m.e.5.C.o.n.t 0000000000000050: 00610063 00740054 00690074 006c0065 003500 .a.c.t.T.i.t.l.e.5. Slot 4 Column 1 Offset 0x4 Length 10 Length (physical) 10 CustomerID = 5 Slot 4 Column 2 Offset 0x19 Length 24 Length (physical) 24 CompanyName = CompanyName5 Slot 4 Column 3 Offset 0x31 Length 24 Length (physical) 24 ContactName = ContactName5 Slot 4 Column 4 Offset 0x49 Length 26 Length (physical) 26 ContactTitle = ContactTitle5 DBCC execution completed. If DBCC printed error messages, contact your system administrator. Completion time: 2020-03-12T02:01:07.1936969+03:30
full stack web Developer- علاقه‌مند به SQL Server و چالش افزایش سرعت- علاقه‌مند به After Effect و Adobe Audition
شاید از این پست‌ها خوشتان بیاید