2015-12-31 33 views
1

我在查詢中使用標量用戶定義函數(UDF)時遇到性能問題。
有一個UDF fn_get(I INT),它返回一個標..它擁有邏輯的很多,並且執行正常標量運算..關於使用標量UDF,SQL,sybase的性能問題iq


實際上
SELECT *,fn_get(i) FROM #temp1;
被取3秒內萬個結果和在Studio用戶界面中顯示。


然而,
SELECT *,fn_get(i) INTO #temp2 FROM #temp1;
被插入10000個成果轉化爲表#TEMP2相同,通過採取>4分鐘

時間

不知道爲什麼差別如此巨大(3秒對4分:O)
我不知道,如果這是在這裏提出一個問題的方式..來提高查詢性能的任何指導,是有很大幫助..

+0

@MichaelGardner嘿,它是Sybase IQ – rudebutgood

+0

我還沒有那個聲望呢 – rudebutgood

回答

0

Sybase IQ是一個OLAP調優柱狀數據庫。這意味着,開箱即用於讀取而不是寫入。因此,即使在相同的數據集上,讀取性能也會大大超出寫入性能,這是正常的。

現在很多東西會影響寫入性能,存儲類型,IO帶寬,緩存索引有幾個因素。

爲了讓您的查詢的細節更詳細的信息,你應該看一看的執行計劃。這將有助於打破系統花費時間的地方。

SAP has a detailed document on Sybase IQ execution/query plans。它可能不是針對你正在運行的特定版本的智商,但這些信息通常是適用的。

注意:在列式數據庫中使用select *(永遠)是非常不鼓勵的。數據按列拆分和組織,因此重新組裝整行是非常昂貴的過程。除非您絕對需要該行中的每一列,否則應始終指定哪些列。即使您正在檢索所有列,也總是在您的查詢中指定列,這也是通用SQL最佳實踐。

1

邁克爾是正確的,如果表是很寬我希望在將整個表格寬度l一個巨大的性能損失,因此你的第一個步驟應該是唯一的選擇/插入int值,看看性能的樣子。

在那之後,我想請你嘗試另一件事是(10也許只是乘)你的UDF切換到一個很簡單,看看是否一樣執行緩慢。

我請你來測試,因爲我與UDF的Sybase IQ中經歷了一個有趣的事情是,如果你使用的是不被IQ支持,但由ASA商店支持的操作,是你將穿越發動機邊界。如果您在系統中創建了UDF,這意味着它位於ASA商店中,也可能會發生這種情況。如果你的#TEMP2表是在IQ存儲,數據移動將從IQ讀取,轉移到ASA進行數據OPS後來終於搬回智商(慢)寫信給你臨時表。根據我的經驗,數據從IQ引擎非常迅速地移動到ASA引擎,但是朝另一個方向走得更慢。

這就是爲什麼我相信select是快速的(它在數據操作之後直接從ASA存儲中獲得),插入速度幾乎降低了100倍。