Sql NHibernate查询优化

Sql NHibernate查询优化,sql,sql-server,nhibernate,Sql,Sql Server,Nhibernate,我有一个nhibernate查询,它生成这样一个查询。我刚刚提取了示例场景 从员工中选择ID 其中EMPLOYEE.NAME=@P1和 以及经理ID(@p2、@p3、@p4…@pn)等 使用NHprofiler,我发现查询大约需要500毫秒。表中有关于姓名和经理id的索引。Employee表大约有600万条记录 当查询只有一条记录要在manager\u id中搜索时,例如 从员工中选择ID 其中EMPLOYEE.NAME=@P1和 在(@p2)中输入MANAGER_ID,查询将在大约2秒钟内完成

我有一个nhibernate查询,它生成这样一个查询。我刚刚提取了示例场景

从员工中选择ID 其中EMPLOYEE.NAME=@P1和 以及经理ID(@p2、@p3、@p4…@pn)等

使用NHprofiler,我发现查询大约需要500毫秒。表中有关于姓名和经理id的索引。Employee表大约有600万条记录

当查询只有一条记录要在manager\u id中搜索时,例如

从员工中选择ID 其中EMPLOYEE.NAME=@P1和 在(@p2)中输入MANAGER_ID,查询将在大约2秒钟内完成

因此,我试图通过使用final查询并运行@n次查询(n-pn的数量)来划分这个查询。但是,每个查询的性能加起来约为400 ms或更高

有一个等效的Storedproc(它具有查找管理器ID树的if-then条件),执行速度更快

这里有什么我遗漏的吗

谢谢。

我的想法

  • 在中,计算结果为..或..或..等,因此进行索引扫描。这就是凶手

  • 索引是否“覆盖”以避免键查找

  • 索引的两种方式有什么区别?我建议两者兼有,这样优化器就可以选择最好的(基于统计数据、基数等)

像这样:

CREATE INDEX IX_MN ON EMPLOYEE (MANAGER_ID, NAME) INCLUDE (ID)
CREATE INDEX IX_NM ON EMPLOYEE (NAME, MANAGER_ID) INCLUDE (ID)
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p2
UNION ALL
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p3
UNION ALL
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p4
UNION ALL
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p5
UNION ALL
....
  • 你能重写为UNION/UNION ALL吗
像这样:

CREATE INDEX IX_MN ON EMPLOYEE (MANAGER_ID, NAME) INCLUDE (ID)
CREATE INDEX IX_NM ON EMPLOYEE (NAME, MANAGER_ID) INCLUDE (ID)
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p2
UNION ALL
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p3
UNION ALL
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p4
UNION ALL
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p5
UNION ALL
....
  • @p1和@p2..@pn是否与列数据类型完全匹配

  • SP看起来像什么


您是否设置了正确的DB索引?是。。这和sp和nhibernate打的是同一个db。。!