Entity framework 带有稍微复杂一点的WHERE子句的SQL查询性能问题

Entity framework 带有稍微复杂一点的WHERE子句的SQL查询性能问题,entity-framework,tsql,database-performance,Entity Framework,Tsql,Database Performance,在这种情况下,我有一些性能问题: 非常简单的查询: SELECT COUNT(*) FROM Items WHERE ConditionA OR ConditionB OR ConditionC OR ... 简单地说,我必须确定用户通过一些复杂的条件可以访问多少项 当Items表中有大量记录(100000+)并且在WHERE子句中连接了10个复杂条件时,我得到的结果大约是2秒。问题是当满足很少的条件时,例如当我从100000中只得到10件物品时 在这种“获取我的物品”的情况下,我如何提高绩效

在这种情况下,我有一些性能问题:

非常简单的查询:

SELECT COUNT(*) FROM Items WHERE ConditionA OR ConditionB OR ConditionC OR ...
简单地说,我必须确定用户通过一些复杂的条件可以访问多少项

当Items表中有大量记录(100000+)并且在WHERE子句中连接了10个复杂条件时,我得到的结果大约是2秒。问题是当满足很少的条件时,例如当我从100000中只得到10件物品时

在这种“获取我的物品”的情况下,我如何提高绩效?

其他信息:

  • 查询由EF 6.1生成
  • MS SQL 2012 Express

向架构中添加一个附加表。不要构建长查询,而是将每个条件的值以及该用户/会话的键插入到这个新表中。然后,将两个表连接在一起

这应该执行得更好,因为它将允许数据库引擎更好地利用Items表上的索引


此外,这将使您最终能够为用户预先定义权限集,这样您就不需要在执行检查时插入这些权限集。权限集已经在表中,新表也可以被索引,这将进一步提高性能。

好的,我知道我可以添加一个附加表,复合主键为{ItemId,UserId}以及表示项和用户属性组合的整个WHERE子句连接结果的布尔值。这样做的代价是每次项目或用户的条件相关属性更改(或添加和删除项目本身)时都需要更新此新表。我理解正确吗?部分正确。您应该设计权限系统,以便始终对同一列进行相等比较,然后只需在新表中存储单个值。“…对同一列进行相等比较”意味着明确确定用户对每个项的访问权限。正当但在我的例子中,我还需要隐式地确定用户访问权限,这意味着访问权限是使用多个链接表(联接、存在)确定的。