دسته بندی ها
01:49 1399/11/30

مشکل کند بودن کویری Select Max در SQL Server

مشخصات سوال کننده :
کاربر : MohammadH     امتیاز کاربر : 18     رتبه کاربر : 40
دسته بندی : Entity Framework Sql Server

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 3078
1 نظر
MohammadH : Please Help?

امتیاز کاربر : 18   رتبه کاربر : 40   تاریخ ثبت : 02:55 1399/11/30
هوش مصنوعی

پاسخ هوش مصنوعی

برای بهبود عملکرد کویری های شما، می توانید چند نکته را در نظر بگیرید:

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` برای جلوگیری از هرگونه مشکل قفل گذاری استفاده شده است.

با این روش ممکن است بهینه سازی های بیشتری نیز حاصل شود. همچنین هرگاه که اجرای کویری ها دیرتر از حد معمول شد، حتماً بررسی کنید که آیا درخاست های دیگر یا قفل هایی در حال حاضر در سیستم وجود دارد یا خیر.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 22:31 1399/11/30

خب چرا شما فیلد Number رو به صورت Identity توی Sql Server ایجاد نمی کنید؟ در این صورت به صورت اتوماتیک مقدارش 1 واحد افزایش پیدا می کنه و نیازی به هیچ دستوری هم ندارید.

 

اما اگر در مجموع نمی خواید که از آیدنتیتی استفاده کنید میتونید کوئری خودتون رو به این صورت بنویسید.

Select Top 1 Number From Table Order By Number Desc

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

به این پاسخ امتیاز بدهید    1
امتیاز: 1635 رتبه: 2
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود