oracle 索引生效需求 返回

目前 日单表的数据有 2千万-5千万左右
oracle 由于长期的收集的统计信息可能会有不更新的情况,这种情况下oracle 无法自动的使用最佳索引,会延用以前的 收集的旧统计信息进行索引优化,可能会导致全表扫描
sqlsugar 是否会考虑下 可以设置强制走索引的设置
由于使用 每日分表 每次 生成的sql 会带有 分表时候的时间,能否不自动强制加这个时间 或者是 一个可控的设置
表中虽然有是 根据 日 来分表,但是产生的 状态 可能是 第二天 第三天才返回来的,这样我就没法使用 分表进行查询, 自定义时间进行查询
可否能让用户自定义 选择 是否使用分表时间进行查询
热忱回答(20)
-
fate sta VIP0
2周前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 回复 -
fate sta VIP0
2周前还用AOP 输出一下看看不是Date类型,如果库里面是DateTime那么你的DbType也要Date
AOP里面用这个输出 UtilMethods.GetNativeSql(sql,pars)
实体
//Oracle 将DateTime转成Date
[SugarColumn(SqlParameterDbType =System.Data.DbType.Date)]
public
DateTime name {
get
;
set
; }
sqlsuarcore升级 115版本修复了分表 DbType设置未生效
0 回复 -
奋青 VIP0
2周前@fate sta:好的,我测试下试试
0 回复 -
奋青 VIP0
2周前@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----单表的情况下这种这种强制索引是支持的
有可能支持以下这种吗
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"=:MOBILEAND "DONE_TIME">=:doneTimeUnionAll2 AND "DONE_TIME"<= :doneTimeUnionAll2
) lgTm
) T WHERE RowIndex BETWEEN 1 AND
20索引名 随着表名的变动而变动
0 回复 -
奋青 VIP0
2周前@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 20SELECT * 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 回复 -
fate sta VIP0
2周前AOP里面用这个输出 UtilMethods.GetNativeSql(sql,pars)
按这个输出SQL我要看结果
0 回复 -
fate sta VIP0
2周前时间过滤是自动的不需要你考虑的
0 回复 -
fate sta VIP0
2周前正常操作是不需要强制索引的,把上面的SQL输出来,要用这个输出 UtilMethods.GetNativeSql(sql,pars)
0 回复 -
奋青 VIP0
2周前@fate sta:大佬,我知道正常情况下不需要强制索引,但是上面顶部我也说明了原因了,为什么会需要强制索引
第一个问题:才是说的强制索引,这里之所以强制索引,是指的 oracle 由于统计信息没有更新 导致了查询不走索引,所以准备用走强制索引的 来进行处理,这样的话不论 oracle 的统计信息是否及时有更新,查询索引都不会失效
第二个问题:是指的能不能将 分表自动加的那个时间 设计成可控的,不是因为 时间 datetime 没转 date 的问题 引起的索引失效
我目前用的是 预览版 5.1.4.115-prieview20 不存在时间转换 问题引起索引失效
0 回复 -
奋青 VIP0
2周前@fate sta:我上面提的更多的是指的 需求,非 sqlsugar 出现的问题,就是有没有可能会实现支持
0 回复 -
fate sta VIP0
2周前没有强制分表时间,你可选哪个表
0 回复 -
fate sta VIP0
2周前实在不行你就as(表名) 不用分表了
0 回复 -
奋青 VIP0
2周前@fate sta:我指的是查询的时候会自带 分表传进去的时间,这个时间能否自定义
.SplitTable(query.BeginTime, query.EndTime);
查询的时候 尾部会 自动加一个 查询 时间这个时间,可以不可以自控一下
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 回复 -
奋青 VIP0
2周前@fate sta:另外强制索引那个有可能会实现吗?
0 回复 -
fate sta VIP0
2周前@奋青:你的索引不同不太好实现
0 回复 -
fate sta VIP0
2周前@奋青:这个时间不就是你传的吗,还要怎么控制
0 回复 -
奋青 VIP0
2周前@fate sta:.SplitTable(query.BeginTime, query.EndTime);
我的意思是 传的这个时间 能不能只用于分表 不要 自动携带 where 时间查询,做成可控制的,不需要的用户可以取消掉0 回复 -
奋青 VIP0
2周前@fate sta:
我这边看了下开源上的源码,如果没有找错的情况下,应该是这个位置加上去的,就是这个位置的能不能 设计成可控制的
0 回复 -
fate sta VIP0
2周前可以的
0 回复 -
fate sta VIP0
2周前Db.Queryable<SplitTestTable>() .Where(it => it.Id==data.Id) .SplitTable(tas => tas.Where(y=>y.TableName.Contains("2019")))//表名包含2019的表 .ToList();
可以自个写逻辑定位哪个表不加where
0 回复