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

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

 

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

 

بررسی از لحاظ کارایی 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)');
مقایسه زمان پاسخ پرس و جوهای دو پایگاه داده اوراکل
به نظر من این مقایسه به خیلی از عوامل بستگی داره و شاید نشه بصورت کلی جواب مشخصی داد، ولی می توانیم
👈در دیتابیس ۱۱g – 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 دیدگاه. همین الان خارج شوید

  • هوشمند راستین
    دسامبر 11, 2019 5:34 ق.ظ

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

    با تشکر

    پاسخ
  • سعید حسن پور
    دسامبر 11, 2019 6:06 ق.ظ

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

    پاسخ
  • هوشمند راستین
    دسامبر 12, 2019 5:14 ب.ظ

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

    با تشکر

    پاسخ
    • سعید حسن پور
      دسامبر 12, 2019 7:44 ب.ظ

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

      پاسخ
  • هوشمند راستین
    دسامبر 13, 2019 3:33 ب.ظ

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

    پاسخ
    • سعید حسن پور
      دسامبر 14, 2019 4:54 ق.ظ

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

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

      پاسخ

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

نشانی ایمیل شما منتشر نخواهد شد.

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

فهرست
Oracle APEX Capabilities (OAC)