PDA

View Full Version : مرتب سازي اطلاعات بر اساس يك فيلد



mandana2010
دوشنبه 06 آبان 1387, 13:18 عصر
سلام دوستان عزيز

1)چطور مي شه توي بانك مشخص كنيم كه اطلاعات بر اساس يك فيلد خاص بصورت مرتب ذخيره بشن ( بصورت سورت شده بر اساس يك فيلد خاص ذخيره بشن)
2 ) چطور مي شه توي بانك اطلاعاتي اطلاعات به همون ترتيبي كه كاربر ورود اطلاعات كرده ذخيره بشن متشكرم

Alireza Orumand
دوشنبه 06 آبان 1387, 14:47 عصر
سلام
تا جایی که من میدونم clusterd index کار گزینه ی 1 رو انجام میده یعنی به صورت فیزیکی هم داده های رو مرتب میکنه. تو مایه های index که همه دیکشنری های دارد.
در مورد گزینه 2 هم که فکر میکنم همیشه همین طور باشه یعنی اطلاعات به ترتیبی که وارد میشن ذخیره هم میشن.
البته نه دقیقا به همین روش، توضیح روش دقیق ذخیره شدن کمی بیشتر از پاسخ به یه سوال هست و شاید یه مقاله چند صفحه ای لازم باشه. که در صورتی که توانی باشه به زودی این کار را انجام میدهم.
در مورد نحوه دقیق کار کرد های index هم امید است استاد ثباتی توضیحات کاملتری بفرمایند.
موفق باشید.

ASKaffash
دوشنبه 06 آبان 1387, 16:47 عصر
سلام
در مورد سئوال اول جواب دوستمان درست است
ولی در مورد سئوال دوم وقتی یک رکورد از وسطهای یک جدول حذف میکند و سپس یک رکورد جدید به جدول اضافه میکنید خواهید دید که رکورد جدید در دستور Select * From T دقیقا در محل رکورد حذف شده ظاهر میشود پس شما راهی ندارید بجز اینکه یک فلید از نوع DateTime ایجاد کنید و این مقدار را با GetDate() پر کنید و این فیلد را کلاستر کنید و نتیجه Select * From T را ببینید

Alireza Orumand
چهارشنبه 08 آبان 1387, 14:30 عصر
سلام


ولی در مورد سئوال دوم وقتی یک رکورد از وسطهای یک جدول حذف میکند و سپس یک رکورد جدید به جدول اضافه میکنید خواهید دید که رکورد جدید در دستور Select * From T دقیقا در محل رکورد حذف شده ظاهر میشود پس شما راهی ندارید بجز اینکه یک فلید از نوع DateTime ایجاد کنید و این مقدار را با GetDate() پر کنید و این فیلد را کلاستر کنید و نتیجه Select * From T را ببینید
:متعجب::متعجب::متعجب::متفکر:: تفکر:
خیر. فرمایش شما صحیح نیست. در صورتی که داده ای از وسط جدول حذف شود باز هم داده های جدید در انتهای جدول وارد میشود نه به جای داده های پاک شده. مگر اینکه ID را ما وارد کنیم و وقتی یک ID حذف شد خود ما Id جدید را برابر با Id قدیمی انتخاب نماییم.:لبخندساده:
برای ذخیره شدن داده ها پشت سر هم به صورت فیزیکی نیازی به GetDate() نیست. همین که یک فیلد identity داشته باشیم و این فیلد Primary key باشه کفایت میکنه که البته این کار دقیقا مطابق با فرمایشات Books online میباشد و موافق اهداف بهینه سازی. کار به این سادگی که این همه سختی کشیدن نداره.:لبخند:
گفته بالا درباره نمایش منطقی ذکر شد. اما در مورد ذخیره سازی فیزیکی باز هم گفته بالا کاملا صدق میکنه.:بامزه:
یعنی داده ها همینطوری پشت سر هم ذخیره میشن و اگر هم حذف شدن جای داده های حذف شده خالی میمونه تا زمانی که به کمک SQL Server سر و سامانی به ساختار فایل ها و ایندکس ها داده بشه.
برای اثبات گفته های بالا رجوع شود به http://safari.oreilly.com/0672328240/ch18lev1sec2
اینجا لیست کاملی در باره Data storage در SQL Server وجود داره.:چشمک:
موفق باشید.

ASKaffash
چهارشنبه 08 آبان 1387, 16:10 عصر
سلام
مراحل 6 گانه ذیل را مرحله به مرحله انجام دهید متوجه موضوع خواهید شد (لطفا حتما در QA نتیجه را تست کنید) :


