חיפוש ה-SQL_ID עבור שאילתת Oracle Analytics

בעת כוונון השאילתות עבור Oracle Analytics, אתה מתבונן במודל הנתונים, בעיצוב הדוח, בעיצוב לוח המידע, בתצורת הרשת, ולפעמים תצטרך לחקור את מסד הנתונים.

טבלת V$SQL

לחקירות מסד נתונים, עליך לדעת מהו ה-SQL_ID של משפט SQL כך שתוכל לעקוב אחר שאילתא ספציפית באמצעות Active Session History (ASH), Automatic Workload Repository (AWR) ו-Oracle SQLTXPLAIN (SQLT).

נושא זה מראה לך כיצד לחפש את ה-SQL_ID על-ידי כריית טבלאות המעקב אחר שימוש שלOracle Analytics וטבלת מערכת מסד הנתונים של Oracle V$SQL (או 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_ACCT - מכילה שאילתות פיזיות

השאילתא הלוגית נרשמת בטבלה הלוגית והשאילתא הפיזית (או שאילתות שנוצרו באמצעות השאילתא הלוגית) נרשמת בטבלת השאילתות הפיזיות.

אפשר לאחד את הטבלאות הלוגית והפיזית בעמודת ID של השאילתא הלוגית. עמודת ID של השאילתא הלוגית בטבלה הלוגית היא ID, ובטבלה הפיזית היא LOGICAL_QUERY_ID.

המפתח לחיפוש SQL_ID היא העמודה PHYSICAL_HASH_ID בטבלה הפיזית. גם הערך PHYSICAL_HASH_ID נכתב אל V$SQL (או GV$SQL) בעמודה ACTION.

Oracle BI Server מחשב קוד גיבוב מהטקסט של שאילתת Logical SQL ומהטקסט של שאילתות SQL הפיזיות. קוד הגיבוב של SQL פיזי, של כל אחת מהשאילתות SQL שרצות על Oracle BI Server, נרשם בעמודה ACTION ב-V$SQL. לקבלת מידע נוסף, ראה קשירת עמודת S_NQ_ACCT עם יומן שאילתות BI.

לקבלת מידע נוסף על העמודות השונות למעקב אחר שימוש, ראה עקוב אחר שימוש ו-olink:OASSG-GUID-2C21BB2B-E7C8-4F2C-97D6-12F5A361A56F.

הקמה

עכשיו שאתה יודע היכן לחפש PHYSICAL_HASH_ID, זוהי משימה יחסית קטנה לכתוב משפט SQL שמתאים ל-SQL שרץ במסד הנתונים עם ניתוח ספציפי שרץ ב-Oracle Analytics.

כאשר טבלאות המעקב אחר שימוש נמצאו באותו מופע מסד הנתונים של מחסן הנתונים, תוכל לכתוב שאילתא יחידה כדי לחפש את SQL_ID.

אם טבלאות המעקב אחר שימוש ומחסן הנתונים שלך נמצאים במופעים שונים של מסד נתוני Oracle, יהיה עליך להריץ שתי שאילתות. ראשית, אתה מריץ שאילתא כדי למשוך את PHYSICAL_HASH_ID של השאילתא שברצונך לחקור מטבלאות המעקב אחר שימוש. שנית, אתה מושך את SQL_ID מתוך V$SQL באמצעות הערך של PHYSICAL_HASH_ID כדי לסנן את העמודה ACTION.

דוגמאות

בדוגמה זו, נניח שטבלאות המעקב אחר שימוש ומחסן הנתונים נמצאים באותו המקום. אחת העמודות, או כולן, מטבלאות המעקב אחר שימוש ו-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;

בדוגמה השניה, נניח שטבלאות המעקב אחר שימוש ומחסן הנתונים נמצאים במסדי נתונים שונים של 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) אינה מכילה מזהה גיבוב פיזי.

בדוגמה הבאה, משתמשים בתחום הנושא ‘A - Sample Sales’ ובוחרים עמודות ספורות בלבד מטבלאות המעקב אחר שימוש.

מתוך ‘A - Sample Sales’, מריצים את השאילתא הבאה:

