<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های سروش ق.</title><link>https://virgool.ir/feed/@ghahremani.soroush</link><description>مهندس نرم افزار&#xA;فعال در زمینه داده، مدیریت دیتابیس، پردازش و تحلیل داده&#xA;گاهی Power BI&#xA;و گاهی عکاس</description><language>fa</language><pubDate>2026-11-12 11:00:17</pubDate><image><url>https://files.virgool.ir/upload/users/4007443/avatar/avatar.png</url><title>سروش ق.</title><link>https://virgool.ir/@ghahremani.soroush</link></image><item><title>CURSOR تو SQL Server: فرشته نجات یا قاتل پرفورمنس؟!</title><link>https://virgool.ir/@ghahremani.soroush/sqlservercursor-lzqvl3djztxs</link><description>تا حالا شده بخوای تو SQL Server داده‌هاتو ردیف‌به‌ردیف بررسی کنی؟ مثلاً بری سراغ هر مشتری، ببینی چقدر خرید کرده، یه شرطی بزاری، یه پیامی براش بسازی یا حتی رکوردش رو آپدیت کنی؟ خب، اینجا جاییه که پای CURSOR وسط میاد.حالا CURSOR چیه؟ یه جور حلقه‌ست! یعنی می‌تونی باهاش رکوردها رو یکی‌یکی بخونی، کاری روشون انجام بدی، بعد بری سراغ بعدی. اما صبر کن! قبل از اینکه عاشقش بشی، باید بدونی که CURSOR یه شمشیر دولبه‌ست!این CURSOR چطوری کار می‌کنه؟به زبان خیلی ساده:اول تعریفش می‌کنی (می‌گی چه داده‌هایی رو می‌خوای بخونی)،بازش می‌کنی،شروع می‌کنی رکوردها رو یکی‌یکی گرفتن،کارتو انجام می‌دی،آخرشم که درش میاری! (ببندش و منابعشو آزاد کن)،یه مثال سریع:فرض کن یه جدول به اسم Employees داریم://DECLARE @Name NVARCHAR(100)DECLARE EmployeeCursor CURSOR FORSELECT FullName FROM EmployeesOPEN EmployeeCursorFETCH NEXT FROM EmployeeCursor INTO @NameWHILE @@FETCH_STATUS = 0BEGIN    PRINT &#39;کارمند: &#39; + @Name    FETCH NEXT FROM EmployeeCursor INTO @NameENDCLOSE EmployeeCursorDEALLOCATE EmployeeCursor//همین‌قدر راحت. یکی‌یکی می‌ره سراغ اسم کارمندا و اسمشون رو چاپ می‌کنه.پس مشکلش چیه؟مشکل اینجاست که CURSOR تو حجم بالای داده‌ها کند عمل می‌کنه. چون برخلاف دستورات Set-Based (که کل جدول رو یه جا پردازش می‌کنن)، CURSOR رکورد به رکورد جلو می‌ره.یه جورایی مثل اینه که به‌جای استفاده از ماشین لباسشویی، بشینی لباسا رو دونه‌دونه با دست بشوری!کِی CURSOR خوبه؟ کِی بد؟✅ وقتی که واقعاً نیاز داری داده‌ها رو دونه‌دونه بررسی کنی. مثلاً:فرستادن پیام شخصی‌سازی‌شده برای هر مشتریبررسی موجودی انبار کالا به صورت جداگانهآپدیت‌های وابسته به رکوردهای قبلی یا بعدی❌ ولی اگه می‌تونی با یه UPDATE یا SELECT ساده کارت راه بیفته، CURSOR فقط سرعت کارت رو کم می‌کنه.حالا بریم چندتا ترفند برای استفاده بهتر از CURSORاگه مجبور شدی استفاده کنی، حداقل:از نوع FAST_FORWARD یا READ_ONLY استفاده کن تا سریع‌تر باشهبعد از کارت حتماً CLOSE و DEALLOCATE کن تا منابع آزاد بشنسعی کن منطق رو طوری طراحی کنی که به CURSOR نیاز نداشته باشی (یعنی Set-Based فکر کن!)مثلاً اینجوری سریع‌تر می‌شه:DECLARE MyCursor CURSOR FAST_FORWARD FORSELECT ProductName FROM Productsیه جمع‌بندی بکنیم:در CURSOR همونقدر که می‌تونه مفید باشه، اگه بی‌جا استفاده بشه می‌تونه قاتل پرفورمنس باشه.قبل از اینکه سمتش بری، از خودت بپرس: &#34;آیا واقعاً راه دیگه‌ای نیست؟!اگه جواب منفی بود، با خیال راحت ازش استفاده کن… ولی هوشمندانه! </description><category>سروش ق.</category><author>سروش ق.</author><pubDate>Mon, 12 May 2025 11:41:25 +0330</pubDate></item></channel></rss>