TEXTSIZE SQL Server: بهینهسازی عملکرد با محدود کردن حجم دادههای بازگشتی
در محیطهای پایگاه داده SQL Server، مدیریت کارآمد حافظه و سرعت بازیابی دادهها حیاتی است. دستور `TEXTSIZE` یکی از ابزارهای کمتر شناخته شده اما قدرتمندی است که به شما امکان میدهد میزان دادههای بازگشتی برای ستونهای `TEXT`، `NTEXT` و `IMAGE` را از یک عبارت `SELECT` محدود کنید. این قابلیت میتواند در سناریوهایی که با مقادیر بسیار بزرگ این نوع دادهها سر و کار دارید و نمیخواهید کل محتوا را به حافظه یا ابزارهای کلاینت منتقل کنید، به شدت مفید باشد. به صورت پیشفرض، `TEXTSIZE` در SQL Server برای ستونهای `TEXT` و `NTEXT` مقداری برابر با 4096 بایت (4 کیلوبایت) و برای ستونهای `IMAGE` مقداری برابر با 2147483647 بایت (2 گیگابایت) دارد، که این مقادیر میتوانند بر اساس نیاز شما تغییر کنند.
برای تنظیم مقدار `TEXTSIZE` در SQL Server، میتوانید از دستور `SET TEXTSIZE` استفاده کنید. این مقدار بر حسب بایت تعیین میشود و برای ستونهای `TEXT`, `NTEXT` و `IMAGE` در طول نشست فعلی (current session) اعمال خواهد شد. به عنوان مثال، برای محدود کردن حجم داده به 100 بایت، به این صورت عمل میکنید:
SET TEXTSIZE 100;
با تنظیم این مقدار، هر عملیات `SELECT` که روی ستونهای `TEXT`, `NTEXT` یا `IMAGE` انجام شود، تنها تا 100 بایت اول داده را بازگرداند و مابقی را کوتاه میکند. این یک راه عالی برای جلوگیری از انتقال حجم زیادی از دادههای غیرضروری به برنامههای کلاینت یا ابزارهای مدیریتی مانند SQL Server Management Studio (SSMS) است که میتواند به بهبود عملکرد و کاهش مصرف منابع کمک کند.
شما میتوانید مقدار فعلی `TEXTSIZE` را در هر زمان با استفاده از متغیر سراسری `@@TEXTSIZE` بررسی کنید. این متغیر، مقدار فعلی `TEXTSIZE` را برای نشست کنونی شما برمیگرداند.
برای مشاهده مقدار `TEXTSIZE` که در حال حاضر فعال است، میتوانید از دستور زیر استفاده کنید:
SELECT @@TEXTSIZE;
این دستور یک عدد را برمیگرداند که نشاندهنده حداکثر تعداد بایتهایی است که در حال حاضر برای ستونهای `TEXT`، `NTEXT` و `IMAGE` در نشست شما مجاز است.
برای درک بهتر نحوه عملکرد `TEXTSIZE`، اجازه دهید یک جدول آزمایشی ایجاد کنیم که شامل یک ستون از نوع `TEXT` باشد و سپس آن را با دادههای طولانی پر کنیم. سپس با استفاده از `TEXTSIZE` تأثیر آن را بر روی خروجی `SELECT` مشاهده خواهیم کرد. ابتدا یک جدول موقت ایجاد میکنیم:
CREATE TABLE #TEXTTEST (ID INT, LONGTEXT TEXT);
پس از ایجاد جدول، یک رشته متنی بسیار طولانی را در ستون `LONGTEXT` وارد میکنیم. این رشته به اندازهای طولانی است که فراتر از محدودیتهای `TEXTSIZE` پیشفرض یا مقادیر کوچکی که تنظیم میکنیم باشد.
INSERT INTO #TEXTTEST VALUES (1, REPLICATE('A', 5000));
در حالت عادی و بدون تنظیم `TEXTSIZE` به مقدار کوچک، اگر ستون `LONGTEXT` را انتخاب کنیم، کل محتوای 5000 کاراکتری بازگردانده میشود. این کار میتواند برای شبکههای با پهنای باند کم یا برنامههایی که فقط به قسمتی از داده نیاز دارند، کارایی را کاهش دهد.
برای مشاهده تمام دادههای وارد شده در ستون `LONGTEXT` بدون هیچ محدودیتی، از دستور `SELECT` استاندارد استفاده میکنیم:
SELECT LONGTEXT FROM #TEXTTEST;
حال، بیایید `TEXTSIZE` را به یک مقدار کوچکتر، مثلاً 100 بایت، تنظیم کنیم. این کار باعث میشود که تنها 100 بایت اول از ستون `LONGTEXT` بازیابی شود، حتی اگر دادههای اصلی بسیار طولانیتر باشند. این میتواند در سناریوهایی که میخواهید فقط قسمتی از دادهها را برای پیشنمایش یا پردازش جزئی دریافت کنید، بسیار مفید باشد.
پس از تنظیم `TEXTSIZE` به 100، مجدداً ستون `LONGTEXT` را انتخاب میکنیم. این بار، مشاهده خواهید کرد که تنها بخش کوچکی از رشته اصلی بازگردانده میشود که 100 بایت اول آن است:
SET TEXTSIZE 100;
SELECT LONGTEXT FROM #TEXTTEST;
مهم است بدانید که `TEXTSIZE` فقط بر ستونهای از نوع `TEXT`، `NTEXT` و `IMAGE` تأثیر میگذارد. این دستور **بر روی ستونهای `VARCHAR(MAX)`، `NVARCHAR(MAX)` یا `VARBINARY(MAX)` تأثیری ندارد**. این ستونهای نوع MAX برای نگهداری مقادیر بزرگ طراحی شدهاند و رفتار متفاوتی در مدیریت حافظه و بازیابی دارند. همچنین، مقدار `TEXTSIZE` فقط در طول نشست فعلی فعال است؛ به این معنی که اگر اتصال خود را به SQL Server قطع و دوباره وصل کنید، `TEXTSIZE` به مقدار پیشفرض خود بازمیگردد. تنظیم این مقدار در محیطهای توسعه و تست برای شبیهسازی محدودیتهای حافظه یا شبکه میتواند بسیار سودمند باشد. به خاطر داشته باشید که SSMS و سایر ابزارهای کلاینت نیز این محدودیت را رعایت میکنند. در صورت نیاز به خواندن بخشهای خاصی از دادههای بزرگتر از مقدار `TEXTSIZE`، میتوانید از توابع مانند `SUBSTRING` به همراه `OFFSET` و `FETCH` استفاده کنید.
در پایان، برای پاکسازی منابع و حذف جدول موقت ایجاد شده، از دستور `DROP TABLE` استفاده میکنیم:
DROP TABLE #TEXTTEST;