PDA

View Full Version : سوال: خطا: Could not insert a row larger than the page size into a hash table



DlphIran
پنج شنبه 26 آذر 1388, 13:46 عصر
سلام
من يه برنامه كتابداري دارم كه توي تست اوليه مشكلي نداشته ،‌ وقتي تعداد كتابهاي ثبت شده 5000 جلد رسيده موقع ورود به يكي از پنجره ها پيغام خطا نشون ميده ، ببينيد شما متوجه ميشين مشكل از كجاست.

اين چند خط رو كه مي خواد اجرا كنه پيام خطا نشون ميده :

sql.clear;
sql.Add('select top 10 * ');
sql.Add('from ket left outer join kt1 on ket.sabt=kt1.sabt');
sql.Add(' left outer join bmo on kt1.sabt=bmo.sabt');
sql.Add('where ket.a>0');
active:=true;

تصوير پيام خطاي ظاهر شده رو ببينيد، اين توضيح هم بدم كه تاحالا مشكلي نداشتم اما حجم اطلاعات كه بالا رفته اين مشكل پيدا شده ،‌ در حال حاضر حجم بانك اطلاعاتي هم 45 مگابايت هستش كه بيشترش مربوط به جدول Ket و bmo هست .

alinikaein
شنبه 28 آذر 1388, 11:26 صبح
پايگاه داده شما چيه؟

حسین شهریاری
یک شنبه 29 آذر 1388, 08:27 صبح
سلام

فکر میکنم از تابع Hash استفاده کرده اید درسته؟
میتونه عدم سازگاری اطلاعات ارسالی و نوع فیلد باشه.
شاید هم برای یکی از فیلدها در قسمت Check محدوده تعیین کرده اید.
یا اینکه برنامه شما از یک کامپوننت DLL استفاده میکرده که یا به دلیلی حذف شده یا توسط یه فردی باز و محتویات آن دستکاری شده باشه.

DlphIran
یک شنبه 29 آذر 1388, 17:22 عصر
من از Sql server 2000 و Adoquery در دلفي 6 استفاده مي كنم ، من هيچكدوم از اين كارها رو انجام ندادم ،نمي دونم چطوري اين مشكل رو حل كنم ؟ البته چون بخاطر زياد شدن حجم بانك اطلاعاتي پيغام خطا داده بود،‌ رفتم توي بانك اطلاعاتي و مقداري يكي از فيلدهام كه از نوع nvar با اندازه 1000 بود رو به 100 كاهش دادم پيغام خطا رفع شد ،‌ولي من براي اين فيلد واقعا نياز دارم به سايز حداقل 700 .

منتظر راهنمايي دوستان هستم :لبخندساده:

DlphIran
چهارشنبه 02 دی 1388, 08:01 صبح
مثل اينكه اين تاپيك از بخش بانكهاي اطلاعاتي دلفي به اين بخش منتقل شده، ظاهرا مشكل بطور كامل مربوط به بانك اطلاعاتي sql server 2000 ميشه ،. منتظر راهنمايي دوستان هستم

DlphIran
دوشنبه 07 دی 1388, 08:58 صبح
هنوزم منتظرم راهنماييم كنيد:لبخندساده:

AminSobati
دوشنبه 07 دی 1388, 11:08 صبح
سلام دوست عزیزم،
اگرچه Plan این کوئری جای بررسی داره، ولی برای من به خاطر عدم دسترسی به دیتابیس شما میسر نیست. به هر حال این کوئری رو آزمایش کنید:


select top 10 *
from ket left outer join kt1 on ket.sabt=kt1.sabt
left outer join bmo on kt1.sabt=bmo.sabt
where ket.a>0
option (robust plan)


احتمال میدم سایز رکوردهایی که برمیگردونین بالا هستش

DlphIran
پنج شنبه 10 دی 1388, 11:41 صبح
اون خط آخري كه شما به كد من اضافه كردين چيكار مي كنه ؟

من اجراش كردم پيغام خطا نداد ،‌بعد اومد حذفش كردم(اون خط آخري رو) ديگه پيغام خطا نداد؟
چطور حل شد؟ البته من مقدار فيلد mm رو كه 1000 بود رو كم كرده بودم تا 300 البته براي اجراي اين كدها برگردوندمش به 1000 و پيغام خطا نداد. يعني به كل حل شده يا ممكنه بعدا مشكل پيش بياد؟ با اين حال من ليست فيلدهاي سه جدولي كه بهم متصل ميشن رو آوردم.
تو اين نرم افزار هر كتاب مي تونه تا چهار نويسنده ، چهار مترجم ، چهار ويراستار و سه ناشر و سه موضوع كه هريك به سه دسته تقسيم ميشن رو ثبت كنه . همچنين تا 4 مورد شناسه افزوده براي يك كتاب رو ميشه ثبت كرد ،‌براي همين فيلدهام اينقدر زياده .
لطفا راهنماييم كنيد آيا اون مشكل ديگه پيش نمي آد يا حتي مشكل ديگه اي ممكنه در آينده پيش بياد؟

