اوراکل 21c – پشتیبانی از شرط نامساوی در Automatic Indexing

قابلیت auto indexing در اوراکل نسخه 19c شرط عدم تساوی را پشتیبانی نمی کند که قبلا در این مورد مطلبی را ارائه کرده ایم. نسخه 21c این قابلیت را فراهم کرده است که در ادامه این مسئله را می بینید.

برای نمایش این محدودیت، جدولی را همراه با حجم قابل توجهی از اطلاعات ایجاد می کنیم:

SQL> create table tb(id number,name varchar2(100),date_time date,c1 varchar2(4000),c2 varchar2(4000));
Table created
SQL> insert into tb select rownum,'test'||’’||rownum,sysdate - rownum,rpad('test',400,'c1'),rpad('test',400,'c2') from dual connect by level <=666444;
666444 rows inserted
SQL> commit;
Commit complete
SQL> exec dbms_stats.gather_table_stats(ownname => user,tabname => 'TB');
PL/SQL procedure successfully completed

بعد از ایجاد جدول، پرس و جوی زیر را که شرط عدم تساوی در آن استفاده شده است را در دیتابیس اجرا می کنیم:

Select count(*) from tb where id between 1 and 10;

همچنین با اجرای بلاک plsql زیر، سعی در مجاب کردن اوراکل برای بررسی این پرس و جو داریم:

declare
  temp number;
begin
  for a in 1 .. 1000 loop
    select count(*) into temp from tb where id between 1 and 10;
  end loop;
end;

پس از گذشت interval پانزده دقیقه ای، گزارشی از آخرین اجرا را می بینیم:

select DBMS_AUTO_INDEX.REPORT_ACTIVITY(SYSTIMESTAMP-1,SYSTIMESTAMP,'HTML','ALL','ALL') from dual;

با اجرای دستور زیر خواهیم دید که بر روی ستون id ایندکسی ایجاد شده است:

select owner,index_name,table_name,auto from dba_indexes where AUTO='YES';

قابلیتهای جدید اوراکل 21c در زمینه عملگرهای مجموعه ای

تا قبل از نسخه 21c، صرفا می توانستیم از سه عملگر مجموعه ای INTERSECT، MINUS و UNION [ALL] در اوراکل استفاده کنیم اما در نسخه 21c دو عملگر جدید EXCEPT و EXCEPT ALL به این مجموعه اضافه شدند که این دو عملگر معادل عملگرهای MINUS و MINUS ALL هستند و صرفا به دلیل استفاده از عبارتهای EXCEPT و EXCEPT ALL در دیتابیسهای دیگر، اوراکل هم این دو عملگر را به مجموعه عملگرهای خود اضافه کرده است.

مجددا تاکید می شود که در عمل تفاوتی بین EXCEPT و MINUS وجود ندارد و حتی در صورت استفاده از عملگر EXCEPT، اوراکل در زمان اجرای پرس و جو، در مرحله Query Transformation، عملگر EXCEPT را به MINUS تبدیل می کند.

با این توضیحات، در شرایط زیر، برای برگرداندن رکوردهایی که در t1.c1 وجود دارند اما در t2.c1 وجود ندارد(با حذف رکوردهای تکراری!!) دو انتخاب داریم، عملگرEXCEPT و عملگر MINUS:

select t1.c1 from t1
MINUS
select t2.c1 from t2;
D
Z
select t1.c1 from t1
EXCEPT
select t2.c1 from t2;
D
Z

(بیشتر…)

اوراکل 21c – بازگرداندن دیتابیس به هر زمانی در گذشته

اوراکل در نسخه 19c اجازه نمی دهد که یک pdb را به زمانی از یک ORPHAN incarnation برگردانیم:

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Apr 21 08:28:57 2022
Version 19.3.0.0.0
SQL>  SELECT con_id, status, pdb_incarnation# inc#, begin_resetlogs_scn, end_resetlogs_scn FROM v$pdb_incarnation ORDER BY 3;
    CON_ID STATUS        INC# BEGIN_RESETLOGS_SCN END_RESETLOGS_SCN
---------- ------- ---------- ------------------- -----------------
         3 PARENT           0             1920977           1920977
         3 ORPHAN           1             1963437           1963437
         3 CURRENT          2             1964176           1964176
