发现了一个字符串索引丢的问题,请大家做实验 返回

SqlSugar 沟通中
11 396

我们的oracle 19数据库的系统的主键和日期都是 char 类型。发现有些查询慢,索引丢 是参数值前面会带上N的原因,所以按文档中的方法:

1、MoreSettings中设置DisableNvarchar = true

2、 实体属性 加DbType=System.Data.DbType.AnsiStringFixedLength的扩展

3、如果是用sql语句做的查询,加上

  par.CustomDbType = OracleDbType.Char;

  par.DbType = System.Data.DbType.AnsiStringFixedLength;

结果发现都不行,本来以为是用的UtilMethods.GetSqlString做的sql日志,转的可能不是太准确,今天特意在where条件中写:

TO_DATE(B.DATES,'yyyy-mm-dd') >= date :STARTDATE 这样试一下,结果报数据库错“标识无效”,查日志发现N还在。

特意请问下大家,谁做过这方面的实验,或者如何确保N能100%,去掉呢?


热忱回答11

  • fate sta fate sta VIP0
    1个月前
     Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));

     要用这个打印其他都是不准的。


    0 回复
  • fate sta fate sta VIP0
    1个月前

    另外提供完整的表结结构

    实体类

    和代码


    正确使用sqlsugar是可以一比一还原ADO.NET的结构

    0 回复
  • fate sta fate sta VIP0
    1个月前

    另外字段不能加函数。。只能变量加函数,字段加函数会不走索引

    0 回复
  • 历历 历历 VIP0
    1个月前

    老师,主要是想把参数前的N去掉,sql语句中用函数,主要是想测试下,参数前是否带了N:

    TO_DATE(B.DATES,'yyyy-mm-dd') >= date ‘2025-10-10’   这样sql语句是没问题可以通过的;

    TO_DATE(B.DATES,'yyyy-mm-dd') >= date N'2025-10-10' 这样sql语句是直接报错的。 主要是想测试参数是否带N。

    我们是一套自定义表单系统,实体用的不多,大多是直接跑sql语句,所以用的是

    par.CustomDbType = OracleDbType.Char;

      par.DbType = System.Data.DbType.AnsiStringFixedLength;

    实体用的挺少的,比较大的查询都是用的sugarparameter类做的参数。

    @fate sta

    0 回复
  • 历历 历历 VIP0
    1个月前

    @fate sta4248bad2d2ef18ced2ffa178f967f6f8.png我现在是用这种方法,查询提升了,查oracle执行计划,索引是起作用的,目前算是解决了,客户不找我了 哈哈。用deepseek搜的。

    0 回复
  • 历历 历历 VIP0
    1个月前

    现在我们项目是想把N去掉,我们的主键是char19的雪花ID,日期是char10或char19,唉~~~~,之前就发现执行计划只起一次作用 或 不起作用的问题,查询不算慢 都不想管,现在奇怪的是 有些查询在A客户没问题,在B客户就查不出来,直接查到超时。

    0 回复
  • 历历 历历 VIP0
    1个月前

    @fate sta:记得之前您说过,UtilMethods.GetNativeSql(sql, pars) 比 UtilMethods.GetSqlString 效率要低,所以我一直用的是后者。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    UtilMethods.GetNativeSql(sql, pars) 性能好。 getstring性能低

    0 回复
  • 历历 历历 VIP0
    1个月前

    @fate sta:感谢老师,UtilMethods.GetNativeSql 我试了下。可以的。 但是它不像GetSqlString 可以选数据库类型,UtilMethods.GetSqlString(DbType.Oracle, sql, pars);  没有问题吧?

    0 回复
  • 历历 历历 VIP0
    1个月前

    @fate sta:还有一个是,GetSqlString 是直接把参数代入sql语句,系统出问题,实施容易用日志排查。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    GetSqlString 输出的SQL不准。 GetNativeSql 来判断最终是什么类型请求,数据库最终是参数化访问数据库

    0 回复