2016-01-24 50 views
0

我有一個查詢運行在關係數據庫,不符合用戶的期望。如何描述關係數據庫中的性能問題?

我應該提供哪些信息以及應該避免什麼,以便我可以在本網站上獲得有效的幫助?

+0

發佈此問題的動機是,我沒有找到關係數據庫的頁面類似於 [this](http://stackoverflow.com/questions/5963269/how-to-make-a-偉大的 - 可重現的例子)一個'[r]'。 我自己爲Oracle數據庫回答了這個問題,希望其他人擴展/更正信息併爲其他數據庫添加答案。 –

+0

這不是博客。將是一個很好的開始,以決定用戶的期望。 (吞吐量,例如響應) –

回答

5

對於Oracle數據庫提供以下信息:

描述問題

的症狀描述導致問題的行爲。查詢的行爲是否穩定或僅在有時會發生問題,具有特定參數或簡單隨機。您可以在IDE(例如SQL Developer)中重現此行爲嗎?

描述環境

定義甲骨文

select * from v$version 

的確切版本描述你如何連接到數據庫:驅動程序,ORM,編程語言。提供名稱和/或版本號。

描述查詢

郵政查詢文本。嘗試簡化 - 顯示最小可重複的示例

示例 - 有問題的查詢連接10個表。檢查是否在具有9或8個連接的查詢中看到相同的症狀。 退出,直到看到問題並只顯示簡化的查詢。

是的,這是昂貴的,但它極大地增加了您獲得支持的機會!查詢越小,吸引的支持者數越高。

描述執行計劃

要獲得執行計劃運行該語句(替換您的查詢文本)

EXPLAIN PLAN SET STATEMENT_ID = '<some_id>' into plan_table FOR 
    select * from .... -- your query here 
; 

執行計劃存儲在PLAN_TABLE,看到它運行此查詢

SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', '<some_id>','ALL')); 

顯示完整結果(不僅是帶執行計劃的表)。 極端重要的可能是謂詞部分和下面的註釋。

舉例select * from dual where dummy = :1;

Plan hash value: 272002086 

-------------------------------------------------------------------------- 
| Id | Operation   | Name | Rows | Bytes | Cost (%CPU)| Time  | 
-------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |  |  1 |  2 |  2 (0)| 00:00:01 | 
|* 1 | TABLE ACCESS FULL| DUAL |  1 |  2 |  2 (0)| 00:00:01 | 
-------------------------------------------------------------------------- 

Query Block Name/Object Alias (identified by operation id): 
------------------------------------------------------------- 

    1 - SEL$1/[email protected]$1 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter("DUMMY"=:1) 

Column Projection Information (identified by operation id): 
----------------------------------------------------------- 

    1 - "DUMMY"[VARCHAR2,1] 

不要剪切和粘貼你的IDE的圖形結果解釋計劃。

這個執行計劃是真正執行的嗎?

不幸的是並不總是如此。 解釋執行計劃可能有differ from the real one有幾個原因。

如果您有疑問(特別是當您看到一個好的計劃,但查詢運行不良時),您可能從 提取計劃從DB緩存提供SQL_ID

select sql_id, sql_fulltext from v$sql a where 
lower(sql_text) like lower('%<some identifying part of the query text>%') 
    and parsing_schema_name = '<user running the query>'; 

如果您有:

SELECT t.* FROM table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t; 

對於當前正在運行(或在短期內運行,仍緩存)查詢該SQL_ID可以 文本匹配和/或數據庫用戶可以找到AWR許可證,您甚至可以從那裏獲得執行計劃,即使是在歷史記錄中運行的查詢。

SELECT t.* 
FROM table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k' )) t; 

的SQL_ID可使用

select sql_id, sql_text 
from dba_hist_sqltext a 
where lower(sql_text) like lower('%<some identifying part of the query text>%') 

描述數據

顯示於這些表中的表和索引的DDL被發現。

提及最近收集的優化器統計信息並顯示使用的收集語句dbms_stats

對於臨界表(一個或多個)提供關於分段大小,行號,分區信息...

對於訪問中使用或列加入提供關於不同值的數目的信息。 這些值是均勻分佈還是傾斜的(例如,經常發生的少量值,以及罕見值的大數值 )。 你是否定義了直方圖?

還有什麼?

當然,這只是基礎知識,還可能需要其他信息,例如系統統計信息或優化器參數。 但是,再次嘗試提供(你)能夠識別問題的最少信息。 根據要求發佈其他信息。

祝你好運!