sql server 关联查询,通过with指定索引,生成的sql中,所有表后面跟着的 with 内容都相同 返回
因为一些历史遗留问题,数据库的索引设计并不合理。现在数据量较大,执行计划选择的索引不是最优,所以考虑使用指定索引来提升查询性能。发现了此问题。
C#代码:
Context.Queryable<Table_A>().With("WITH(INDEX(ix_a))")
.LeftJoin<Table_B>((a,b) => a.Pid == b.Id)
.....;
生成的sql是这样:
select .....
from Table_A a WITH(INDEX(ix_a))
left join Table_B b WITH(INDEX(ix_a))
......
代码改成
Context.Queryable<Table_A>().With("WITH(INDEX(ix_a))")
.LeftJoin<Table_B>((a,b) => a.Pid == b.Id).With("WITH(NOLOCK)")
.....;
生成的sql是这样:
select .....
from Table_A a WITH(NOLOCK)
left join Table_B b WITH(NOLOCK)
......
热忱回答(3)
-
fate sta VIP0
2025/9/3varq11 = db.Queryable<Order>().With("WITH(INDEX(ix_a))").Where(it => it.Id>1);varq22 = db.Queryable<Order>().Where(it => it.Id > 2);varq33 = db.Queryable<Order>().Where(it => it.Id > 3);varlist= q11.LeftJoin(q22, (x, y) => x.Id == y.Id).LeftJoin(q33, (x, y, z) => x.Id == z.Id).ToList();0 回复 -
fate sta VIP0
2025/9/3可以改用嵌套查询方式实现。这样就不会出现你说的问题
0 回复 -
犀利的绵羊 VIP0
2025/9/3@fate sta:感谢回复,嵌套查询相当于把每个表的查询包了一层。
试了一下,确实可行。就是代码写出来不是很简洁,生成的sql嵌套的层数也有点多。0 回复