2010-06-01 35 views
3

我需要一些關於TimesTen DB查詢優化的幫助。我用Java分析器做了一些測量,發現大部分時間需要的代碼部分(這段代碼執行SQL查詢)。奇怪的是,這個查詢只對一些特定的輸入數據變得昂貴。SQL查詢性能優化(TimesTen)

下面是這個例子。我們有兩個查詢表,一個表示我們想要獲取的對象(T_PROFILEGROUP),另一個表示來自其他表的多對多鏈接(T_PROFILECONTEXT_PROFILEGROUPS)。我們不查詢鏈接表。

這些都是我用DB Profiler運行執行的查詢(它們是相同的除了ID):

Command> select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1464837998949302272; 
<1169655247309537280> 
<1169655249792565248> 
<1464837997699399681> 
3 rows found. 

Command> select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1466585677823868928; 
<1169655247309537280> 
1 row found. 

這是我在探查:

12:14:31.147  1 SQL  2L 6C 10825P Preparing: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1464837998949302272 
12:14:31.147  2 SQL  4L 6C 10825P sbSqlCmdCompile()(E): (Found already compiled version: refCount:01, bucket:47) cmdType:100, cmdNum:1146695. 
12:14:31.147  3 SQL  4L 6C 10825P Opening: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1464837998949302272; 
12:14:31.147  4 SQL  4L 6C 10825P Fetching: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1464837998949302272; 
12:14:31.148  5 SQL  4L 6C 10825P Fetching: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1464837998949302272; 
12:14:31.148  6 SQL  4L 6C 10825P Fetching: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1464837998949302272; 
12:14:31.228  7 SQL  4L 6C 10825P Fetching: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1464837998949302272; 
12:14:31.228  8 SQL  4L 6C 10825P Closing: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1464837998949302272; 
12:14:35.243  9 SQL  2L 6C 10825P Preparing: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1466585677823868928 
12:14:35.243  10 SQL  4L 6C 10825P sbSqlCmdCompile()(E): (Found already compiled version: refCount:01, bucket:44) cmdType:100, cmdNum:1146697. 
12:14:35.243  11 SQL  4L 6C 10825P Opening: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1466585677823868928; 
12:14:35.243  12 SQL  4L 6C 10825P Fetching: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1466585677823868928; 
12:14:35.243  13 SQL  4L 6C 10825P Fetching: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1466585677823868928; 
12:14:35.243  14 SQL  4L 6C 10825P Closing: select G.M_ID from T_PROFILECONTEXT_PROFILEGROUPS CG, T_PROFILEGROUP G where CG.M_ID_EID = G.M_ID and CG.M_ID_OID = 1466585677823868928; 

這是清楚地表明第一個查詢花費了近100ms,而第二個查詢則立即執行。這不是關於查詢預編譯(第一個也是預編譯的,因爲之前發生過相同的查詢)。我們在此使用的所有列都有DB索引:T_PROFILEGROUP.M_ID,T_PROFILECONTEXT_PROFILEGROUPS.M_ID_OIDT_PROFILECONTEXT_PROFILEGROUPS.M_ID_EID

我的問題是:

  • 爲什麼查詢同一套表產生不同的參數,不同的表現?
  • 這裏涉及哪些指標?
  • 有什麼辦法可以改善這個簡單的查詢和/或數據庫,使其更快?

UPDATE:給大小的感覺:

Command> select count(*) from T_PROFILEGROUP; 
<183840> 
1 row found. 

Command> select count(*) from T_PROFILECONTEXT_PROFILEGROUPS; 
<2279104> 
1 row found. 

回答

0

我不是太熟悉的TimesTen數據庫,但因爲它是第二這兒不到1/10,這樣可以只是兩個查詢中的舍入差異或某種呃逆?

這是一個link,它覆蓋了一些性能調整TimesTen數據庫的方法。它具有一些一般信息(使用準備等)以及有關調整特定查詢的信息。我希望它有幫助。

+0

當然不是。我對執行此查詢的Java代碼進行了數千次的簡檔分析,而且顯然會導致性能瓶頸,只會導致通過此連接返回多行的ID。 – 2010-06-01 14:55:34

0

我最初的疑問是,第一個查詢從磁盤或虛擬內存中將數據提取到實際的內存中,第二個查詢可以利用它。

你可以用三個(或十個?)查詢運行這個查詢並回報嗎?

1

我不熟悉的TimesTen但假設它像其它關係DB的(除了在存儲器是),一個可能的原因是要麼不存在對T_PROFILECONTEXT_PROFILEGROUP.M_ID_OID一個索引或T_PROFILEGROUP.M_ID列或二進制的樹索引不平衡。

如果沒有索引,結果將取決於數據的順序以及它能夠多快地找到它們。

在擁有大量數據的表中,我經歷過不平衡的二叉樹索引,造成問題,因爲樹的一端遠大於其他端。在這種情況下,重建索引可以重新平衡樹。

我不能誠實地說,如果這適用於TimesTen從未使用它,我的網絡搜索不產生太多的信息。