PDA

View Full Version : مسئله صفجه بندی جداول پارتیشن بندی شده



manager
پنج شنبه 15 اردیبهشت 1390, 09:32 صبح
سلام

من یک جدول دارم که رکورد های خیلی زیادی داره، اومدم این جدول رو در Sql Server 2005 پارتیشن بندی کردم مثلا بر اساس تاریخ ثبت هر رکورد. تعداد رکوردها خیلی زیاده و کاربر برای مشاهده لیست اونها نیاز داره صفحه بندی انجام بده و یا جستجو کنه. خوب سوال اینجاست که من برای صفحه بندی از همون روش Two Bit استفاده می کنم یعنی ابتدا همه رکورد ها با Row_Number می ریزم تو یه جدول موقتی بعد از اون جدول موقتی که شاید یک میلیون رکورد توش باشه !!!! 50 تاش رو می کشم بیرون به کاربر لعنتی:چشمک: نشون بدم.. حجم محاسبات و عملیات خیلی بالاست و این من رو عذاب می ده..

جالب اینجاست که نمی تونم هیچ کشی انجام بدم چون هر کاربر با کاربر دیگه لیستی که بر اساس اون مرتب سازی می کنه و یک صفحه رو انتخاب می کنه فرق می کنه ! کل رکوردها رو هم که نمی تونم بهش نشون بدم ! صفحه بندی "فقط جلو فقط عقب" هم نمی تونم چون کاربر برای رسیدن به صفحه 50 پیرش در می آد ..

آهان یه مطلب دیگه اینکه این جدول رو من پارتیشن بندی کردم این یعنی همه ی پارتیشن ها خونده می شن هر دفعه چون برای شماره گذاری ردیف ها نیازه که اون ها هم شماره بخورن این یعنی فاجعه !

راه حلی ندارین ؟:اشتباه:

AminSobati
پنج شنبه 15 اردیبهشت 1390, 20:50 عصر
سلام دوست عزیزم،
پارتیشن بندی کمکی به واکشی اطلاعات (در خصوص Paging) انجام نمیده. اساسا کاربرد Partitioning چیز دیگه است.
سوال من اینه که در جدول موقتی، چند فیلد رو نگه میدارین، و آیا ایندکسی روی این جدول وجود داره؟

manager
جمعه 16 اردیبهشت 1390, 11:02 صبح
سلام دوست عزیزم،
پارتیشن بندی کمکی به واکشی اطلاعات (در خصوص Paging) انجام نمیده. اساسا کاربرد Partitioning چیز دیگه است.
سوال من اینه که در جدول موقتی، چند فیلد رو نگه میدارین، و آیا ایندکسی روی این جدول وجود داره؟
سلام امین جان
بله من خودم می دونم پارتیشن بندی کمکی به صفحه بندی نمی کنه، اتفاقا می گم صفحه بندی روی جداول پارتیشن بندی شده احتمالا خیلی کند عمل می کنه چون باید همه پارتیشن ها رو برای ارضای یک درخواست صفحه درگیر کنه و این زیاد خوب نیست و موضوع پارتیشن بندی بله حق با شماست چیز دیگه ای هست.
تو جدول موقتی که عمرش فقط به اندازه پاسخ یه یک درخواست صفحه است تمام فیلدهای جدول اصلی رو نگه می دارم چون وقتی می خوام اطلاعات یک صفحه رو واکشی کنم از یک جستجوی دیگه رو جدول اصلی جلوگیری می کنم. روی جدول موقتی بعید می دونم اصلا بشه ایندکس تعریف کرد البته منظورم متغیر جدولی هستشا نه جدول موقتی. چون اگر بخوام به ازای هر درخواست صفحه یک جدول موقتی درست کنم دیگه SQL فکر کنم بترکه...
جریان پارتیشن ها و صفحه بندی رو از این حیث با هم اشاره کردم چون وقتی می خوام یک صفحه رو استخراج کنم دیگه پارتیشن بندی اثری روی سرعت بازیابی نداره چون گزارش استخراج صفحه باید تمام رکوردها رو ارزیابی کنه ...

حمیدرضاصادقیان
جمعه 16 اردیبهشت 1390, 12:48 عصر
سلام.
پیشنهاد میکنم این تاپیک (http://barnamenevis.org/showthread.php?284219-%D8%AC%D8%AF%D8%A7-%DA%A9%D8%B1%D8%AF%D9%86-20-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-20-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-%D8%A7%D8%B2-%D8%AF%DB%8C%D8%AA%D8%A7-%D8%A8%DB%8C%D8%B3%D8%9F) رو هم نگاه کنید.
بعد شما چرا یک کار رو دوبار انجام میدید؟ چرا همون ابتدا با استفاده از ROw_Number فقط 50 رکورد مورد نیاز کاربر رو بهش نمایش نمیدید؟

AminSobati
یک شنبه 18 اردیبهشت 1390, 11:33 صبح
استفاده از Row_Number خوبه اما در واکشی رکوردها چندان صرفه جو نیست. چطوره این نکات رو اعمال و نتیجه رو بررسی کنید:
- در جدول موقتی، فیلد Identity رو PK کنید
- به جای تمام فیلدهای جدول اصلی، فقط PK رو در جدول موقتی INSERT کنید و موقع واکشی صفحه مورد نظر، جدول موقتی رو با جدول اصلی JOIN کنید
- اگر جدول موقتی با # ساخته بشه، میتونین ایندکس روی فیلدی که نماینده PK جدول اصلی هست بسازین

محمد سلیم آبادی
یک شنبه 18 اردیبهشت 1390, 20:11 عصر
اگه اشتباه نکنم برای پیاده سازی نظرات پست قبلی این کد میتونه استفاده بشه:


create table #temp
(nbr integer identity not null primary key,
pk integer not null)

insert into #temp(pk)
select primary_key
from table name
order by your_wanted_order

select T.*
from tablename T
join #temp Te
on T.primarykey = Te.pk
and Te.nbr between fist_value and last_value