اوراکل اپکس-چند نکته در دیتابیس اوراکل-قسمت چهارم

چند نکته در دیتابیس اوراکل-قسمت چهارم

 

چند نکته در دیتابیس اوراکل-قسمت اول
چند نکته در دیتابیس اوراکل-قسمت دوم
چند نکته در دیتابیس اوراکل-قسمت سوم

 

بررسی از لحاظ کارایی COALESCE , NVL در اوراکل
وضعیت اول: خوب
IF (COALESCE(x,-1) != COALESCE(y,-2))
وضعیت دوم: خوب
IF x != y
OR (x IS NULL AND y IS NOT NULL)
OR (X IS NOT NULL AND y IS NULL)
وضعیت سوم: بد

IF NVL(x,-1) != NVL(y,-2)
در خصوص استفاده از OR در Where clause در اوراکل
شما مي توانيد از Query هاي دايناميك استفاده كنيد و هر شرط را بسته به شرايطي كه داريد اضافه كنيد و در نهايت آنرا اجرا نماييد(در صورتيكه كه مي توانيد شرط هاي خود را محدود كنيد).
بستگي به نوع شرط هاي خود دارد كه به چه نحويي نوشته شده است كه بايد بسته به نوع استفاده شده در Where Clause بهينه و يا مورد استفاده شود.
مي توانيد اگر داراي Join هاي بسيار هستيد. داده هاي يكسري از جداول را درون جداول temp موقت (فقط آنهايي را گه لازم داريد) سپس Join حود را با جداول temp انجام دهيد كه در صورت داشتن ديتاي زياد مي تواند به شما كمك شاياني بكند.
 استفاده از hint هاي parallel در اجراي Query در اوراکل.
یک روش دیگر استفاده از REGEXP_LIKE در اوراکل می باشد. در اینجا شما می توانید از حالت OR استفاده کنید در صورتیکه در LIKE نمی توانید به مثال زیر توجه کنید:
select * from my_table t1
where REGEXP_LIKE (t1.firstname, 'saeed.*|armin.*|ali.*');
Or
where REGEXP_LIKE (t1.firstname, '^(saeed|armin|ali)');
مقایسه زمان پاسخ پرس و جوهای دو پایگاه داده اوراکل
به نظر من این مقایسه به خیلی از عوامل بستگی داره و شاید نشه بصورت کلی جواب مشخصی داد، ولی می توانیم
?در دیتابیس 11g – auto tuning tasks enabled
?در دیتابیس auto accept sql profiles enabled
و در آخر AWR می توانید یک مقایسه از لحاظ Performance بین دو تا دیتابیس داشته باشید.
استفاده فانكشن در Where clause در اوراکل
استفاده از فانكشن در Query يعني كشتن آن. بدين منظور كه شما با افزايش زماني بسيار زياد در Query خود مواجه مي شويد. حال بايد با روش ها و تكنيك هاي مختلف و ايجاد مدلي بهتر، مسئله خود را مرتفع سازيد.
مي توان براي چند پيشنهاد داشته باشم:
اول اينكه مقادير فيلد خود را اصلاح كنيد كه ديگر نيازي به استفاده از فانكشن نباشد.
دوم از regexp_like به جاي فانكشن جاوايي استفاده كنيد(البته نمي دانم كه اين عمل تطبيق پذيري به چه منظور مي باشد)
سوم اينكه مي توانيد بعنوان يك فيلد در select آورده و سپس در يك جدول temp ريخته و پس از مقايسه خالي شود. كه اين روش براي ديتاهاي زياد مناسب. البته بايد اين روش را بسته به نوع كار خود پياده سازي كنيد.
بروزرسانی جداول با رکوردهای میلیونی در اوراکل
یک روش بسیار سریع در این خصوص استفاده از (ایجاد جدول جدید) می باشد . برای درک این موضوع یک مثال می زنیم:
مرحله اول: ایجاد یک جدول جدید بصورت زیر می باشد.(در select شما باید مقادیر جدیدی که می خواهید بروز شود را بیاورید)
create table new_t as
select <do the update "here"> from old_t;
مرحله دوم: باید تمامی اسکریپتهای  دسترسی ها، مجوز ها، ایندکس و Constraint هایی که بر روی جدول قدیم بود را بر روی جدول جدید ایجاد کنید.
copy indexes, grants, etc
مرحله سوم: حذف جدول قدیم(باید در ابتدا Constraint ها را حذف کنید) و تغییر نام جدول قدیم به جدول جدید
drop table old_t
rename new_t to old_t;
مرحله چهارم: اجرای اسکریپتی که در مرحله دوم ایجاد کردید.

 

