oracle 索引生效需求 返回

SqlSugar 沟通中
20 252
该叫什么 奋青 发布于2周前
悬赏:0 飞吻

目前 日单表的数据有 2千万-5千万左右

oracle 由于长期的收集的统计信息可能会有不更新的情况,这种情况下oracle 无法自动的使用最佳索引,会延用以前的 收集的旧统计信息进行索引优化,可能会导致全表扫描

sqlsugar 是否会考虑下 可以设置强制走索引的设置

由于使用 每日分表 每次 生成的sql 会带有 分表时候的时间,能否不自动强制加这个时间 或者是 一个可控的设置

表中虽然有是 根据 日 来分表,但是产生的 状态 可能是 第二天 第三天才返回来的,这样我就没法使用 分表进行查询, 自定义时间进行查询

可否能让用户自定义 选择 是否使用分表时间进行查询


热忱回答20

  •  var userInfo=db.Queryable<UserInfo001>().Hints("/*+ INDEX(table_name index_name) */ ").InSingle(id);
     
     SELECT /*+ INDEX(table_name index_name) */ column1, column2FROM your_table_name;


    你看看oracle这处SQL可以支持不

    0 回复
  • 还用AOP 输出一下看看不是Date类型,如果库里面是DateTime那么你的DbType也要Date

    AOP里面用这个输出 UtilMethods.GetNativeSql(sql,pars)

    实体

    //Oracle 将DateTime转成Date
    [SugarColumn(SqlParameterDbType =System.Data.DbType.Date)] 
    public DateTime name { getset; }


    sqlsuarcore升级 115版本修复了分表 DbType设置未生效

    0 回复
  • @fate sta:好的,我测试下试试

    0 回复
  • @fate sta
    我这边测试了下单表的强制索引可以支持,分表情况下的强制索引不支持,这边的索引是根据 时间生成的,每天的索引名根据表名的变化而变化

    下面是例子:

    TM_20231113 表名   索引名 TM_20231113_TBINDEX

    TM_20231112 表名   索引名 TM_20231112_TBINDEX


    目前生成的sql

    SELECT * FROM (
    SELECT  "REP" AS "REP" , "KEYWORD" AS "KEYWORD" , "LABEL" AS "LABEL" ,
     "CLIENTPRICE" ,ROW_NUMBER() OVER(ORDER BY "DONE_TIME" DESC) AS RowIndex
     FROM  (
     SELECT  /*+ INDEX(LG_TM_20231113 LG_TM_20231113_MBINDEX) */  "MOBILE","SIGN",
     "REP" AS "REP" , "KEYWORD" AS "KEYWORD" , "LABEL" AS "LABEL" , "CLIENT_PRICE" AS "CLIENTPRICE"
     FROM "LG_TM_20231113"  WHERE (( "DONE_TIME" >=
    :DoneTime0UnionAll1 ) AND ( "DONE_TIME" <= :DoneTime1UnionAll1 ))  AND
    "DONE_TIME">=:DoneTimeUnionAll1 AND "DONE_TIME"<= :DoneTimeUnionAll1  UNION ALL
    SELECT  /*+ INDEX(LG_TM_20231113 LG_TM_20231113_MBINDEX) */   "REP" AS "REP" , "KEYWORD" AS "KEYWORD" , "LABEL" AS "LABEL" , "CLIENT_PRICE" AS "CLIENTPRICE"
    FROM "LG_TM_20231112"
    WHERE (( "DONE_TIME" >= :DpSubmitTime0UnionAll2 ) AND ( "DONE_TIME" <= :DoneTime1UnionAll2 )) AND MOBILE=:MOBILE
    AND  "DONE_TIME">=:doneTimeUnionAll2 AND "DONE_TIME"<= :doneTimeUnionAll2
    ) lgTm
    ) T WHERE RowIndex BETWEEN 1 AND
    20

    图片.png

    图片.png

    ----单表的情况下这种这种强制索引是支持的


    有可能支持以下这种吗

    SELECT * FROM (
    SELECT  "REP" AS "REP" , "KEYWORD" AS "KEYWORD" , "LABEL" AS "LABEL" ,
     "CLIENTPRICE" ,ROW_NUMBER() OVER(ORDER BY "DONE_TIME" DESC) AS RowIndex
     FROM  (
     SELECT  /*+ INDEX(LG_TM_20231113 LG_TM_20231113_MBINDEX) */  "MOBILE","SIGN",
     "REP" AS "REP" , "KEYWORD" AS "KEYWORD" , "LABEL" AS "LABEL" , "CLIENT_PRICE" AS "CLIENTPRICE"
     FROM "LG_TM_20231113"  WHERE (( "DONE_TIME" >=
    :DoneTime0UnionAll1 ) AND ( "DONE_TIME" <= :DoneTime1UnionAll1 ))  AND
    "DONE_TIME">=:DoneTimeUnionAll1 AND "DONE_TIME"<= :DoneTimeUnionAll1  UNION ALL
    SELECT  /*+ INDEX(LG_TM_20231112 LG_TM_20231112_MBINDEX) */   "REP" AS "REP" , "KEYWORD" AS "KEYWORD" , "LABEL" AS "LABEL" , "CLIENT_PRICE" AS "CLIENTPRICE"
    FROM "LG_TM_20231112"
    WHERE (( "DONE_TIME" >= :DpSubmitTime0UnionAll2 ) AND ( "DONE_TIME" <= :DoneTime1UnionAll2 )) AND "MOBILE"=:MOBILE

    AND  "DONE_TIME">=:doneTimeUnionAll2 AND "DONE_TIME"<= :doneTimeUnionAll2
    ) lgTm
    ) T WHERE RowIndex BETWEEN 1 AND
    20

    索引名 随着表名的变动而变动

    0 回复
  • @fate sta
    2.  oracle 时间的格式是 date 类型的没有问题,

    但我的问题是 , 强制携带分表时间 能否设计成 让用户自己可选择的,

    这边的场景使用是:今天 (2023年11月13日) 向接口方提交了数据,但是接口方 可能 明天(2023年11月14日) 或者 后天(2023年11月15日)才会返回我最终结果,用户使用筛选条件的时候

    需要去筛选  11月13日 今天提交的 数据,明天(11月14日)的返回的结果集 或者是 11月15日的返回的 结果集,

    因为 sqlsugar 会强制性的加 入分表 查询的时间,这样就导致了 我没法 查询 今天的数据,明天 或者 后天 产生出的结果集


    SELECT * FROM (SELECT "LABEL" AS "LABEL" , "CLIENT_PRICE" AS "CLIENTPRICE" ,ROW_NUMBER() OVER(ORDER BY "DONE_TIME" DESC) AS RowIndex  
    FROM  (
    SELECT  
    /*+ INDEX(LG_20231113 LG_SM_20231113_MBINDEX) */  "REP" , "KEYWORD" , "LABEL"  , "CLIENT_PRICE"
    FROM "LG_TM_20231113"  
    WHERE (( "Done_TIME" >= :DoneTime0UnionAll1 ) AND ( "Done_TIME" <= :DonetTime1UnionAll1 ))  AND
      "Done_TIME">=:spBeginTimeUnionAll1 AND "AP_SUBMIT_TIME"<= :spEndTimeUnionAll1
      ) lgSm ) T WHERE RowIndex BETWEEN 1 AND 20


    SELECT * FROM (SELECT "LABEL" AS "LABEL" , "CLIENT_PRICE" AS "CLIENTPRICE" ,ROW_NUMBER() OVER(ORDER BY "DONE_TIME" DESC) AS RowIndex  
    FROM  (
    SELECT  
    /*+ INDEX(LG_20231113 LG_TM_20231113_MBINDEX) */  "REP" , "KEYWORD" , "LABEL"  , "CLIENT_PRICE"
    FROM "LG_TM_20231113"  
    WHERE (( "DONE_TIME" >= to_date('2023-11-14 00:00:00','yyyy-MM-dd hh24:mi:ss')) AND ( "DONE_TIME" <= to_date('2023-11-14 00:00:00','yyyy-MM-dd hh24:mi:ss') ))  AND
      "DONE_TIME">=to_date('2023-11-13 00:00:00','yyyy-MM-dd hh24:mi:ss')) AND "DONE_TIME"<= to_date('2023-11-13 00:00:00','yyyy-MM-dd hh24:mi:ss'))
      ) lgTm ) T WHERE RowIndex BETWEEN 1 AND 20


    按照目前生成的sql 的结果 我就没办法 查询 LG_TM_20231113 表 11月14日的结果集

    0 回复
  • AOP里面用这个输出 UtilMethods.GetNativeSql(sql,pars)

    按这个输出SQL我要看结果

    0 回复
  • 时间过滤是自动的不需要你考虑的

    0 回复
  • 正常操作是不需要强制索引的,把上面的SQL输出来,要用这个输出  UtilMethods.GetNativeSql(sql,pars)

    0 回复
  • @fate sta:大佬,我知道正常情况下不需要强制索引,但是上面顶部我也说明了原因了,为什么会需要强制索引


    第一个问题:才是说的强制索引,这里之所以强制索引,是指的 oracle 由于统计信息没有更新 导致了查询不走索引,所以准备用走强制索引的 来进行处理,这样的话不论 oracle 的统计信息是否及时有更新,查询索引都不会失效


    第二个问题:是指的能不能将 分表自动加的那个时间 设计成可控的,不是因为 时间 datetime 没转 date 的问题 引起的索引失效

    图片.png

    我目前用的是  预览版 5.1.4.115-prieview20 不存在时间转换 问题引起索引失效

    0 回复
  • @fate sta:我上面提的更多的是指的 需求,非 sqlsugar 出现的问题,就是有没有可能会实现支持

    0 回复
  • 没有强制分表时间,你可选哪个表

    0 回复
  • 实在不行你就as(表名) 不用分表了

    0 回复
  • @fate sta:我指的是查询的时候会自带 分表传进去的时间,这个时间能否自定义

     .SplitTable(query.BeginTime, query.EndTime);

    查询的时候 尾部会 自动加一个 查询 时间这个时间,可以不可以自控一下

    图片.png

    SELECT * FROM (
    SELECT  "MOBILE" ,ROW_NUMBER() OVER(ORDER BY "DONE_TIME" DESC) AS RowIndex  
    FROM  (SELECT "MOBILE","MOBILE_TYPE",
    FROM "LG_TM_20231113"  
    WHERE ((
    "DONE_TIME" >= :DoneTime0UnionAll1 ) AND ( "DONE_TIME" <= :DoneTime1UnionAll1 ))
     AND  "DONE_TIME">=:spBeginTimeUnionAll1 AND "DONE_TIME"<= :spEndTimeUnionAll1) lgTm ) T WHERE RowIndex BETWEEN 1 AND 20


    标注颜色这串能不能可控一下

    0 回复
  • @fate sta:另外强制索引那个有可能会实现吗?

    0 回复
  • @奋青:你的索引不同不太好实现

    0 回复
  • @奋青:这个时间不就是你传的吗,还要怎么控制

    0 回复
  • @fate sta:.SplitTable(query.BeginTime, query.EndTime);
    我的意思是 传的这个时间 能不能只用于分表 不要 自动携带 where 时间查询,做成可控制的,不需要的用户可以取消掉


    图片.png

    0 回复
  • @fate sta图片.png

    我这边看了下开源上的源码,如果没有找错的情况下,应该是这个位置加上去的,就是这个位置的能不能 设计成可控制的

    0 回复
  • 可以的

    0 回复
  • Db.Queryable<SplitTestTable>()
              .Where(it => it.Id==data.Id)
              .SplitTable(tas => tas.Where(y=>y.TableName.Contains("2019")))//表名包含2019的表
              .ToList();

    可以自个写逻辑定位哪个表不加where

    0 回复