
تا قبل از ادیشن 26ai، کوئریهایی که شامل bind variable بودند، نمیتوانستند از قابلیت query rewrite با استفاده از materialized view (MV) بهره ببرند و اوراکل مجبور بود دادهها را مستقیماً از جدولهای پایه بخواند، که باعث از دست رفتن مزایای کاراییِ دادههای پیشتجمیعشده (pre-aggregated data) میشد.از Oracle AI Database 26ai به بعد، این محدودیت حذف شده است و این بهبود به optimizer اجازه میدهد مقدار واقعی bind variable را در زمان اجرا تحلیل کرده و تصمیم بگیرد که آیا کوئری میتواند با استفاده از MV ...
ادامه مطلب
پیش از اوراکل 23ai و 19.28، اسکریپت awrsqrpt.sql یکی از روشهای تحلیل اجراهای قبلی یک کوئری بود و از این طریق می توانستیم آمارهای مربوط به میزان استفاده از CPU، ورودی/خروجی (I/O) ، زمان سپری شده(elapsed time) و … را در یک بازه زمانی مشخص مشاهده کنیم. با این حال، این روش دو محدودیت اصلی داشت. در این روش نیاز بود دو AWR snapshot تعیین شوند و ضمنا اطلاعات ا...
ادامه مطلب
در دیتابیس اوراکل، state بستههای PL/SQL در سطح session حفظ می شود. یعنی زمانی که یک package در session ای اجرا میشود، متغیرهای global آن، مقادیر خود را در میان چندین فراخوانی حفظ میکنند. در نسخههای قبلی Oracle(قبل از 26ai)، زمانی که یک package دوباره compile میشد، تمام sessionهایی که state آن package را نگه داشته اند با خطاهای ORA-04068 مواجه میشد...
ادامه مطلب
تا قبل از نسخه 26ai، کوئریهایی که شامل bind variable بودند، نمیتوانستند از قابلیت query rewrite با استفاده از materialized view (MV) بهره ببرند و اوراکل مجبور بود دادهها را مستقیماً از جدولهای پایه بخواند، که باعث از دست رفتن مزایای کاراییِ دادههای پیشتجمیعشده (pre-aggregated data) میشد. از Oracle AI Database 26ai به بعد، این محدودیت حذف شده است...
ادامه مطلب
زمانی که یکی از مجوزهای system “ANY” privilege نظیر select any table، drop any table و … را به کاربری می دهیم، آن کاربر امکان دسترسی به objectهای شمای sys و جداول Data Dictionary را ندارد: SQL*Plus: Release 10.1.0.4.2 - Production on Tue Jan 9 10:38:31 2024 SQL> show user USER is "SYS" SQL> create table sys.tb as select * from dual; Table created. SQL> create user usef identified by a; User created. SQL> grant create session,select any table to usef; Grant succeeded. SQL> co usef/a Coected. SQL> select * from sys.tb; ORA-00942: table or view does not exist SQL> select * from v$datafile; ORA-00942: table or view does not exist اگر تصمیم داریم این محدودیت را حداقل در مو...
ادامه مطلب
Hybrid Partitioned Table قابلیت جدیدی است که اوراکل در نسخه 19c ارائه کرده است با کمک این قابلیت می توان برای یک جدول، تلفیقی از پارتیشنهای exteal و inteal را ایجاد کرد. این روش از پارتیشن بندی، صرفا متدهای Range و List را پشتیبانی می کند البته در نسخه 19c امکان استفاده از متد Automatic List برای Hybrid Partitioned Table وجود ندارد و این امکان از نسخه 23c به وجود آمد. بنابرین از این نسخه(23c) می توانیم برای جداول Hybrid Partitioned Table از قابلیت Automatic List Partitioning استفاده کنیم. قبل از ایجاد جدول مورد نظر، دایرکتوری مربوط به دیتایی که در سیستم عامل قرار دارند را ایجاد می کنیم: SQL> create directory E_PARTITIONs as '/PARTITIONs'; Directory created جدول mytbl از نوع هیبریدی است و...
ادامه مطلب
SQL Firewall یکی دیگر از قابلیتهای جدید اوراکل در نسخه 23c است بر اساس این قابلیت می توانیم مجموعه ای از دستورات را به عنوان دستورات مجاز برای دیتابیس تعریف کنیم در این صورت کاربر نمی تواند دستور دیگری خارج از این مجموعه را اجرا کند حتی اگر این کاربر مجوز اجرای آن دستورات را داشته باشد. قصد داریم اقدامات کاربر Usef را تحت نظر بگیریم و تمامی دستورات اجرا شده توسط این کاربر را capture کنیم سپس با تنظیم SQL Firewall، به این کاربر اجازه ندهیم خارج از دستوراتی که capture شده اند، دستور جدیدی را اجرا کند. برای اجرای این سناریو، ابتدا محیط تست را آماده می کنیم. SQL> create user usef identified by a; User created. SQL> grant dba to usef; Grant succeeded. SQL> co usef/a@OEL8:1521/TEHR...
ادامه مطلب
در این مطلب سعی داریم تعدادی از قابلیتهای جدید اوراکل 23c در زمینه جداول Blockchain و Immutable را مرور کنیم. امکان حذف و اضافه کردن ستون به جداول Blockchain و Immutable در نسخه 23c می توان به جداول Blockchain ستونی را اضافه کرد(البته در version v2 این نوع از جداول): SQL> create blockchain table blockchaintb1 ( id number(10), desc1 varchar2(100) ) no drop until 20 days idle no delete until 20 days after insert hashing using "SHA2_512" version "v2"; Table created. SQL> alter table blockchaintb1 add (desc2 varchar2(1000)); Table altered. حذف ستون هم در این نسخه امکان پذیر است: SQL> alter table blockchaintb1 drop column desc2; Table altered. در صورت درج اطلاعات در ای...
ادامه مطلب
از نسخه های قدیمی اوراکل امکان resize کردن دیتافایلها وجود دارد: SQL*Plus: Release 10.1.0.4.2 - Production on Tue Nov 21 11:15:16 2023 SQL> select bytes/1024/1024 SIZE_MB from v$datafile where file#=29; SIZE_MB ---------- 1024 SQL> alter database datafile 29 resize 120m; Database altered. SQL> select bytes/1024/1024 SIZE_MB from v$datafile where file#=29; SIZE_MB ---------- 120 البته resize کردن دیتافایلها همیشه با موفقیت انجام نمی شود و بعضا با آزاد بودن درصد بالایی از فضای دیتافایل، به دلیل قرار گرفتن بعضی از بلاکهای segment بر سر High Water Mark، امکان کاهش سایز دیتافایل وجود ندارد و در این حالت به خطای زیر برخواهیم خورد: SQL> alter database datafile 1 resi...
ادامه مطلب
Table Values Constructor قابلیتی است که در بیشتر دیتابیسهای رابطه ای وجود داشته و اوراکل امکان استفاده از این قابلیت را در نسخه 23c فراهم کرده است. بر اساس این قابلیت، می توانیم با اجرای یک دستور insert ساده(Insert به همراه عبارت Values) چندین رکورد را در یک جدول درج کنیم البته استفاده از کلمه کلیدی Values به دستور insert محدود نمی شود و از این عبارت می توانیم برای دستورات DMLای دیگر نظیر Select و Merge هم استفاده کنیم. ابتدا مثالی از نحوه استفاده از این قابلیت را به همراه دستور insert مشاهده می کنید. SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Aug 29 22:41:17 2023 SQL> insert into Irani values(1,'Vahid'),(2,'Usef'); 2 rows created. SQL> commit; Commit complete. با اجرای ...
ادامه مطلب
بروز شدن همزمان Materialized Viewهای on-commit refresh از طریق sessionهای مختلف می تواند سبب رخ دادن eventای به نام enq: JI – contention شود چرا که این نوع از MVها به طور پیش فرض به صورت سریالی بروز می شوند و امکان بروزرسانی Concurrent را ندارند. در قسمت زیر، از طریق دو session به طور همزمان دیتایی را در جدول مرجع MV درج کرده ایم که این مسئله سبب شد تعداد زیادی از eventهای enq: JI – contention را شاهد باشیم: SQL> create materialized view auther_contry_mv refresh fast on commit as select country,count(*) from author_tbl group by country; Materialized view created. Session 1: SQL> begin for i in 10000 ..19999 loop insert into author_tbl values(i,'Rahmat Rabbani','m','Oracle DBA'...
ادامه مطلب
برای استفاده از قابلیت Memoptimized Rowstore در نسخه های 19c و 21c، ابتدا می بایست این قابلیت را در سطح جدول فعال می کردیم و بعد از آن، در زمان درج دیتا، Hintای را به دستور insert اضافه می کردیم با توجه به آنکه ممکن است application از قبل نوشته شده باشد، اضافه کردن Hint به دستور insert می تواند مانعی برای استفاده از قابلیت Memoptimized Rowstore شود. SQL> ALTER TABLE tbl1 MEMOPTIMIZE FOR WRITE; Table altered SQL> INSERT /*+ MEMOPTIMIZE_WRITE */ INTO tbl1 VALUES (1,'usefzadeh.com'); بنابرین در نسخه های یاد شده، بدون استفاده از هینت MEMOPTIMIZE_WRITE امکان استفاده از این قابلیت وجود نداشت. در نسخه 21c اوراکل پارامتری به نام MEMOPTIMIZE_WRITES را اضافه کرده است که از طریق آن می توان بدون...
ادامه مطلب
اوراکل در نسخه 23c قابلیتی به نام JSON Relational Duality View را ارائه کرده است که می توان از طریق آن به طور همزمان از(بسیاری از) مزیتهای Relational data model و JSON data model بهرمند شد. می دانیم که انتخاب هر کدام از این دیتامدلها می تواند بر حسب شرایط، مزایا و معایبی را به همراه داشته باشد. به طور مثال در مدل Relational می توان از مزیتهایی نظیر «جلوگیری از Data duplication، نرمالسازی، consistency» و … بهره گرفت و از طرف دیگر «خوانایی، سادگی، خود توصیفی، hierarchical document» نمونه هایی از مزیتهای JSON هستند. بر اساس قابلیت JSON Relational Duality View، دیتا در جداول به صورت relational ذخیره می شوند و با ایجاد یک Duality View بر روی جداول رابطه ای، امکان دسترسی و دستکاری(Delete، Insert، ...
ادامه مطلب
در صورتی که دو کاربر قصد ویرایش یک رکورد را داشته باشند، کاربری که دیرتر دستور update را اجرا کرده Block خواهد شد و تا زمانی که کاربر اول(کاربری که زودتر رکورد را در اختیار گرفته) به تراکنش خاتمه ندهد، کاربر دوم در حالت Block باقی خواهد ماند. --session 1: SQL> select sid from v$mystat where rownum=1; SID ---------- 2190 SQL> update USEF.TBL1 set id=1; 1 row updated --session 2: SQL> select sid from v$mystat where rownum=1; SID ---------- 944 SQL> update USEF.TBL1 set id=1; Executing… بلاک شدن session دوم را می توانیم از طریق دستور زیر ببینیم: SQL> select SID,ID1,ID2,LMODE,block,request from v$lock where type='TX'; SID ID1 ID...
ادامه مطلب
از نسخه های قدیمی اوراکل این امکان را داشتیم که برای ستونهای جداول، مقدار پیش فرض و یا همان Default Value تعریف کنیم. با تنظیم Default Value برای یک ستون، اگر در زمان اجرای دستور insert مقداری را برای آن ستون لحاظ نکرده باشیم، Default Value برای آن ستون اعمال خواهد شد: SQL*Plus: Release 10.1.0.4.2 - Production on Sat Aug 5 16:28:29 2023 SQL> create table tbl1(id number,tarikh date default sysdate+1); Table created. SQL> insert into tbl1(id) values(1); 1 row created. SQL> select * from tbl1; ID TARIKH ---------- --------- 1 06-AUG-23 در این شرایط اگر به صراحت مقدار NULL را برای ستون tarikh در نظر بگیریم چه اتفاقی می افتد؟ SQL> insert into tbl1 values(2,null); 1 ...
ادامه مطلب
قابلیت SQL History در نسخه 23c امکان مشاهده آخرین دستورات اجرا شده توسط sessionها را فراهم می کند(حدودا 50 دستور برای هر session) اوراکل بر اساس این قابلیت، دستوراتی که اجرای آنها به خطا خورده را هم نمایش می دهد. برای فعال کردن قابلیت SQL History باید پارامتر SQL_HISTORY_ENABLED را به مقدار TRUE تنظیم کرد مقدار پیش فرض این پارامتر برابر با False است: SQL> show parameter SQL_HISTORY_ENABLED NAME TYPE VALUE -------------------- --------- ------- sql_history_enabled boolean FALSE این پارامتر در دو سطح session و system قابل تنظیم است: SQL> alter system set sql_history_enabled=true; System altered بعد از تنظیم این پارامتر، برای مشاهده لیست دستورات اجرا شده می توان ...
ادامه مطلب
دیتابیس اوراکل در نسخه 23c سعی کرده تا بسیاری از قابلیتهای موجود در دیتابیسهای رابطه ای دیگر را در این version ارائه کند قابلیتهای ساده ای نظیر «Schema level privilege» – «Boolean data type» – «Direct Joins for UPDATE and DELETE» -«SELECT without FROM» و … یکی دیگر از این قابلیتها که موضوع بحث این مستند هم هست، SQL domain می باشد که می تواند شامل مجموعه ای از محدودیتها و خصوصیتها باشد و با تخصیص آن به یک ستون، می توان محدودیتهایی را برای آن ستون اعمال کرد به عبارت دیگر، SQL domain امکان توسعه Data type را متناسب با Business فراهم می کند. یکی از کاربردهای مهم این قابلیت به زمانی برمی گردد که بخواهیم برای مقادیر ورودی یک ستون، شرطهای به خصوصی را اعمال کنیم. مثلا برای ستون Age با نوع داده ...
ادامه مطلب
تا قبل از نسخه 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 وجود ندارد(با حذف رک...
ادامه مطلب
همانطور که می دانید، با شروع یک تراکنش، undo segmentای هم به آن اختصاص داده می شود تا اطلاعاتی که تراکنش در حال کار با ان است را در خود جای دهد به طور مثال، قبل از حذف یک رکورد در یک تراکنش، اطلاعات...
ادامه مطلب
زمانی که جدولی را با دستور drop حذف می کنیم، جدول مورد نظر، به recycle bin منتقل خواهد شد(البته منظور از انتقال، انتقال فیزیکی نیست و صرفا امری منطقی اتفاق خواهد افتاد) و تا زمانی که tablespaceای که ج...
ادامه مطلب