日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Oracle數(shù)據(jù)庫Guid作主鍵時執(zhí)行速度超慢的原因在哪里

Oracle數(shù)據(jù)庫GUID作為主鍵執(zhí)行速度過慢的原因到底在哪里呢?接下來我們開始介紹。首先介紹一下環(huán)境。數(shù)據(jù)庫使用Oracle10g,所有字符類型的字段都是varchar2[1]。所有的主鍵都使用Guid,在數(shù)據(jù)庫里是varchar2(36) 類型,相應的,實體的Id 屬性的類型是string。ORM 使用的是NHibernate 2.1.0 和 FluentNHibernate1.1。

經過一番排查之后發(fā)現(xiàn),問題的根源是NH將SQL語句傳遞給Oracle 時,所有字符型的參數(shù)都是nvarchar2 類型,而數(shù)據(jù)庫里對應的字段卻是varchar2 類型,這將導致Oracle 無法使用索引,終于造成全表掃描,所以數(shù)據(jù)量稍大就慢得不行。

***種解決方法是,把數(shù)據(jù)庫中所有的字符型字段的類型由varchar2 更改為nvarchar2,出于種種原因我們不希望這么做。

第二種解決方法是,讓NH 把varchar2 作為參數(shù)類型傳遞給Oracle。

事實上,NH 默認把.net 的string 映射為DbType.String[2],把DbType.String映射為nvarchar2[3]。把DbType.AnsiString 映射為varchar2[4]。

所以對于查詢比較簡單,只要把HQL的參數(shù)類型指定為AnsiString 就行了。

 
 
 
  1. var query = Session.CreateQuery(@"select t from Region as t  
  2.  
  3. where t.Id = :Id")  
  4.  
  5. .SetAnsiString("Id", id);  
  6.  
  7. var query = Session.CreateQuery(@"select t from Region as t  
  8.  
  9. where t.Id in (:Ids)")  
  10.  
  11. .SetParameterList("Ids", ids.ToList(), NHibernateUtil.AnsiString); 

但是如何設置Update 和Delete語句的參數(shù)類型呢?這里有個小小的秘技,把映射文件里的屬性類型指定為“AnsiString”即可。

 
 
 
  1. public class RegionMap : TreeNodeMap 
  2.  
  3. {  
  4.  
  5. public RegionMap()  
  6.  
  7. {  
  8.  
  9. Table("INFRA_REGION");  
  10.  
  11. Id(t => t.Id, "REGION_ID").CustomType("AnsiString");  
  12.  
  13. ...  
  14.  
  15. }  
  16.  

注意:一定要使用CustomType()而不是CustomSqlType()。

當然了,要是把每一個配置文件都改一遍實在很煩,好像項目使用了Fluent NHibernate,只要添加一個 IdConvention 就行了。

 
 
 
  1. public class IdConvention : FluentNHibernate.Conventions.IIdConvention  
  2.  
  3. {  
  4.  
  5. public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)  
  6.  
  7. {  
  8.  
  9. instance.CustomType("AnsiString");  
  10.  
  11. }  
  12.  

想要徹底一點的話,可以再加一個string類型的property的convention。

 
 
 
  1. public class StringPropertyConvention : IPropertyConvention, IPropertyConventionAcceptance  
  2.  
  3. {  
  4.  
  5. public void Accept(IAcceptanceCriteria criteria)  
  6.  
  7. criteria.Expect(x => x.Property.PropertyType == typeof(string));  
  8.  
  9. public void Apply(IPropertyInstance instance)  
  10.  
  11. {  
  12.  
  13. instance.CustomType("AnsiString");  
  14.  
  15. }  
  16.  

把這兩個Convention 加到配置里面:

 
 
 
  1. Session["SessionFactory"] = Fluently.Configure()  
  2.  
  3. .Database(OracleClientConfiguration.Oracle10  
  4.  
  5. .Dialect()  
  6.  
  7. .ConnectionString("User ID=iBlast;Password=不可說;Data Source=Moki")  
  8.  
  9. .QuerySubstitutions("true 1, false 0, yes 'Y', no 'N'")  
  10.  
  11. .UseOuterJoin()  
  12.  
  13. .ProxyFactoryFactory()  
  14.  
  15. .AdoNetBatchSize(1000)  
  16.  
  17. .Driver())  
  18.  
  19. .Mappings(m => { m.HbmMappings.AddFromAssembly(Assembly.Load("Infrastructure.Repositories"));   
  20.  
  21. m.FluentMappings.AddFromAssembly(Assembly.Load("Infrastructure.Repositories"))  
  22.  
  23. .Conventions.Add()  
  24.  
  25. .Conventions.Add()  
  26.  
  27. .Conventions.Add()  
  28.  
  29. .Conventions.Add()  
  30.  
  31. .Conventions.Add()  
  32.  
  33. .ExportTo(@"F:\temp\"); })  
  34.  
  35. .BuildSessionFactory(); 

注意倒數(shù)第二行的.ExportTo(@"F:\temp\") 是為了測試一下生成的映射文件對不對而把映射文件輸出到了 “F:\temp\”,映射文件應該像這個樣子:

 
 
 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.    
  8.  
  9.    
  10.  
  11.  
  12.  
  13.  
  14.  
  15.    
  16.  
  17.  
  18.  
  19.  
  20.  
  21.    
  22.  
  23.  
  24.  
  25.  
  26.  
  27.    
  28.  
  29.  
  30.  
  31. ...  
  32.  
  33.  
  34.  
  35.  

說明:

[1] 之所以使用varchar2 而不是 nvarchar2,除了考慮 varchar2 可以節(jié)省空間之外,主要是為了避免nvarchar2 排序時的性能問題。

[2] 見 NHibernate-2.1.0.GA-src\src\NHibernate\Type\TypeFactory.cs 第 197 行。

[3] 見 NHibernate-2.1.0.GA-src\src\NHibernate\Dialect\Oracle8iDialect.cs 第 92 行。

[4] 見 NHibernate-2.1.0.GA-src\src\NHibernate\Dialect\Oracle8iDialect.cs 第 88 行。

本文就介紹到這里,如果想了解更多Oracle數(shù)據(jù)庫的知識,可以看一下這里的文章:http://database./oracle/。

【編輯推薦】

  1. Oracle跟蹤文件分析工具TKPROF使用簡介
  2. Oracle數(shù)據(jù)庫中Rank等函數(shù)的比較與選擇
  3. 利用Sql Server將Excel中的數(shù)據(jù)導入Oracle
  4. 共享database獨立Schema構建SAAS平臺
  5. 環(huán)境變量導致ASP.Net無法連接Oracle的一個案例

本文標題:Oracle數(shù)據(jù)庫Guid作主鍵時執(zhí)行速度超慢的原因在哪里
轉載來源:http://www.5511xx.com/article/dhhsedi.html