成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle數據庫Guid作主鍵時執行速度超慢的原因在哪里

數據庫 Oracle
在Oracle數據庫匹配主鍵的查詢或更新時,執行一條語句需要3.5 秒!如果把NH Prof 中截獲的SQL 語句拿到PL/SQL Developer 里執行,就只需幾十毫秒。到底執行速度變慢的原因在哪里呢?本文就介紹這些,希望會對讀者有所幫助。

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

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

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

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

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

所以對于查詢比較簡單,只要把HQL的參數類型指定為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語句的參數類型呢?這里有個小小的秘技,把映射文件里的屬性類型指定為“AnsiString”即可。

  1. public class RegionMap : TreeNodeMap<Region> 
  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<IPropertyInspector> 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<Oracle10gDialect>()  
  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<ProxyFactoryFactory>()  
  14.  
  15. .AdoNetBatchSize(1000)  
  16.  
  17. .Driver<OracleClientDriver>())  
  18.  
  19. .Mappings(m => { m.HbmMappings.AddFromAssembly(Assembly.Load("Infrastructure.Repositories"));   
  20.  
  21. m.FluentMappings.AddFromAssembly(Assembly.Load("Infrastructure.Repositories"))  
  22.  
  23. .Conventions.Add<EnumConvention>()  
  24.  
  25. .Conventions.Add<HasManyConvention>()  
  26.  
  27. .Conventions.Add<HasManyToManyConvention>()  
  28.  
  29. .Conventions.Add<StringPropertyConvention>()  
  30.  
  31. .Conventions.Add<IdConvention>()  
  32.  
  33. .ExportTo(@"F:\temp\"); })  
  34.  
  35. .BuildSessionFactory(); 

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

  1. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true"> 
  2.  
  3. <class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true" dynamic-update="true" mutable="true" where="IsDelete=0" name="Dawn.HIS.Infrastructure.Core.Data.Region, Infrastructure.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="INFRA_REGION"> 
  4.  
  5. <id name="Id" type="AnsiString"> 
  6.  
  7.   <column name="REGION_ID" /> 
  8.  
  9.   <generator class="assigned" /> 
  10.  
  11. </id> 
  12.  
  13. <version name="Version" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
  14.  
  15.   <column name="Version" /> 
  16.  
  17. </version> 
  18.  
  19. <property name="CreateTime" type="System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
  20.  
  21.   <column name="CREATETIME" /> 
  22.  
  23. </property> 
  24.  
  25. <property name="Name" type="AnsiString"> 
  26.  
  27.   <column name="NAME" /> 
  28.  
  29. </property> 
  30.  
  31. ...  
  32.  
  33. </class> 
  34.  
  35. </hibernate-mapping> 

說明:

[1] 之所以使用varchar2 而不是 nvarchar2,除了考慮 varchar2 可以節省空間之外,主要是為了避免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數據庫的知識,可以看一下這里的文章:http://database.51cto.com/oracle/

【編輯推薦】

  1. Oracle跟蹤文件分析工具TKPROF使用簡介
  2. Oracle數據庫中Rank等函數的比較與選擇
  3. 利用Sql Server將Excel中的數據導入Oracle
  4. 共享database獨立Schema構建SAAS平臺
  5. 環境變量導致ASP.Net無法連接Oracle的一個案例
責任編輯:趙鵬 來源: 博客園
相關推薦

2019-08-29 07:13:50

oracle數據庫主鍵

2011-07-04 10:19:41

索引ONLINE

2023-05-10 08:29:12

2010-02-23 15:25:10

CentOS Apac

2010-08-06 14:02:54

優化IBM DB2優化

2013-11-08 00:45:40

國產數據庫

2018-08-02 16:17:34

Python 開發編程語言

2013-10-08 09:54:41

數據庫安全數據庫管理

2023-09-01 15:34:34

數據庫開發

2018-12-12 19:10:01

Oracle數據庫自動備份

2010-04-02 18:30:41

Oracle數據庫

2010-04-27 18:54:06

AIX語言

2010-04-27 10:39:59

Oracle數據庫

2011-03-16 13:57:21

SQL Server數據庫查詢

2011-04-02 16:39:53

SQL Server查詢

2011-08-15 21:42:57

Oracle數據庫不能使用索引

2011-08-04 09:32:23

2009-06-19 09:36:27

C#執行速度IronPython

2022-09-06 08:07:24

SQL語句查詢

2011-08-09 13:34:56

MySQL數據庫負荷較高
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久成人一区 | 农村妇女毛片精品久久久 | 久久精品中文字幕 | 免费视频一区二区 | 日韩一区二区三区视频在线播放 | 日韩精品亚洲专区在线观看 | 999精品视频| 国产高清视频在线观看 | 久久久久久久一区 | 欧美一级α片 | 日韩在线视频一区二区三区 | 九九久久久 | 久久精品视频网站 | av激情在线 | 一区二区三区视频在线免费观看 | 日韩欧美中文 | 九九热在线视频观看这里只有精品 | 久久久久久国产精品免费免费狐狸 | 欧美一区二区免费视频 | 日韩高清中文字幕 | 成人国内精品久久久久一区 | 日本 欧美 三级 高清 视频 | 成人福利影院 | 欧美一区中文字幕 | 国产精品久久久久久久久久三级 | 午夜精 | 日韩精品久久久久 | 国产色婷婷久久99精品91 | 午夜激情在线视频 | 四虎最新视频 | 乱码av午夜噜噜噜噜动漫 | 欧美一区二区三区的 | 久久蜜桃av一区二区天堂 | 91高清视频 | 大象一区 | 久久精品97 | 日韩精品在线观看一区二区三区 | 久久成人国产 | 欧美视频成人 | 在线只有精品 | 999热视频 |