فيلدهاي جدول kt1


1 a bigint 8 0
0 sabt bigint 8 0
0 nv3 nvarchar 50 1
0 tnv3 nvarchar 50 1
0 mt3 nvarchar 50 1
0 tmt3 nvarchar 50 1
0 v2 nvarchar 50 1
0 v3 nvarchar 50 1
0 nv4 nvarchar 50 1
0 tnv4 nvarchar 50 1
0 mt4 nvarchar 50 1
0 tmt4 nvarchar 50 1
0 v4 nvarchar 50 1
0 g2 nvarchar 50 1
0 mo2 nvarchar 70 1
0 zmo2 nvarchar 100 1
0 g3 nvarchar 50 1
0 mo3 nvarchar 70 1
0 zmo3 nvarchar 100 1
0 nsh2 nvarchar 100 1
0 mnsh2 nvarchar 50 1
0 dnsh2 char 10 1
0 nsh3 nvarchar 100 1
0 mnsh3 nvarchar 50 1
0 dnsh3 char 10 1
0 mm nvarchar 1000 1
0 af2 nvarchar 50 1
0 af3 nvarchar 50 1
0 af4 nvarchar 50 1


فيلدهاي جدول ket


1 a bigint 8 0
0 sabt bigint 8 0
0 cod bigint 8 1
0 ccod nvarchar 50 1
0 noe char 10 1
0 o1 nvarchar 100 1
0 nv1 nvarchar 50 1
0 tnv1 nvarchar 50 1
0 nv2 nvarchar 50 1
0 tnv2 nvarchar 50 1
0 mt1 nvarchar 50 1
0 mt2 nvarchar 50 1
0 tmt1 nvarchar 50 1
0 tmt2 nvarchar 50 1
0 sar1 nvarchar 50 1
0 tsr1 nvarchar 50 1
0 dt1 char 4 1
0 df1 char 4 1
0 v1 nvarchar 50 1
0 noco nvarchar 10 1
0 c1 char 7 1
0 c2 char 7 1
0 c3 char 7 1
0 c4 char 7 1
0 c5 char 7 1
0 c6 char 7 1
0 c7 char 7 1
0 c8 char 7 1
0 g1 nvarchar 50 1
0 mo1 nvarchar 70 1
0 zmo1 nvarchar 70 1
0 je smallint 2 1
0 tje smallint 2 1
0 te smallint 2 1
0 dy int 4 1
0 dm smallint 2 1
0 dd smallint 2 1
0 com tinyint 1 1
0 tes bigint 8 1
0 m money 8 1
0 nsh1 nvarchar 50 1
0 mnsh1 nvarchar 20 1
0 dnsh1 char 10 1
0 isbn char 20 1
0 af1 nvarchar 50 1
0 dys int 4 1
0 dms smallint 2 1
0 dds smallint 2 1
0 nm nvarchar 100 1
0 nm1 nvarchar 70 1
0 noe1 nvarchar 20 1
0 karbar nvarchar 50 1
0 aman char 3 1
0 rez char 3 1
0 tte smallint 2 1

فيلدهاي جدول bmo


1 a bigint 8 0
0 sabt bigint 8 0
0 sar nvarchar 100 1
0 oent nvarchar 200 1
0 moz nvarchar 400 1
0 oneent nvarchar 400 1
0 ezaf nvarchar 300 1
0 omoent nvarchar 400 1
0 mo1 nvarchar 150 1
0 mo2 nvarchar 150 1
0 mo3 nvarchar 150 1
0 pg char 10 1

AminSobati
پنج شنبه 10 دی 1388, 17:15 عصر
اون دستور به SQL Server فرمان میده Plan کوئری رو برای حداکثر سایز رکورد بدست بیاره ولی امکان داره Performance کوئری افت کنه (حتمی نیست).
نمیشه گارانتی کرد که دیگه این اتفاق برای کوئری نمیافته مگر اینکه سایز رکورد کاهش پیدا کنه. البته دقت کنید که من به سایز رکورد اشاره کردم، نه تعداد فیلد. اگر Plan کوئری رو ارسال میکردید شاید میشد با ایندکس برای همیشه حلش کرد

DlphIran
شنبه 12 دی 1388, 10:19 صبح
منظورتون از plan كوئري چيه؟ تا حالا نشنيده بودم

و چطور ميشهplan كوئري رو ارسال كرد؟

AminSobati
شنبه 12 دی 1388, 15:07 عصر
کلید Ctrl+M رو بزنید و بعد کوئری رو اجرا کنید. یک Tab جدید در Result ظاهر میشه