字符索引优化 、查询 、ORM 慢 (字符编码 N‘’)

索引失效原因

下面3种SQL(特殊SQL会出现,例子很难重现,不过确实存在这种情况),因为参数编码不一样会有些查询引起索引失效

image.png

如何查看真实SQL

下面是数据库工具监控出来的真实SQL,我们要拿到这个真实SQL去分析 

image.png

我们在数据库监控工具可以看到执行时间


索引失效解决方案

常出问题的一般出在数据库类型和参数的类型不一致引起的

Oracle 中 DateTime 转 Date 引起失索引换效 (ORM默认DateTime)

SqlServer中 Nvarchar 转 Varchar 引起失索引换效  (ORM默认nvarchar)

不是100%一定会索引失效,但是特殊的SQL会出现上面情况

新版本用法 5.0.8.6-preview03 

//用于索引失效的字段 (在表达式中会生效)
[SugarColumn(SqlParameterDbType =System.Data.DbType.AnsiString)] 
public string  name { get; set; }

//设置长度 需要SqlParameterDbType有值SqlParameterSize才会生效
[SqlSugar.SugarColumn(SqlParameterDbType =System.Data.DbType.String,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)

常用类型说明:

AnsiStringvarchar
AnsiStringFixedLengthchar
Stringnvarchar
StringFixedLengthnchar

老版本用法

//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)


其它情况优化

1、真实SQL快ORM慢

真实SQL是数据库监控中执行的SQL和打印的SQL是有区别的,如果真实SQL快就明说ORM构造的SQL没问题,问题在其他上面

这种情况一般要检查网络或者有没有AOP等操作,绑定速度正常来说是非常快的,一般不会出现慢的情况 

对性能要求高的可以用实体而不用匿名对象

2、锁或者事务引起的慢

像SqlServer可以加上With NoLcok进行优化

文档:SqlSugar5.0