tgoop.com/sql_server/820
Last Update:
امروز داشتم به مانیتورینگ نگاه می کردم ، دیدم توی یک بازه یک دفعه CPU به شدت رفته بالا و Wait ها هم زیاد بودن.
بررسی کردم دیدم یک کدی هست که یک دفعه ظاهر شده و تعداد دفعات اجراش زیاده.
زمان اجرای کد حدودا ۲ دقیقه بود و همچنین Logical Read بیش از ۲ میلیون داشت.
همچنین CPU هم به شدت درگیر شده بود.
اومدم پلن کد رو بررسی کردم . دیدم عزیز دل ، جان جانان ، آقامون SQL Server 😁 داره یک هشدار زیبای Implicit Convert میده.
دیدم توی شرط دوتا فیلد دارن باهم چک میشن که یکی bigint بود و یکی Nvarchar . همین باعث شده بود که پلن درستی ایجاد نشه و از ایندکس روی اون فیلد بهره نبره و کل جدول هربار اسکن بشه .
با تغییر اون فیلد Nvarchar به Bigint ( به خاطر اینکه داده هاشون یکی بودن و نیازی به Nvarchar نبود) زمان اجرای کد مربوطه شد ۲۰۰ میلی ثانیه و Logical Read به زیر ۱۰۰ رسید.
حالا این دوست عزیز Implicit Convert چیست؟
زمانی که توی شرط ها فیلدی که قراره جستجو بشه ،نوع داده اش با نوع داده ای که داره بهش پاس داده میشه برابر نباشه، SQL Server میاد اینهارو بهم تبدیل میکنه.
همین باعث میشه یک فاجعه رخ بده. یعنی چی؟ دیگه اون جداول آماری Statistics مورد استفاده قرار نمیگیره و کل جدول رو مورد عنایت قرار میده. 😂
به همین راحتی کدتون میتونه یک فاجعه ای مثل کد بالا رو خلق کنه.
BY SQL Server
Share with your friend now:
tgoop.com/sql_server/820