SQL>  alter pluggable database pdb1401 close;
Pluggable database altered.
SQL> flashback pluggable database to scn 1962565;
ORA-39889: Specified System Change Number (SCN) or timestamp is in the middle of a previous PDB RESETLOGS operation.
SQL> flashback pluggable database PDB1401  to scn 1963437;
ORA-39889: Specified System Change Number (SCN) or timestamp is in the middle of a previous PDB RESETLOGS operation.
[oracle@stb ~]$ rman target sys/sys@192.168.1.20:1521/pdb1401
RMAN> reset pluggable database pdb1401  to incarnation 1;
'RMAN-07536: command not allowed when connected to a Pluggable Database'

اما در نسخه 21c این قابلیت به وجود آمد تا بتوان یک PDB را به هر زمانی در گذشته برگرداند(البته گذشته نزدیک). در ادامه با سناریوی زیر و با ایجاد یک ORPHAN incarnation بیشتر با این فیچر را آشنا خواهیم شد.

(بیشتر…)

اوراکل 21c – انجام auditing بر اساس current user

ستونهای DBUSERNAME و CURRENT_USER در ویوی unified_audit_trail شباهت زیادی به هم دارند و در بسیاری از مواقع، این دو ستون حاوی اطلاعات یکسانی هستند. معمولا در این ستونها نام کاربری که به دیتابیس لاگین کرده و دستور را اجرا نموده است ، ذخیره می شود.

مگر آنکه کاربر متصل به دیتابیس با حقوق definer(یا همان definer right)، دستوری را اجرا کند، که در این صورت، نام کاربر متصل به دیتابیس در ستون DBUSERNAME ثبت می شود و نام کاربر definer که مجری واقعی دستور بوده در ستون CURRENT_USER ذخیره می شود.

*برای آشنایی بیشتر با مفهوم definer right و  invoker right پیشنهاد می شود مطلب بررسی Invoker’s Rights و Definer’s Rights را مطالعه کنید.

برای مثال، کاربر A پروسیجر زیر را به صورت definer right تعریف کرده است:

create or replace procedure prc1 authid definer as
  id_var number;
begin
  select object_id into id_var from usef.tbl1 where object_name = ‘TB’;
end;
/

(بیشتر…)

بهبودهای حلقه تکرار FOR در اوراکل 21c

با فرمت حلقه FOR آشنا هستید:

FOR loop_counter IN [REVERSE] lowest_number..highest_number
LOOP
   {...statements...}
END LOOP;

مطابق این syntax، قرار است شمارنده(loop_counter) به صورت ترتیبی(با گام یک) از نقطه lowest_number به نقطه highest_number برسد. برای مثال، با اجرای قطعه کد زیر، اعداد 4 تا 8 نمایش داده می شوند:

SQL> set serveroutput on
begin
  for i in 4 .. 8 loop
    dbms_output.put_line(i);
  end loop;
end;
/
4
5
6
7
8
PL/SQL procedure successfully completed.


(بیشتر…)

تابع ANY_VALUE در اوراکل 21c

ANY_VALUE تابع جدیدی است که در اوراکل 21c معرفی شده و البته در Release Updateهای انتهایی اوراکل نسخه 19c(یعنی از 19.8 به بالا) هم قابل استفاده است. در متن پیش رو با این تابع آشنا خواهیم شد.

*پرس و جوی زیر در pdb1 اجرا می شود و قرار است مشخص کند هر tablespace چند دیتافایل دارد:

select t.ts#, t.name, count(*) "Tedad_DataFile"
  from v$datafile d, v$tablespace t
 where t.ts# = d.ts#
 group by t.ts#, t.name;

همانطور که مشاهده می کنید، در پرس و جوی فوق هر دو ستون ts# و name در قسمت group by قید شده اند در صورتی که عدم درج ستون name در قسمت group by، تغییری در خروجی ایجاد نمی کند اما اوراکل اجازه این کار را به ما نمی دهد:

ORA-00979: not a GROUP BY expression

(بیشتر…)

اوراکل 21c – بهبودهای ابزار AutoUpgrade در زمینه RAC

