مشکل کند بودن کویری Select Max در SQL Server
من توی SQL Server یک ستون دارم به اسم Number از نوع عددی
برای هر بار درج رکورد جدید یک شماره جدید باید برای این رکورد که کلید اصلیش Number هست بدم (دارای INDEX نیز هست)
مثال : یک مشتری جدید به نام محمد محمدی با این فلان شماره تلفن درج شود => و حالا اول شماره جدید برای این رکورد بگیر :
SELECT MAX(NUMBER+1) FROM Mytable
و این رکورد رو با این شماره جدید درج کن .
مشکل این کویری اینه که کمتر از یک ثانیه عمل میکنه و مشکلی نداره ولی به صورت نگهانی یک دفعه خیلی کند عمل میکنه به طوری که 11 ثانیه اجرای این کویری طول میکشه
نکته اینه که سرور درگیر نیست فقط یک یوزر که خودم هستم داره استفاده میکنه و اینکه گاهی این دستور کند میشه
مشخصات سرور :
CPU : Core i7
RAM : 8GB DDR4
HDD : 1.5 TB
SQL Server 2014 Enterprise
به شکل های دیگه ای هم امتحان کردم ولی این ها هم فرقی ندارن :
SELECT MAX(CAST(NUMBER+1 AS float)) FROM MyTable
SELECT MAX(NUMBER) FROM MyTable
WHERE NUMBER< 1000000000
SELECT MAX(NUMBER) FROM MyTable
SELECT NUMBER FROM MyTable ORDER BY NUMBER DESC
لطفا در خصوص حل این مشکل راهنمایی بفرمایید
باتشکر
پاسخ هوش مصنوعی
برای بهبود عملکرد کویری های شما، می توانید چند نکته را در نظر بگیرید:
1. **استفاده از Transaction**: اطمینان حاصل کنید که از تراکنش ها به درستی استفاده می کنید تا از قفل گذاری های ناخواسته جلوگیری شود.
2. **جلوگیری از قفل گذاری**: در زمانی که چند کاربر به طور هم زمان در حال درج هستند، قفل گذاری می تواند باعث کند شدن عملکرد شود. به جای استفاده از MAX، می توانید از یک شناسه یکتای خودکار (AUTO_INCREMENT) استفاده کنید.
3. **استفاده از و قابلیت INDEX**: مطمین شوید که ستون `NUMBER` به درستی ایندکس شده است و بررسی کنید که ایندکس ها به طور مداوم در حال به روزرسانی هستند.
4. **جدول های کوچکتر**: اگر ممکن است، اطلاعات مربوط به کاربران را در جداول کوچکتر و جداگانه ای سازماندهی کنید تا زمان کمتری برای جستجو نیاز باشد.
5. **کیفیت سرور**: با توجه به مشخصات سرور شما، زمانی که بار سرور زیاد است، احتمال کند شدن عملکرد بیشتر می شود. بنابراین بررسی بار سرور در زمان های مختلف مهم است.
به عنوان مثال، می توانید از تکه کد زیر برای درج رکورد جدید با شناسه منحصربه فرد استفاده کنید:
DECLARE @NewNumber INT;
SELECT @NewNumber = COALESCE(MAX(NUMBER), 0) + 1 FROM MyTable WITH (UPDLOCK, HOLDLOCK);
INSERT INTO MyTable (NUMBER, CustomerName, PhoneNumber) VALUES (@NewNumber, 'محمد محمدی', '1234567890');
توجه داشته باشید که از `UPDLOCK` و `HOLDLOCK` برای جلوگیری از هرگونه مشکل قفل گذاری استفاده شده است.
با این روش ممکن است بهینه سازی های بیشتری نیز حاصل شود. همچنین هرگاه که اجرای کویری ها دیرتر از حد معمول شد، حتماً بررسی کنید که آیا درخاست های دیگر یا قفل هایی در حال حاضر در سیستم وجود دارد یا خیر.
خب چرا شما فیلد Number رو به صورت Identity توی Sql Server ایجاد نمی کنید؟ در این صورت به صورت اتوماتیک مقدارش 1 واحد افزایش پیدا می کنه و نیازی به هیچ دستوری هم ندارید.
اما اگر در مجموع نمی خواید که از آیدنتیتی استفاده کنید میتونید کوئری خودتون رو به این صورت بنویسید.
Select Top 1 Number From Table Order By Number Desc
دستور بالا فقط یک رکورد بر می گردونه و نباید سرعت رو بیاره پایین. اگر باز هم مشکل سرعت دارید ممکنه ایندکس گذاری که روی این جدول انجام دادید اشتباه باشه. چون ایندکس گذاری اشتباه نه تنها باعث بهینه شدن سرعت کوئری نمیشه بلکه باعث خراب شدن سرعت کوئری هم میشه.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- حذف کامل یک رکورد در جدول ریلیشن شده
- مقایسه ساختار دو دیتابیس در Sql Server
- اشکال در ایجاد کلید خارجی در Sql Server
- تفاوت اوراکل و Sql Server چیست
- رفع خطا در مایگریشن - Specify ON DELETE NO ACTION or ON UPDATE NO ACTION
- جابه جایی سطر و ستون در Sql Server
- استفاده از Stored Procedure در انتیتی فریم ورک code First
- آپدیت لیستی از رکوردها در Sql Server - آپدیت گروهی اطلاعات در Sql Server
- دلیل پرش 1000 تایی خودکار فیلد identity در Sql server
- مشکل نمایش ندادن Data Type موقع تایپ در Sql Server