JMP 用戶您好。 使用 JMP 查詢產生器時,使用「ODBC Driver 11 for SQL Server」的 SQL 伺服器回應速度很快,但使用「Oracle in OraClient11g」的某些 Oracle 伺服器回應速度較慢,大約需要 2 到 3 分鐘。我們偶然發現,使用腳本中 New SQL Query() 函數中的 Custom SQL() 參數效果很好,而不是使用 JMP 查詢產生器產生的腳本。
有其他人看到 Oracle ODBC 回應緩慢嗎?
據我了解,部分問題是我們的 Oracle 資料庫登入帳戶不允許查看伺服器上某些模式中的某些表,因此查詢建構器在首次載入時需要一些時間才能繞過它們。 如果您的資料庫存取包含所有架構和表,您可能無法複製。 直接提交自訂 SQL 會繞過架構和表的掃描嗎?
在下面的範例中,使用查詢產生器、選定的列和篩選器。 運行一百萬行需要 147 秒。 現在,從查詢產生器中,從SQL 標籤中選擇SQL,或使用「轉換為自訂SQL」選單項目並複製自訂SQL(或從「自訂SQL」視窗執行查詢),然後將其貼上為「自訂」的參數SQL(),一百萬行只需要7到8秒。
// this is the JSL script generated by JMP Query Builder and saved to the datatable
// takes ~ 147 seconds to run
t1 = Tick Seconds();
New SQL Query(
Version( 130 ),
Connection(mycon),
QueryName( "Test1_147s" ),
Select(
Column( "X1", "t1" ),
Column( "X2", "t1" ),
Column( "X3", "t1" ),
Column( "X4", "t1" ),
Column(
"LAST_UPDATE_DATE",
"t1",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
)
),
From( Table( "MY_DATABASE_TABLE", Schema( "SCHEMA" ), Alias( "t1" ) ) ),
Where(EQ(Column( "X2", "t1" ),"AAAA",UI( Comparison( Base( "Categorical" ) ) )))
) << Run foreground;
t2 = Tick Seconds();
t2-t1; // 147 seconds
// Now just copy the SQL code and put into the CustomSQL argument
// takes ~ 8 seconds to run
t1 = Tick Seconds();
New SQL Query(
Connection(mycon),
QueryName( "Test2_8s" ),
CustomSQL(
"SELECT t1.X1, t1.X2, t1.X3, t1.X4,
t1.LAST_UPDATE_DATE
FROM SCHEMA.MY_DATABASE_TABLE t1
WHERE ( ( ( t1.X2 = 'AAAA' ) ) )"
)
) << Run foreground;
t2 = Tick Seconds();
t2-t1; // 8 seconds
對於我們的 JMP 查詢產生器最佳實踐,現在必須展示如何從 Oracle 資料庫的自訂 SQL 視窗中執行和儲存查詢和資料表。
感謝您提供的性能數據。 看來你有解決方法。
JMP 是否有一些見解或建議可以分享,這將是一件有趣的事情。
感謝您的建議! 做了更多測試。
我確實看到了第二次呼叫 Oracle 資料庫的效果,但仍然看到兩種 JSL 技術之間的數量級差異。 我只需註銷 JMP14 即可對此進行測試。 如果我在慢速模式上執行測試,第一次 Custom SQL() 需要 0.4 秒。 如果我在 JMP 的當前會話中重複執行自訂 SQL() 腳本,時間會減少到 0.06 秒。但這對於標準查詢產生器程式碼沒有幫助,無論如何都需要 120 秒。 我相信第一次和第二次對 Oracle 資料庫的呼叫之間 0.4 到 0.06 的變化(如果發生在緩慢的模式中)是在重複測試的噪音中,總是在約 120 秒左右。
我還測試了“快速”模式。 自訂 SQL 首次運行也約為 0.4 秒,然後在活動會話中的後續呼叫減少到 0.06 秒。 對於標準查詢產生器程式碼,第一次呼叫為 1.2 秒,活動 JMP 會話中的後續呼叫減少到 0.8 秒。
從這些測試中,可以看到對Oracle 資料庫的重複呼叫減少了約0.3 秒,因為無論Custom SQL() 的架構如何,它都會呼叫最後一個查詢,但在使用查詢產生器腳本的「慢速」架構中看不到它風格。
Here we don't like the Open Database/Close Database method (worried about hanging a database open), we prefer using the Query Builder, but we will have to use the Custom SQL() method and capture the SQL code from the Query Builder使用者介面.