در نسخه 21c، اوراکل قابلیتهای جدیدی را در زمینه ابزار Autoupgrade ارائه کرده است که قبلا در مورد بعضی از آنها مطالبی را نوشته ایم. یکی دیگر از بهبودهای(البته جزئی) ابزار AutoUpgrade در نسخه 21c، خودکارسازی بعضی از مراحل ارتقا دیتابیس RAC است.

در نسخه های قبل از اوراکل 21c، برای ارتقا دیتابیس RAC، می بایست مراحل زیر به صورت دستی انجام شود:

1.تنظیم پارامتر CLUSTER_DATABASE به مقدار FALSE

2.متوقف کردن instanceهای حاضر در کلاستر

3.استارت یکی از instanceها برای شروع عملیات ارتقا

4. تنظیم مجدد پارامتر CLUSTER_DATABASE به مقدار TRUE بعد از اتمام ارتقا

5.استارت همه instanceها

5.رجیستر کردن نسخه جدید در کلاستر

این عملیات در نسخه 21c به صورت خودکار توسط ابزار AutoUpgrade مدیریت می شود(البته این قابلیت بعدا در اوراکل نسخه 19.8 به بالا هم اضافه شد).

(بیشتر…)

اوراکل 21C – پارامتر pdbTimezone در دستور DBCA

در محیط Container Database می توان در سطح هر containerء، از Time Zone به خصوصی استفاده کرد این امکان در نسخه 12cR1 هم وجود داشت. اسامی Time Zoneها از طریق ویوی V$TIMEZONE_NAMES قابل مشاهده است و با دستور “ALTER DATABASE SET TIME_ZONE” می توان Time Zone دلخواه را برای هر PDB تنظیم کرد:

SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tel_Aviv';
Database altered.
SQL> alter session set container=IranPdb;
Session altered.
SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tehran';
Database altered.
SQL> alter session set container=cdb$root;
Session altered.
SQL> startup force;
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> SELECT dbtimezone FROM DUAL;
DBTIMEZONE
-------------
'Asia/Tel_Aviv'
SQL>  alter session set container=IranPdb;
Session altered.
SQL>  SELECT dbtimezone FROM DUAL;
DBTIMEZONE
-----------
'Asia/Tehran'

(بیشتر…)

اوراکل 21c –  تنظیم خصوصیت compression برای ایندکس در زمان import

به عنوان یک قابلیت جدید در اوراکل 12cR1 می توانستیم در زمان برگرداندن دامپ خصوصیت فشرده سازی را برای جداول فعال/غیرفعال کنیم. این کار از طریق پارامتر TRANSFORM در دستور impdp قابل انجام است:

SQL*Plus: Release 12.2.0.1.0 Production 
SQL> select compression from   dba_tables where  table_name = 'TBL1';
COMPRESS
--------
DISABLED
SQL> drop table usef.tbl1;
Table dropped.
 [oracle@oshost ~]$ impdp usef/a directory=drm dumpfile=test.dmp tables=usef.tbl1 TRANSFORM=TABLE_COMPRESSION_CLAUSE:\"ROW STORE COMPRESS ADVANCED\"
SQL> select compression,COMPRESS_FOR from dba_tables where  table_name = 'TBL1';
COMPRESS COMPRESS_FOR
-------- ------------------------------
ENABLED  ADVANCED

(بیشتر…)

غیرفعال کردن Auto Indexing برای ad hoc query

اوراکل در نسخه 21c با ارائه پارامتر OPTIMIZER_SESSION_TYPE امکان غیرفعال کردن automatic indexing را در سطح session فراهم کرده است. مقدار پیش فرض این پارامتر برابر با NORMAL است و با تنظیم این پارامتر به مقدار ADHOC، همه QUERYهایی که در session جاری اجرا می شوند، از دید Auto Indexing نادیده گرفته خواهند شد.

SQL> alter session set optimizer_session_type=ADHOC;
Session altered.

البته در نسخه 19c می توانستیم بعضی از schemaها را از دید Auto Indexing پنهان کنیم برای مثال با اجرای دستور زیر، اسکیمای ALI در exclusion list قرار خواهد گرفت:

SQL> EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', 'ALI', FALSE);