PDA

View Full Version : سوال: افزایش بیش از حد کلید جدول



Maryam.J
شنبه 24 آبان 1393, 19:39 عصر
سلام بچه ها.
در جدول محصولات من که کلید اصلی id هست، یه مشکلی پیش اومده. شمارشگر ID با اینکه یکی یکی هست، گاهی اوقات خیلی زیاد میشه. مثلا الان یه محصول اضافه کردم، از 9561 رفته به 10554، یا کمی قبل تر از 8583 رفته به 9574، بازم قبلتر از 7575 رفته به 8574!!!
کسی میدونه دلیل چی میتونه باشه؟؟ جدول خالیه و احتمال هک شدن پایینه!
تشکر

Maryam.J
شنبه 24 آبان 1393, 19:51 عصر
پشتیبانی هاست این پاسخ رو داده:


در SQL Server 2012 مدیریت Identity ها تغییراتی داشته است و به شیوه ی جدید انجام می شود که باعث به وجود آمدن گسستگی در مقادیر Identity می شود. این تغییرات، باگ یا مشکل محسوب نمی شوند (به طور کلی مقادیر Identity لزوما پیوسته تولید نمی شوند، همان طور که با حذف یک رکورد این مقادیر گسسته خواهند شد)
بازگرداندن مدیریت Identity ها به شیوه ی قدیمی باعث تاثیر منفی بر پرفورمنس سرویس SQL Server شده و به همین دلیل این تغییر انجام نخواهد شد. با این حال راه حل های زیر برای حل مشکلات احتمالی پیشنهاد می شود:

- مقادیر را به صورت دستی و با توجه به آی دی آخرین رکورد تولید کنید.
- در تعداد رکورد های بالا، از نوع داده ای BIGINT استفاده نمایید.
- برای کلید های اصلی از نوع داده ای UNIQUEIDENTIFIER استفاده نمایید.
- برای فیلد هایی مانند ردیف از شناسه ی Identity استفاده ننمایید (فیلد ردیف را به صورت پویا و در هنگام نمایش اضافه کرده یا به صورت جداگانه، جدای از Id در دیتابیس ایجاد نمایید)


نظر دوستان چیه؟

saeed410
شنبه 24 آبان 1393, 23:37 عصر
سلام. من هنوز توفیق کار کردن با sql server 2012 رو پیدا نکردم. ممکنه این چیزی که دوستمون میگه درست باشه. ولی زمانی که یک فیلد رو Identity در نظر میگیریم یک identity increment و seed داره. seed مقدار اولیه و increment گام افزایش است. این دوتا رو درست تنظیم کردید؟اگه درسته احتمالاً حق با این دوستمونه.

ghossein
یک شنبه 25 آبان 1393, 00:03 صبح
سلام
خسته نباشید

به نظر من ، بهترین راه برای تعیین آی دی ، برای یک محصول جدید ، تعیین یک ستون با نوع BigInt و پیدا کردن بزرگترین مقدار این ستون با استفاده از تابع Max و سپس جمع زدن با یک عدد هست. این راه حل میتونه به عنوان یک تابع در SqlServer نوشته بشه یا به عنوان یک متد در یک کلاس .

iceweek
یک شنبه 25 آبان 1393, 10:30 صبح
در پایگاه داده اگر اقدام به اینسرت درون جدول بشه ولی کوری به هر دلیل رول بک بشه کلید اصلی یکی به مقدارش اضافه میشه.
یعنی این اتفاق میتونه به علت رول بک زیاد بین دو اینسرت باشه

Maryam.J
یک شنبه 25 آبان 1393, 13:49 عصر
به نظر من ، بهترین راه برای تعیین آی دی ، برای یک محصول جدید ، تعیین یک ستون با نوع BigInt و پیدا کردن بزرگترین مقدار این ستون با استفاده از تابع Max و سپس جمع زدن با یک عدد هست. این راه حل میتونه به عنوان یک تابع در SqlServer نوشته بشه یا به عنوان یک متد در یک کلاس .
درسته. اگه این مورد درسته باشه باید همین کار انجام بشه.


سلام. من هنوز توفیق کار کردن با sql server 2012 رو پیدا نکردم. ممکنه این چیزی که دوستمون میگه درست باشه. ولی زمانی که یک فیلد رو Identity در نظر میگیریم یک identity increment و seed داره. seed مقدار اولیه و increment گام افزایش است. این دوتا رو درست تنظیم کردید؟اگه درسته احتمالاً حق با این دوستمونه.
من توی استک آورفالو هم خونم همین رو گفته بودن دقیقا. یعنی ربطی به seed نداره. و الگوریتم خودشه


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

aminmousavi
سه شنبه 27 آبان 1393, 12:08 عصر
سلام دوست عزیز . بنده هم تابحال با sql 2012 کار نکردم . اما اگر خواستی خودت به ترتیب id هات رو ست کنی ، جای max گرفتن از کل table یک جدول مثلا به شکل زیر بساز :

نام جدول : NewIdentity
فلید ها :

- id
- NameTable از نوع nvarchar
- Count از نوع BigInt

هر بار که رکوردی در جدولی درج میکنی ، یک مقدار به این شمارنده جدول اضافه میکنی و میبنی مقدار فعلی که داره برابر با چند هست .

Maryam.J
شنبه 01 آذر 1393, 10:27 صبح
سلام دوست عزیز . بنده هم تابحال با sql 2012 کار نکردم . اما اگر خواستی خودت به ترتیب id هات رو ست کنی ، جای max گرفتن از کل table یک جدول مثلا به شکل زیر بساز :

نام جدول : NewIdentity
فلید ها :

- id
- NameTable از نوع nvarchar
- Count از نوع BigInt

هر بار که رکوردی در جدولی درج میکنی ، یک مقدار به این شمارنده جدول اضافه میکنی و میبنی مقدار فعلی که داره برابر با چند هست .
چرا میگید اینجوری بهتره؟؟

aminmousavi
شنبه 01 آذر 1393, 11:52 صبح
بخاطر بار اضافی که رو سر sql میزارین با max گرفتن .
فرض کنید تعداد رکوردهای جدولتون باشه 5000 تا ، هربار که بخواید یک رکورد جدید درج کنید توی یک جدول 5000 تایی باید کوئری بگیرید و max رو پیدا کنید . اما اگر یک جدول دیگه داشته باشینن که 10-15 تا رکورد بیشتر نداره ، مسلما آپدیت کردن و کوئری گرفتن از یک فلید بخصوص (بر عکس max گرفتن که تمام رکوردها درگیر میشن) خیلی سبک تر هستش

debugger
چهارشنبه 19 آذر 1393, 11:14 صبح
مریم خانم میشه بفرمائید از کجا هاست خریدید . اگر اینجا هم نمی نویسید .با پیام خصوصی لطفا بگین .