5/5 - (1 امتیاز)

6 دیدگاه. پیغام بگذارید

  • هوشمند راستین
    آذر 20, 1398 5:34 ق.ظ

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

    با تشکر

    پاسخ
  • سعید حسن پور
    آذر 20, 1398 6:06 ق.ظ

    با سلام خدمت دوست گرامی
    در ابتدا برای اینکه نظر خودتان را اظهار کردید تشکر می کنم.
    در این پست منظور بروزرسانی رکوردهای میلیونی در یک پروسه کاری می باشد. و گرنه که بروزرسانی بعضی ار رکوردها در جداول میلیونی یا میلیاری که مشکلی نیست.
    می توانید
    *با استفاده از ایندکس گذاری مناسب
    * پارتیشن بندی جدول
    * استفاده از Hint
    * استفاده از دستور Merge
    * بصورت Bulk با استفاده از ForAll

    پاسخ
  • هوشمند راستین
    آذر 21, 1398 5:14 ب.ظ

    با سلام خدمت دوست گرامی آقای حسن پور
    با تشکر از جوابتان در مورد این مسئله ، در مورد این سوال منظور این بود موقعی که یک جدول خیلی بزرگ که خیلی زیر بار می باشد و یک ستون آن نیاز به update دارد بعلت مشکل lock شدن جدول نمی توان براحتی update کرد، همچنین اگه جدول مورد نظر رکوردهای زیادی داشته باشد زمان طولانی لازم است تا این عمل انجام شود. بیشتر هدف این بود که روشی ارائه شود که این عمل به سرعت انجام شود و باعث توقف سیستم عملیاتی نگردد.

    با تشکر

    پاسخ
    • سعید حسن پور
      آذر 21, 1398 7:44 ب.ظ

      1- چند تا رکورد را در هر بار اجرا می خواهید update کنید؟
      ۲- با چه ابزاری کار می کنند که باعث لاک شدن رکوردها می شوند؟
      ۳-زمان طولانی مربوط به لاک شدن می باشد یا بروزرسانی رکوردها؟
      مسئله اینجاست که لاک شدن بر روی رکورد می باشد نه کل جدول. و مورد بعدی اینکه هنگام تغییر یک رکورد اگر برای پیداکردن رکورد مورد نظر از شرط های فیلدهایی که دارای ایندکس باشند نباید زمانبر باشد.

      پاسخ
  • هوشمند راستین
    آذر 22, 1398 3:33 ب.ظ

    با سلام خدمت دوست عزیز
    جدول مورد نظر حدود 100 میلیون رکورد دارد و در محیط کلاستر ، اپلیکیشن ها باهاش کار میکنن . یک فیلد این جدول باید از varchar به number نوع آن عوض شود و بعد باید کل ستون به عدد 1 و 2 بر اساس یک شرط تغییر پیدا کند.
    بهترین راه حل و سریعترین راه برای اینکه ابن کار بدون توقف سیستم انجام شود به نظر شما چه راهی می باشد؟
    ممنون

    پاسخ
    • سعید حسن پور
      آذر 23, 1398 4:54 ق.ظ

      با سلام خدمت دوست گرامی
      پیشنهاد می کنم:
      ۱- در ابتدا یک فیلد جدید ایجاد کنید.
      ۲- سپس مقادیر آنرا بر اساس شرط مورد نظر بروزرسانی کنید.
      ۳-سیستم را به مدت چند ثانیه از مدار خارج کنید و یوزرهایی که از این جدول استفاده می کنند شناسایی و kill کنید.
      ۴-فیلد قبلی را تغییر نام دهید. و فیلد جدید را با نام به قبلی تغییر نام دهید.

      امیدوار هستم که کمک کرده باشم.

      پاسخ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این قسمت نباید خالی باشد
این قسمت نباید خالی باشد
لطفاً یک نشانی ایمیل معتبر بنویسید.

keyboard_arrow_up
Oracle APEX Capabilities (OAC)