下面3种SQL(特殊SQL会出现,例子很难重现,不过确实存在这种情况),因为参数编码不一样会有些查询引起索引失效
下面是数据库工具监控出来的真实SQL,我们要拿到这个真实SQL去分析
【SqlServer用SqlProfile工具查旬SQL真实时间】
我们在数据库监控工具可以看到执行时间
AOP里面用这个输出 UtilMethods.GetNativeSql(sql,pars)
常出问题的一般出在数据库类型和参数的类型不一致引起的
Oracle 中 DateTime 转 Date 引起失索引换效 (ORM默认DateTime)
SqlServer中 Nvarchar 转 Varchar 引起失索引换效 (ORM默认nvarchar)
不是100%一定会索引失效,但是特殊的SQL会出现上面情况
//用于索引失效的字段 (在表达式中会生效) [SugarColumn(SqlParameterDbType =System.Data.DbType.AnsiString)] public string name { get; set; } //设置长度 需要SqlParameterDbType有值SqlParameterSize才会生效 [SqlSugar.SugarColumn(SqlParameterDbType =System.Data.DbType.AnsiString,SqlParameterSize = 50)] //Oracle 将DateTime转成Date [SugarColumn(SqlParameterDbType =System.Data.DbType.Date)] public DateTime name { get; set; } //写SQL可以这样强制类型 var name=new SugarParameter("@name","haha",System.Data.DbType.AnsiString)
常用类型说明:
AnsiString | varchar |
AnsiStringFixedLength | char |
String | nvarchar |
StringFixedLength | nchar |
Date | 短时间 |
DateTime | 长时间 |
//1. 全局操作 (适合所有表都没有nvarchar) DbType = SqlSugar.DbType.Oracle, ConnectionString = Config.ConnectionString, InitKeyType = InitKeyType.Attribute, MoreSettings=new ConnMoreSettings() { DisableNvarchar=true//添加这一行 ,将参数全部转成varchar模式 } //2. 指定当前方法 (在当前方法加上这行,当前方法都有效) db.CurrentConnectionConfig.MoreSettings=new ConnMoreSettings(){DisableNvarchar=true}; //3. 指定具体代码 (具体的条件会生效) Where(it=>it.Name==SqlFunc.ToVarchar("张"))//函数只能用到参数上面,字段要走索引禁止用函数 //4. 原生SQL用法 var name=new SugarParameter("@name","haha",System.Data.DbType.AnsiString)
真实SQL是数据库监控中执行的SQL和打印的SQL是有区别的,如果真实SQL快就明说ORM构造的SQL没问题,问题在其他上面
这种情况一般要检查网络或者有没有AOP等操作,绑定速度正常来说是非常快的,一般不会出现慢的情况
对性能要求高的可以用实体而不用匿名对象
像SqlServer可以加上With NoLock进行优化
2016 © donet5.comApache Licence 2.0