‏إظهار الرسائل ذات التسميات SQL Tutorials. إظهار كافة الرسائل
‏إظهار الرسائل ذات التسميات SQL Tutorials. إظهار كافة الرسائل

الجمعة، 31 يناير 2014

Lock in Oracle Database

بسم الله الرحمن الرحيم

ان شاء اله هنتكلم على ال Lock

عندنا نوعين من ال Lock بيحصلوا
فى حالة ان User1 بيعمل الجمله الآتيه
UPDATE Employees
SET Salary =5000;
دا اسمه Table Level lock
و دا بيسبب ان User2 او اى حد هيشتغل على اى Row فى ال Table هيفضل منتظر لحد ما User1 يقفل ال Transaction المفتوحه ب Commit او Rollback

و النوع التانى
فى حالة ان User1 بيعمل الجمله الآتيه
UPDATE Employees
SET Salary =5000
WHERE employee_id=150;
دا اسمه Row Level lock
و دا بيسبب ان User2 او اى حد هيشتغل على اى نفس ال  Row فى ال Table هيفضل منتظر لحد ما User1 يقفل ال Transaction المفتوحه ب Commit او Rollback

و هنعرف دلوقتى ازاى نجيب ال Session اللى عامله Lock و اسم المستخدم و اسم مستخدم الجهازو هو داخل و عمل ال Lock ببرنامج ايه SQL*Plus ولا SQL Developer مثلا و جمله ال SQL اللى عامله Lock
دا سكريبت فيه اغلب اللى هنحتاجه 
السكريبت مبنى على اكتر من Dynamic View و هم
v$lock, v$session, v$sql
و تقدروا تشوفوا معلومات اكتر عنهم من:

SELECT L.SID, S.SERIAL#, S.STATE, S.EVENT, S.WAIT_TIME, S.USERNAME, S.OSUSER, 
S.MACHINE, S.PROGRAM, C.SQL_FULLTEXT
FROM V$lock L 
JOIN V$session S
ON (L.SID = S.SID)
JOIN V$sql C
ON (C.SQL_ID = S.SQL_ID)
WHERE L.block > 0;

و بعد ما نعرف كل المعلومات عن ال Lock لو ال User ما عملش Commit او Rollback
لازم ادخل اعمل Kill لل Session اللى مسببه ال Lock
عشان اعمل Kill بحتاج من السكريبت السابق حاجتين
L.SID & S.SERIAL#

و بستخدمهم فى الأمر اللى تحت
Alter System Kill session 'L.SID,S.SERIAL#' immediate;

الاثنين، 20 يناير 2014

[Tutorial] In-line View

بسم الله الرحمن الرحيم

ان شاء هنتناول شرح ال In-line View فى ال SQL

ايه و ظيفتها و اهميتها ؟؟
ال In-line View هى طريقة لكتابة SELECT Statement عند FROM
يعنى اكتب FROM (SELECT * FROM ) و بمعنى تانى انى استخدم ال Sub Query زى ال Table
الطريقة دى مفيده جدا فى حالة انى بعمل Complex Query
ممكن استخدمها فى انى اعمل Join معاها

امثله على ال In-Line View

اول مثال لو عايز اجيب الموظفين اللى عندهم اعلى مرتب فى كل اداره
SELECT a.last_name, a.salary, a.department_id, b.maxsal
  FROM employees a,
       ( SELECT department_id, max(salary) maxsal
         FROM employees
         GROUP BY department_id ) b
 WHERE a.department_id = b.department_id   AND a.salary = b.maxsal;

هنا انا بستخدم Agg Function جوا ال In-Line view عشان اقدر اجيب ال Maxsal و بدى ال Function اسم تانى "Alias" و ال In-Line View بديها Alias و فى ال Main Select Statement بكتب  Inline veiw Alias.Function Alias عشان استخدمها بدون Group by و اقدر اعرض معاها اكتر من Column

مثال
SELECT * 
  FROM ( SELECT deptno, count(*) emp_count
         FROM emp
         GROUP BY deptno ) emp,
       dept
 WHERE dept.deptno = emp.deptno;

و دا مثال Advanced لل DBA عشان تحسب المساحه الفاضيه فى Tablespace
column "Tablespace" format a13 column "Used MB" format 99,999,999 column "Free MB" format 99,999,999 column "Total MB" format 99,999,999 select fs.tablespace_name "Tablespace", (df.totalspace - fs.freespace) "Used MB", fs.freespace "Free MB", df.totalspace "Total MB", round(100 * (fs.freespace / df.totalspace)) "Pct. Free" from (select tablespace_name, round(sum(bytes) / 1048576) TotalSpace from dba_data_files group by tablespace_name ) df, (select tablespace_name, round(sum(bytes) / 1048576) FreeSpace from dba_free_space group by tablespace_name ) fs where df.tablespace_name = fs.tablespace_name;

ان شاء نلتقى فى تدوينه اخرى