۲ مطلب با کلمه‌ی کلیدی «row scope» ثبت شده است

Fetching last record from a table

داشتم فکر می‌کردم که آیا راهی وجود داره که بشه آخرین رکورد از جدول رو بدست آورد. در این مورد مشخص و واضحه که از تعداد رکوردهای موجود در یک جدول بی اطلاع‌ام. فقط می‌خوام کوئری بنویسم که بتونه تمام ستون‌های آخرین رکورد رو بدست بیاره. من سعی کردم از ROWNUM استفاده کنم، اما حدس می‌زنم که شیوه‌ کار اینطور نیست. اگر یک گزارشی ایجاد کنم، می‌خوام که گزارش‌ام بر پایه‌ی کوئری باشه که به سادگی تمام ستون‌های آخرین رکورد رو بدست بیاره.

آیا دستوری وجود داره که بشه باهاش آخرین رکورد از جدول رو بدست آورد؟

با تشکر

حسن

 

تعریف تو از آخرین رکورد چیه؟

می‌دونی که آخرین رکورد درج شده در جدول می‌تونه اولین رکورد‌ی باشه که توسط “select * from t” بازگشت داده میشه یا ممکنه صدمی باشه، ممکنه هزارمی باشه، در واقع می‌تونه هر رکورد‌ای باشد.

یادت باشه رکوردها در هیچ ترتیب خاصی ذخیره و بازگردونی نمیشن.

ولی اگه آخرین رکورد درج شده را می‌خوای، باید یک فیلد timestamp یا sequence ای برای هر رکورد‌ای که درج می‌شه موقع درج رکورد مشخص کنی اینجوری «آخرین» رکورد رو میتونی داشته باشی یادت باشه این تنها راه است.

یادت باشه تنها راه برای انجام این کار اینه که ستونی داشته باشی که بتونی مرتبش کنی تا «آخرین» رکورد رو پیدا کنی.

 

ROWID و ROWNUM به دلایل زیر کار نمی‌کنند:

ROWID کار نمیکنه. چون داده‌اش بر پایه‌ی ترکیبی از شماره file/block/slot سرور فعلی است. یادت باشه ما از ROWID ها دوباره استفاده می‌کنیم، حتی می‌تونیم تغییرشون بدیم (مثلا با پارتیشن‌بندی جداول). پس ممکنه که Extent شماره‌ی 1 رو در فایل 55 و Extent شماره‌ی 2 رو در فایل 2 داشته باشید. Extent 4 حتی ممکنه در بلاک 555 از فایل 3 باشه، حتی ممکنه Extent 5 در بلاک 2 از فایل 3 باشه. ROWIDها قابل مرتب کردن نیستند.

 

ROWNUM هم کار نمیکنه چون یک ستون منطقیه(در جدول درج نشده) و با هر SELECT شماره ردیف رکوردهای SELECT مربوط رو برمیگردونه

منبع

۲۴ اسفند ۹۴ ، ۰۸:۳۷ ۰ نظر
مهدی غفاری

جداول بسیار حجیم در Very Large Databaseها (انواع پارتیشن‌بندی)

به index گذاری که روی سطح لایه فیزیکی دیتابیس باشه اصطلاحاً پارتیشن‌بندی گفته می‌شود.

partition by range

به مثال زیر دقت کنید، در این مثال جدولی با پارتیشن بر مبنای فیلدهای id, age ساخته‌ایم:

SQL> create table sal (id number,age number,name varchar2(20))
partition by range(id,age)
(partition s1 values less than (10,20) tablespace ts1,
partition s2 values less than(20,30) tablespace ts2,
partition s3 VALUES LESS THAN (MAXVALUE) tablespace ts3);

در ادامه گفته‌ایم که مقدارهای ورودی در پارتیشن s1 باید کمتر از 10,20 باشند و این پارتیشن در tablespace ts1 قرار دارد(یعنی idهای کمتر از ۱۰ و ageهای کمتر از ۲۰)

در ادامه پارتیشن s2 را داریم که مقدارهای کمتر از 20,30 را در خود می‌گیرد و در tablespace ts2 قرار دارد.

و در ادامه پارتیشن s3 را داریم که اگر رکوردی وارد شد که تو بازه‌ی پارتیشن‌بندی ما نبود اون رکورد که حالا معلوم نیست بزرگه یا کوچیکه وارد tablespace ts3 شود.

نکته: اسم پارتیشن‌ها زیاد اهمیتی برای ما ندارند.

نکته: اگر عملیات update انجام شود و مقدار عوض شود جابه‌جایی در پارتیشن نیز رخ خواهد داد.

نکته: تو partition by range بهتره که تمام فیلدها مشخص شوند، یعنی چیز نامعلومی که کاربر بخواد وارد کنه و به مشکل بخوره نباشه

ادامه مطلب...
۱۴ ارديبهشت ۹۴ ، ۱۷:۴۰ ۳ نظر
مهدی غفاری