1)
Create Table T (A BigInt,B VarChar(100))
2)
Insert into T (A,B) Values(1,'Ok')
Insert into T (A,B) Values(2,'Test')
Insert into T (A,B) Values(3,'Run')
Insert into T (A,B) Values(4,'Exit')
Insert into T (A,B) Values(5,'Delete')
3)
Select * From T
4)
Delete T Where A=3
5)
Insert into T (A,B) Values(6,'Move')
6)
Select * From T

خواهید دید که آخرین ردیف در مرحله 6 در ردیف سوم ظاهر میشود.

sepehr.net
پنج شنبه 09 آبان 1387, 20:54 عصر
سلام
1 اگه فیلد کلیدی تعریف شده باشه چون کلاستر ایندکس هست بانک تمامی جدول را بر اساس مقادیر اون فیلد مرتب میکنه.
2 به نظر من میتونی این کار را بکنی که یک فیلدی از نوع autonumber بزاری و اون رو کلید قرار دهی
اگه در برنامه میخوای از این جدول استفاده کنی میتونی از order by استفاده کنی

Alireza Orumand
جمعه 10 آبان 1387, 12:05 عصر
سلام


سلام
مراحل 6 گانه ذیل را مرحله به مرحله انجام دهید متوجه موضوع خواهید شد (لطفا حتما در QA نتیجه را تست کنید) :

اجرا کردم. در نمایش نتیجه در این حالت حق با شماست. یعنی 6 به جای 3 نشون داده میشه. ولی حالا به جای اینکه از QA استفاده کنید خودتون برید و در جداول به صورت دستی کار Insertو Update رو انجام بدی. حالا چه اتفاقی میوفته؟ 6 آخر از همه نمایش داده میشه. نتیجه اخلاقی اینکه این دو اتفاق دلیل بر صحت حرف من یا حرف شما نمیشه. چون با دوتا کار مختلف دوتا نتیجه مختلف حاصل میشه. برای کار علمی باید دلیل و مدرک علمی بیاریم. من برای حرف هایی که زدم دلیل و مدرک علمی داشتم. حداقل تو Nتا کتاب این مطالب ذکر شده. متخصصین مایکروسافت هم خودشون این حرف روتایید میکنند.(به لینک بالا مراجعه کنید).
با این اوصاف اگه شما باز هم اصرار دارید که رکورد جدید جانشین رکورد قدیمی میشه باشه، اشکال نداره، شما میتونید همچنان بر این باورد خودتون ادامه بدید.


1 اگه فیلد کلیدی تعریف شده باشه چون کلاستر ایندکس هست بانک تمامی جدول را بر اساس مقادیر اون فیلد مرتب میکنه.
2 به نظر من میتونی این کار را بکنی که یک فیلدی از نوع autonumber بزاری و اون رو کلید قرار دهی
اگه در برنامه میخوای از این جدول استفاده کنی میتونی از order by استفاده کنی

سپهر جان اگه مطالب بالا را مطالعه میکردید این موضوع ذکر شده بود. ضمن اینکه فیلدی که Primary keyهست نیازی به Order bey نداره چون به صورت پیش فرض این اتفاق میوفته، مگر اینکه منظور شما این باشه که فیلدی Identity ما Primary key نباشه.
موفق باشید.

ASKaffash
شنبه 11 آبان 1387, 08:54 صبح
سلام
نیاز به مدرک علمی نیست همانطور که دیدید رفتار SQLServer در ایجاد رکورد جدید مانند رکوردهای مجازی است در واقع رکورد حذف شده در اختیار قرار میگیرد که این موضوع باعث میگردد که پایگاه داده بدون دلیل رشد نکند

Alireza Orumand
شنبه 11 آبان 1387, 12:26 عصر
سلام


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

اگه میگید نیاز به مدرک علمی نیست حتما نیست دیگه. شما راست میگید. ولی حداقل دلیل صحیح نبودن حرف خودتون رو وقتی از QA استفاده نمیشه را میتونید توضیح بدید؟
عزیزم برای کل کل نیومدیم که! اومدیم چیزی یاد بگریم اگر هم نمیخواهیم چیزی یاد بگیریم حد اقل به دیگران اشتباه یاد ندیم.
شما با این طرز فکر حتما وقتی روی زمین صافی راه میرید ایمان میارید که تو کتاب فیزیک اشتباه نوشتن که زمین گرده. اگه گرد بود که شما میدیدید دیگه.
موفق باشید.