Oracle

甲骨文灰分報告

  • March 6, 2012

最近,我收到了一份來自 DBA的灰分報告。

對我來說,這份報告就像法語。我不知道它是關於什麼的,也不知道這份報告中寫了什麼。有人可以指導我閱讀它並解釋我應該採取哪些步驟來使我的查詢穩定並減少 CPU 消耗。此外,哪個查詢佔用更多 CPU。

  1. 請建議我應該執行哪些操作。

  2. 哪個查詢佔用了我的 CPU 更多,我應該如何改進它。

首先,Oracle DBA 應該通過查看 ASH 和 AWR 報告來了解問題所在。如果沒有 AWR 報告,就很難知道這裡真正的問題是什麼。但是,我會幫助您完成第一個查詢。

上面的查詢Top SQL with Top Row Sources顯示了帶有 sql_id 的查詢8t441yd5bwygd正在執行表掃描。Complete List Of SQL Text您可以在該部分中看到查詢的文本。

這裡的主要問題是LIKE查詢中有一個子句,它也使用lower()函式將列數據轉換為小寫,然後與綁定變數進行比較,綁定變數:1是從應用程序傳入查詢的值。

降低:

select * from PERSON_CARD where lower(PERSON_ID) like :1;

為了正確回答這個問題,我們確實需要有關所涉及列的數據類型以及應用程序可以傳遞到 WHERE 子句中的可能值的更多資訊,但也有一些可能性。

我擔心這個 SQL(可能還有模式設計)是由 Hibernate 生成的,而且 PERSON_ID 是一個長的十六進製字元串 UDID 而不是整數。

1) PERSON_ID 列中的數據為非數字字元串:

如果(且僅當)輸入值 :1 僅在字元串末尾包含單個萬用字元(例如:LIKE "foo%"),則可以在 PERSON_ID 列上創建功能索引:

create index person_card_pid_idx on person_card(lower(person_id));

這將導致索引範圍掃描而不是表掃描(我希望!)。

2) PERSON_ID 列中的數據實際上是一個整數,與傳入的值完全匹配:1

這裡有2種可能性。如果 PERSON_ID 尚未在數據庫中建立索引,請添加索引。如果它已經被索引,請讓開發人員通過 LOWER() 呼叫更改要使用的應用程序,PERSON_ID=:1而不是 LIKE。

3) PERSON_ID 列中的數據是非數字字元串& :1 中匹配的值在字元串開頭包含萬用字元 ‘%’

您必須使用 Oracle 文本索引。

引用自:https://dba.stackexchange.com/questions/14489