عند ضبط الاستعلامات فيOracle Analytics، اطلع على نموذج البيانات وتصميم التقرير وتصميم لوحة المعلومات وتكوين الشبكة وأحيانًا تحتاج إلى التحقيق في قاعدة البيانات.
جدول V$SQL
بالنسبة لتحقيقات قاعدة البيانات، يجب أن تعرف SQL_ID
لجملة SQL تتمكن من تتبع استعلام معين عبر محفوظات الجلسات النشطة (ASH)، ومستودع حمل العمل التلقائي (AWR)، وOracle SQLTXPLAIN (SQLT).
يعرض هذا الموضوع كيفية العثور على SQL_ID
باستخراج بيانات جداول تتبع استخدام Oracle Analytics وجدول نظام قاعدة بيانات Oracle database بالاسم V$SQL
(or GV$SQL
لقاعدة بيانات RAC).
جدول V$SQL
هو جدول نظام قاعدة بيانات Oracle يتتبع إحصائيات استعلامات SQL الفردية. يوجد صف واحد في الجدول لكل جملةSQL تقوم بتشغيلها، ويتم تعريف كل صف بواسطة عمود SQL_ID
. يمكنك استخدام SQL_ID
لتتبع جملة SQL عبر قاعدة بيانات Oracle.
ستجد الكثير من المعلومات المفيدة حول استعلاماتك في جدول V$SQL
(أو GV$SQL
لقاعدة بيانات RAC).
جداول تتبع الاستخدام
لا تتبع جداول تتبع الاستخدام مباشرة SQL_ID
كن يمكن بسهولة تتبع SQL_ID
عائدًا إلى جدول V$SQL
(أو GV$SQL
لقاعدة بيانات RAC).
عند تمكين تتبع الاستخدام في Oracle Analytics، يتم تتبع كل الاستعلامات في جدولين:
S_NQ_ACCT
: يحتوي على الاستعلامات المنطقيةS_NQ_DB_ACCT
: يحتوي على الاستعلامات الفعليةيتم تسجيل الاستعلام المنطقي في جدول الاستعلامات المنطقية والاستعلام الفعلي (أو الاستعلامات الناتجة عن الاستعلام المنطقي) يتم تسجيله في جدول الاستعلام الفعلي.
يمكنك ربط الجداول الفعلية والمنطقية في عمود معرف الاستعلام المنطقي. عمود معرف الاستعلام المنطقي في الجدول المنطقي هو المعرف
وفي الجدول الفعلي يكون LOGICAL_QUERY_ID.
مفتاح العثور على SQL_ID
هو عمود PHYSICAL_HASH_ID
في الجدول الفعلي. تتم كتابة قيمة PHYSICAL_HASH_ID
أيضًا في جدول V$SQL
(أو جدول GV$SQL
) في عمود ACTION
.
يحسب Oracle BI Server شفرة هاش من نص استعلام SQL المنطقي ونص استعلامات SQL المنطقية. يتم تسجيل شفرة هاش SQL الفعلية، لأي استعلاماتSQL تم تشغيلها من Oracle BI Server، في عمود ACTION
في الجدولV$SQL
. لمعرفة المزيد من المعلومات، يرجى الاطلاع على ربط السجل S_NQ_ACCT بسجل استعلامات BI.
لمزيد من المعلومات حول أعمدة تتبع الاستخدام المتعددة، يرجى الاطلاع على تتبع الاستخدام واستيعاب جداول تتبع الاستخدام.
الإعداد
الآن تعرف أين تجد PHYSICAL_HASH_ID
، ويمكنك كتابة جملة SQL ترتبط باستعلام SQL الذي يعمل في قاعدة البيانات بتحليل معين في يعمل في Oracle Analytics.
عندما تكون جداول تتبع الاستخدام في مثيلات قاعدة البيانات نفسها مثل مستودع البيانات، يمكنك كتابة استعلام واحد للعثور على SQL_ID.
إذا كانت جداول تتبع الاستخدام ومستودع بياناتك في مثيلات قاعدة بيانات Oracle مختلفة، فستحتاج إلى تشغيل استعلامين. أولاً، قم بتشغيل استعلام لسحب PHYSICAL_HASH_ID
للاستعلام الذي تريد التحقيق به من جداول تتبع الاستخدام. ثانيًا، اسحب SQL_ID
من جدول V$SQL
باستخدام قيمة PHYSICAL_HASH_ID
لترشيح عمود ACTION
.
المثال 1
في هذا المثال، نفترض أن جداول تتبع الاستخدام ومستودع البيانات في موقع مشترك. يمكن استخدام أي من الأعمدة من تتبع الاستخدام أو كلها وجداول V$SQL
في الاستعلام لكن في هذا المثال، تحدد المجموعة الفرعية التالية:
select o.sql_id, to_char(l.start_ts, 'YYYY-MM-DD HH24:MI:SS'), l.id as l_id, p.logical_query_id, l.hash_id, l.saw_src_path, l.query_src_cd, l.success_flg, l.num_db_query, l.query_text, p.query_text, o.sql_text, p.physical_hash_id, o.action from usage_tracking.s_nq_acct l, usage_tracking.s_nq_db_acct p, v$sql o where l.id = p.logical_query_id and o.action = p.physical_hash_id and l.start_dt > trunc(sysdate - 1) and l.end_dt < trunc(sysdate) order by l.start_ts, l.id, l.hash_id, p.physical_hash_id, o.sql_id;
المثال 2
في هذا المثال، نفترض أن جداول تتبع الاستخدام ومستودع البيانات في قواعد بيانات Oracle مختلفة.
أولاً، قم بكتابة استعلام مقابل جداول تتبع الاستعلام PHYSICAL_HASH_ID
:
select to_char(l.start_ts, 'YYYY-MM-DD HH24:MI:SS'), l.id as l_id, p.logical_query_id, l.hash_id, l.saw_src_path, l.query_src_cd, l.success_flg, l.num_db_query, l.query_text, p.query_text, p.physical_hash_id from usage_tracking.s_nq_acct l, usage_tracking.s_nq_db_acct p where l.id = p.logical_query_id and l.start_dt > trunc(sysdate - 1) and l.end_dt < trunc(sysdate) order by l.start_ts, l.id,l.hash_id, p.physical_hash_id;
بعد ذلك، اكتب استعلامًا مقابل V$SQL
للحصول على SQL_ID
، باستخدام قيم PHYSICAL_HASH_ID
كمرشح:
select o.action, o.sql_id, o.sql_text from v$sql o where o.action = ‘<physical_hash_id>’ order by o.sql_id;
إذا كانت لديك قاعدة بياناتRAC، بدلاً من جدول V$SQL
، يمكنك استخدام جدول GV$SQL
للحصول على SQL_ID
:
select o.action, o.sql_id, o.sql_text from gv$sql o where o.action = '<physical_hash_id>' order by o.sql_id;
لا يعمل هذا الأسلوب إذا كنت تكتشف أخطاء كتل التهيئة وتصلحها لأن جدول تتبع استخدام كتل التهيئة (S_NQ_INITBLOCK
) لا يحتوي على معرف شفرة هاش فعلية.
المثال 3
في هذا المثال، أنت تستخدم منطقة موضوعات "A - المبيعات العينة" وتحدد أعمدة قليلة فقط من جداول تتبع الاستخدام.
من "A - المبيعات العينة"، قم بتشغيل الاستعلام التالي:
[2022-02-04T15:11:17.629+00:00] [OBIS] [TRACE:2] [USER-0] [] [ecid: e49b96a8-33c4-4ba7-a877-e564d207eca1-00242531,0:1:38:3] [sik: bootstrap] [tid: dd1bc700] [messageId: USER-0] [requestid: 33e30020] [sessionid: 33e30000] [username: oacadmin] ############################################## [[ -------------------- SQL Request, logical request hash: cee7ec94 SET VARIABLE QUERY_SRC_CD='Report';SELECT 0 s_0, "A - Sample Sales"."Offices"."D1 Office" s_1, "A - Sample Sales"."Base Facts"."10- Variable Costs" s_2, "A - Sample Sales"."Base Facts"."11- Fixed Costs" s_3 FROM "A - Sample Sales" ORDER BY 2 ASC NULLS LAST FETCH FIRST 125001 ROWS ONLY ]]
عند تحديد start_ts
، وid
، وhash_id
، وquery_src_cd
، وquery_text
من الجدول الفعلي لتتبع الاستخدام الذي تحصل عليه من قيمة ID
وهي E841EBB79217270A660CDD3EFB5D986C.
بعد ذلك، حدد logical_query_id
، وhash_id
، وphysical_hash_id
، وquery_text
من الجدول الفعلي لتتبع الاستخدام حيث يكون LOGICAL_QUERY_ID
هو E841EBB79217270A660CDD3EFB5D986C.
عند النظر في سجل إدارة الجلسات، ينتج الاستعلام المنطقي تعليمة SQL برمجية في عمود QUERY_TEXT
:
[2022-02-04T15:11:17.637+00:00] [OBIS] [TRACE:2] [USER-18] [] [ecid: e49b96a8-33c4-4ba7-a877-e564d207eca1-00242531,0:1:38:5] [sik: bootstrap] [tid: dd1bc700] [messageId: USER-18] [requestid: 33e30020] [sessionid: 33e30000] [username: oacadmin] -------------------- Sending query to database named 01 - Sample App Data (ORCL) (id: <<62275>>), client type Oracle Call Interface (OCI), connection pool named Sample Relational Connection, logical request hash cee7ec94, physical request hash bd6708b8: [[ WITH SAWITH0 AS (select sum(T5398.Cost_Fixed) as c1, sum(T5398.Cost_Variable) as c2, T5257.Office_Dsc as c3, T5257.Office_Key as c4 from BISAMPLE.SAMP_OFFICES_D T5257 /* D30 Offices */ , BISAMPLE.SAMP_REVENUE_F T5398 /* F10 Billed Rev */ where ( T5257.Office_Key = T5398.Office_Key ) group by T5257.Office_Dsc, T5257.Office_Key), SAWITH1 AS (select 0 as c1, D1.c3 as c2, D1.c2 as c3, D1.c1 as c4, D1.c4 as c5 from SAWITH0 D1) select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4 from ( select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4 from SAWITH1 D1 order by c2 ) D1 where rownum <= 125001 ]]
أخيرًا، حدد action
، وsql_id
، وsql_text
من جدول V$SQL
حيث الإجراء
هو bd6708b8.
الاستعلام في عمود sql_text
هو تعليمة SQL البرمجية نفسها الموجودة في الجدول الفعلي لتتبع الاستخدام. من هذا، يمكنك رؤية أن sql_id
للاستعلام في السؤال هو 1gxhc0acmztwk.
إذا قمت بتشغيل الاستعلام نفسه مرة أخرى، تتم إضافة صف آخر للجدول المنطقي لتتبع الاستخدام بمعرف جديد لكن hash_id
هو نفسه.
وهكذا، تتم إضافة صف آخر إلى الجدول الفعلي لتتبع الاستخدام مع logical_query_id
جديد، لكن يظل كل من hash_id
وphysical_hash_id
نفسيهما.
المثال 4
تتم أيضًا إعادة استخدام physical_hash_id
عند تشغيل استعلام منطقي مشابه مقابل منطقة قائمة على النماذج الفعلية والمنطقية نفسها. على سبيل المثال، إذا قمت بتشغيل استعلام مماثل مقابل C - التكاليف العينة:
[2022-02-04T16:10:17.862+00:00] [OBIS] [TRACE:2] [USER-0] [] [ecid: e49b96a8-33c4-4ba7-a877-e564d207eca1-00242ce7,0:1:15:3] [sik: bootstrap] [tid: 58504700] [messageId: USER-0] [requestid: 13c9003c] [sessionid: 13c90000] [username: oacadmin] ############################################## [[ -------------------- SQL Request, logical request hash: 7b5ea9b1 SET VARIABLE QUERY_SRC_CD='Report';SELECT 0 s_0, "C - Sample Costs"."Offices"."D1 Office" s_1, "C - Sample Costs"."Base Facts"."10- Variable Costs" s_2, "C - Sample Costs"."Base Facts"."11- Fixed Costs" s_3 FROM "C - Sample Costs" ORDER BY 2 ASC NULLS LAST FETCH FIRST 125001 ROWS ONLY ]]
ينتج هذا الاستعلام المنطقي SQL نفسه الموجود في الاستعلام الذي قمت بتشغيله مقابل A – المبيعات العينة:
[2022-02-04T16:10:17.866+00:00] [OBIS] [TRACE:2] [USER-18] [] [ecid: e49b96a8-33c4-4ba7-a877-e564d207eca1-00242ce7,0:1:15:5] [sik: bootstrap] [tid: 58504700] [messageId: USER-18] [requestid: 13c9003c] [sessionid: 13c90000] [username: oacadmin] -------------------- Sending query to database named 01 - Sample App Data (ORCL) (id: <<52912>>), client type Oracle Call Interface (OCI), connection pool named Sample Relational Connection, logical request hash 7b5ea9b1, physical request hash bd6708b8: [[ WITH SAWITH0 AS (select sum(T5398.Cost_Fixed) as c1, sum(T5398.Cost_Variable) as c2, T5257.Office_Dsc as c3, T5257.Office_Key as c4 from BISAMPLE.SAMP_OFFICES_D T5257 /* D30 Offices */ , BISAMPLE.SAMP_REVENUE_F T5398 /* F10 Billed Rev */ where ( T5257.Office_Key = T5398.Office_Key ) group by T5257.Office_Dsc, T5257.Office_Key), SAWITH1 AS (select 0 as c1, D1.c3 as c2, D1.c2 as c3, D1.c1 as c4, D1.c4 as c5 from SAWITH0 D1) select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4 from ( select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4 from SAWITH1 D1 order by c2 ) D1 where rownum <= 125001 ]]
أولاً، استخدم الجدول المنطقي لتتبع الاستخدام للعثور على المعرف. يمكنك رؤية أن hash_id
يختلف عن الاستعلام الذي تم تشغيله مقابل A – المبيعات العينة.
في الجدول الفعلي لتتبع الاستخدام، ترى أنه حتى بالرغم من أن hash_id
مختلف، فإن physical_hash_id
هو نفسه.
المثال 5
في هذا المثال، تقوم بتشغيل الاستعلامات نفسها لكن هذه المرة تنقر على Refresh. لاحظ أن المتغير OBIS_REFRESH_CACHE=1
يشير إلى التجديد. كما هو متوقع، يتم إدراج صف آخر في الجدول المنطقي لتتبع الاستخدام لكن له logical hash_id
مختلف.
لكن، عند الاستعلام على الجدول الفعلي لتتبع الاستخدام، يمكنك رؤية أن كل الاستعلامات لها physical_hash_id.
نفسه
لأن هذه الاستعلامات المنطقية الأربعة لها physical_hash_id
نفسه، لن ترى إلا سجلاً واحدًا في جدول V$SQL
لهذا الاستعلام.
المثال 6
يمكنك استخدام الأسلوب نفسه لاكتشاف أخطاء استعلامات التمثيل المرئي للبيانات بناءً على منطقة (RPD) أو اتصال قاعدة بيانات. لاتصالات قاعدة البيانات، يتضمن هذا كل من التمثيلات المرئية للبيانات والاستعلامات المستخدمة لملء مجموعات البيانات.
يمكنك تحديد نوع الاستعلام، أي، تمثيل مرئي للبيانات، ومجموعة بيانات، وتحليل، وODBC، وغيرها، من قيمة العمود QUERY_SRC_CD
. على سبيل المثال، استعلامات تمثيل البيانات بالقيمة Visual Analyzer
، يكون للاستعلام المستخدم لملء قاعدة البيانات القيمةdata-prep
، والتحليلات بالقيمة Report
، والاستعلامات باستدعاءات إجراء ODBC الداخلي نفسها بالقيمة Soap.
لتكوين جملة SQL لتمثيل بيانات، يجب تغيير وصول البيانات إلى مباشر لمجموعة البيانات الأساسية.
في هذا المثال، تقوم بتكوين استعلام تمثيل مرئي للبيانات (مشابه للاستعلامات السابقة) مقابل مجموعة بيانات قائمة على اتصال بقاعدة بيانات Oracle:
[2022-02-03T19:42:06.564+00:00] [OBIS] [TRACE:2] [USER-0] [] [ecid: f95b5f1b-1e5c-4604-b82a-3eb3717f3aa6-002aa26e,0:1:1:3] [sik: bootstrap] [tid: 58b0a700] [messageId: USER-0] [requestid: ed830023] [sessionid: ed830000] [username: oacadmin] ############################################## [[ -------------------- SQL Request, logical request hash: 3158b05 SET VARIABLE QUERY_SRC_CD='Visual Analyzer',SAW_SRC_PATH='{"viewID":"view!1","currentCanvas":"canvas!1"}',ENABLE_DIMENSIONALITY = 1; SELECT 0 s_0, XSA('oacadmin'.'BISAMPLE_OfficeRevenue')."SAMP_OFFICES_D"."OFFICE_DSC" s_1, XSA('oacadmin'.'BISAMPLE_OfficeRevenue')."SAMP_REVENUE_F"."COST_FIXED" s_2, XSA('oacadmin'.'BISAMPLE_OfficeRevenue')."SAMP_REVENUE_F"."COST_VARIABLE" s_3 FROM XSA('oacadmin'.'BISAMPLE_OfficeRevenue') ORDER BY 2 ASC NULLS LAST FETCH FIRST 125001 ROWS ONLY /* AdditionalDetail='VisualAnalyzer' */
مما ينتج تعليمة SQL البرمجية التالية:
[2022-02-03T19:42:06.960+00:00] [OBIS] [TRACE:2] [USER-18] [] [ecid: f95b5f1b-1e5c-4604-b82a-3eb3717f3aa6-002aa26e,0:1:1:5] [sik: bootstrap] [tid: 58b0a700] [messageId: USER-18] [requestid: ed830023] [sessionid: ed830000] [username: oacadmin] -------------------- Sending query to database named 'oacadmin'.'BISAMPLE' (id: <<147945>>), client type OCI 10g/11g, connection pool named 'oacadmin'.'BISAMPLE', logical request hash 3158b05, physical request hash c48e8741: [[ WITH SAWITH0 AS (select T1000005.OFFICE_KEY as c1, T1000005.OFFICE_DSC as c2 from BISAMPLE.SAMP_OFFICES_D T1000005), SAWITH1 AS (select T1000008.OFFICE_KEY as c1, T1000008.COST_FIXED as c2, T1000008.COST_VARIABLE as c3 from BISAMPLE.SAMP_REVENUE_F T1000008), SAWITH2 AS (select D1.c2 as c1, D2.c2 as c2, D2.c3 as c3 from SAWITH0 D1 inner join SAWITH1 D2 On D1.c1 = D2.c1), SAWITH3 AS (select D102.c1 as c1, sum(D102.c2) as c2, sum(D102.c3) as c3 from SAWITH2 D102 group by D102.c1) select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4 from ( select 0 as c1, D110.c1 as c2, D110.c2 as c3, D110.c3 as c4 from SAWITH3 D110 order by c2 ) D1 where rownum <= 125001
من الجدول المنطقي لتتبع الاستخدام، يمكنك العثور على hash_id
المستخدم كمرشح مقابل الجدول الفعلي لتتبع الاستخدام.
من الجدول الفعلي لتتبع الاستخدام، يمكنك العثور على physical_hash_id.
عند استعلام الجدول V$SQL
، ستجد SQL_ID
مرة أخرى.
يمكنك أيضًا العثور على hash_id
وphysical_hash_id
المنطقي في سجل إدارة الجلسات (اطلع على الأقسام المميزة في أمثلة السجلات السابقة). يعني هذا أنه يمكنك العثور على SQL_ID
من السجل نفسه. مزايا استخدام جداول تتبع الاستخدام هي قيود السجل في إدارة السجلات مؤقتة، لذا ما لم تكن تجمع معرفات هاش في نفس وقت تشغيل الاستعلام، فستضيع.
لكن، لا تتم كتابة البيانات إلا بجداول تتبع الاستخدام عند اكتمال استعلام. لذا، إذا كنت تستكشف أخطاء الاستعلام الذي يعمل ولم يكتمل بعد وتصلحها وتريد تحديد sql_id
، يمكنك الحصول على hash_id
المنطقي وphysical_hash_id
من سجل إدارة الجلسات.
إذا كنت تستكشف أخطاء جملة SQL وتحتاج إلى التحقيق في قاعدة البيانات، يمكنك ربط المعلومات في جداول تتبع الاستخدام وجدول نظام V$SQL
(أو GV$SQL
) للعثور سريعًا على SQL_ID
لجملة SQL التي تحقق بها.