很長時間沒有更新blog了,忙是一方面,心態浮燥可能是主要原因。
這段時間一直在實現系統在Oracle上的實現問題,由於一開始的時候,在資料庫訪問方面使用抽象工廠的模式,因此程式改動不是很大,工作量主要集中在資料庫的移植方面(表、視圖、預存程序、觸發器等)。移植之後對系統進行測試,發現了一個很有意思的問題: 使用oracle之後,系統在某些方面比在Sql server上慢很多(使用 oracle client和oledb一樣),後來發現是因為這樣引起的:
for ()
{
DataSet Ds=Open("select * from ... where ...")
foreach(DataRow dr in Ds.Table[0].Rows)
{
...
}
}
改成這樣就快了很多(速度和sqlserver差不多) :
DataSet Ds=Open("select * from ...")
for ()
{
foreach(DataRow dr in Ds.Table[0].Select(...))
{
...
}
}
但是這一改進在Sqlserver上不是很明顯。
後來使用 Oracle的ODP.net 發現速度提高很多,效能遠高於oracle client和oledb,但是在使用的過程中發現了一個問題:在用DataSet的方式更新Blob欄位時,速度比較慢,後來考慮使用預存程序,如下:
CREATE OR REPLACE procedure updateclob(
v_tablename in varchar2, --要更新的表名
v_cmid in raw, --表的主鍵ID
v_geometry in blob --新的繪圖物件
)
is
lobloc blob;
query_str varchar2(1000);
begin
--取出blob對象
query_str :='select geometry from '||v_tablename||' where cmid= :id for update ';
EXECUTE IMMEDIATE query_str INTO lobloc USING v_cmid;
--更新
dbms_lob.write(lobloc, utl_raw.length(v_geometry),1, v_geometry);
commit;
end;
/
另外Sql server的更新過程如下:
create procedure updateclob(
@tablename varchar(60), --要更新的表名
@cmid uniqueidentifier, --主鍵ID
@geometry image --新的繪圖物件
)
as
DECLARE @ptrval varbinary(16)
declare @SQLString nvarchar(1000)
begin
SET @SQLString = N' SELECT @ptrval = TEXTPTR(geometry) from ' + @tablename +' where cmid=''' + cast(@cmid as varchar(60)) + ''''
EXECUTE sp_executesql @SQLString,N'@ptrval varbinary(16) output',@ptrval output
set @SQLString=N'WRITETEXT ' +@tablename +'.geometry @ptrval @geometry'
EXECUTE sp_executesql @SQLString ,N'@ptrval varbinary(16),@geometry image',@ptrval,@geometry
end
go