[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:

להלן תיאור של GUID-5FA7BA53-6767-4839-9341-A6AC0AACDFEB-default.jpg
.jpg

לאחר מכן, בחר את logical_query_id, hash_id, physical_hash_id,ו-query_text מהטבלה הפיזית למעקב אחר שימושהיכן ש-logical_query_id = E841EBB79217270A660CDD3EFB5D986C:

להלן תיאור של GUID-6842B138-0FD5-4DA9-A092-B423EB7459C2-default.jpg
.jpg

כשתביט ביומן ניהול מושבי עבודה, השאילתא הלוגית יוצרת את ה-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 היכן ש-action = ‘bd6708b8':

להלן תיאור של GUID-094521FA-317B-430D-9644-3C3E44D91900-default.jpg
.jpg

השאילתא בעמודה sql_text היא אותו ה-SQL שנראה בטבלה הפיזית למעקב אחר שימוש. מכאן תוכל לראות ש-sql_id לשאילתא בדוגמה הוא ‘1gxhc0acmztwk’.

אם תריץ שוב את אותה השאילתא, תתווסף עוד שורה לטבלה הלוגית למעקב אחר שימוש עם מזהה חדש אך ה-hash_id יהיה זהה:

להלן תיאור של GUID-82CD3499-E550-4DD4-8C96-E3DB3CE3232E-default.jpg
.jpg

באופן דומה, עוד שורה מתווספת אל הטבלה הפיזית למעקב אחר שימוש, עם logical_query_id חדשה, אך hash_id וגם physical_hash_id נשארים זהים:

להלן תיאור של GUID-BF05E975-45FB-4F40-9AE4-9E40A1124F35-default.jpg
.jpg

ייעשה שימוש חוזר גם ב-physical_hash_id אם תריץ שאילתא לוגית דומה כנגד תחום נושא המבוסס על אותם המודלים הלוגי והפיזי. לדוגמה, כאן אתה מריץ שאילתא דומה כנגד ‘C - Sample Costs’:

[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 – Sample Sales’:

[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

]]

ראשית, השתמש בטבלה הלוגית למעקב אחר שימוש כדי לחפש את המזהה. שים לב ש-logical hash_id שונה מהשאילתא שהורצה כנגד ‘A – Sample Sales’:

להלן תיאור של GUID-16D78632-88BA-446F-A6D7-496DA5662869-default.jpg
.jpg

בטבלה הפיזית למעקב אחר שימוש תראה שלמרות ש-hash_id הלוגית שונה, physical_hash_id זהה:

להלן תיאור של GUID-91049191-7E76-407D-B15B-A74160942148-default.jpg
.jpg

בדוגמה אחרת, אתה מריץ את אותן השאילתות (כמו לעיל), אבל הפעם לוחץ על 'רענן'. שים לב למשתנה OBIS_REFRESH_CACHE=1 כדי לציין את הרענון. כצפוי, שורה אחרת מתווספת לטבלה הלוגית למעקב אחר שימוש, אך יש לה logical hash_id אחר.

להלן תיאור של GUID-BFA0DEA8-423A-414C-8BC9-E1B8EA382689-default.jpg
.jpg

עם זאת, כשתבצע שאילתא על הטבלה הפיזית למעקב אחר שימוש, תוכל לראות שלכל השאילתות יש את אותה physical_hash_id.

להלן תיאור של GUID-D6CC7144-9177-4CDA-B57A-1A4E4A6615A5-default.jpg
.jpg

כיוון שלכל ארבע השאילתות הלוגיות יש את אותו ה-physical_hash_id, תראה רק רשומה אחת ב-V$SQL לשאילתא זו:

להלן תיאור של GUID-13AE24EE-9C17-48D9-976F-49FF882A5E42-default.jpg
.jpg

תוכל להשתמש באותה השיטה כדי לפתור בעיות של שאילתות המחשת נתונים המבוססות על תחום נושא (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 המשמשת כמסנן כנגד הטבלה הפיזית למעקב אחר שימוש:

להלן תיאור של GUID-C053C7FB-251A-4021-A850-1F6006BEBFF1-default.jpg
.jpg

מהטבלה הפיזית למעקב אחר שימוש, תוכל למצוא את physical_hash_id:

להלן תיאור של GUID-EB289F16-56B0-4AFB-8C96-2D7B55680B7B-default.jpg
.jpg

כשתבצע שאילתא על V$SQL, תמצא שוב את SQL_ID:

להלן תיאור של GUID-CD805B03-A8AD-40F0-AE84-BD28AC8B6EF8-default.jpg
.jpg

תוכל לחפש את hash_id לוגית ואת physical_hash_id גם ביומן ניהול מושבי העבודה (ראה את הפרקים המודגשים בפיסות המידע שלעיל). פירוש הדבר הוא שתוכל לחפש את ה-SQL_ID מהיומן עצמו. היתרון בשימוש של טבלאות המעקב אחר שימוש הוא שרישומי היומן בניהול מושבי עבודה הם ארעיים, כך שאם לא תאסוף מזהי גיבוב באותו הזמן שבו השאילתא רצה, הם יאבדו.

עם זאת, נתונים נכתבים רק לטבלאות מעקב אחר שימוש בעת השלמת שאילתא. על כן, אם אתה פותר בעיה של שאילתא שרצה לאורך זמן רב וטרם הושלמה, וברצונך לקבוע את ה-sql_id, תוכל לקבל את ה-hash_id הלוגי ואת physical_hash_id מיומן ניהול מושבי העבודה.

אם אתה פותר בעיה של משפט SQL וצריך לחקור את מסד הנתונים, תוכל לאחד מידע בטבלאות המעקב אחר שימוש ובטבלת המערכת V$SQL (או GV$SQL) כדי לחפש במהירות את SQL_ID עבור משפט ה-SQL שאתה חוקר.