我需要优化由域实体上的保存(插入查询)产生的查询。我已经使用Fluent NHibernate配置了NHibernate。
这是NHibernate在插入用户对民意调查的响应期间生成的查询:
exec sp_executesql N'INSERT INTO dbo.Response (ModifiedDate, IpAddress, CountryCode, IsRemoteAddr, PollId) VALUES (@p0, @p1, @p2, @p3, @p4); select SCOPE_IDENTITY()',N'@p0 datetime,@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 bit,@p4 int', @p0='2001-07-08 03:59:05',@p1=N'127.0.0.1',@p2=N'US',@p3=1,@p4=2
如果观察的输入参数 IpAddress 和 CountryCode ,将会注意到,NHibernate的使用 nvarchar(4000) 。问题是,nvarchar(4000)远远大于我需要或者IpAddress或CountryCode并且由于高流量和托管的要求,我需要优化内存使用情况的数据库。
IpAddress
CountryCode
nvarchar(4000)
这是这些列的Fluent NHibernate自动映射替代:
mapping.Map(x => x.IpAddress).CustomSqlType("varchar(15)"); mapping.Map(x => x.CountryCode).CustomSqlType("varchar(6)");
这不是我看到不必要的nvarchar(4000)弹出的唯一地方。
如何控制 NHibernate nvarchar(4000) 对字符串表示的使用?
如何更改此insert语句以使用适当大小的输入参数?
insert
指定Type为NHibernateUtil.AnsiString用Length而不是使用CustomSqlType。
Type
NHibernateUtil.AnsiString
Length