我遇到了一些性能问题,我认为其中大多数与连接有关。 大多数查询都是针对视图运行的,而视图只是表格的丰富版本,就像获取城市名称,用户全名等一样。
对于每个查询,系统首先计算该视图中的项目数,包括应用程序明智的过滤器和用户提供的过滤器,然后带来这些项目的子集,如前20,然后是第2 20等。
计数查询很昂贵。 当你走向最后几页时,寻呼也会变得更糟。
我的所有表都有一个uniqueidentifier字段作为主键。
我们正在使用EntityFramework 5.0,是的,这些查询都是 由LINQ生成。
视图定义中的大多数连接都是“左连接”。
我们没有使用任何类型的数据库外键,没有约束 所有
那么我们可以做些什么(不涉及1号和2号)来提高性能呢?
修改 我已经检查了视图定义,其中有13个连接其中2个到同一个表(用户),其中有2.000个记录,另一个有连接的表有接近1.000个记录,其余的很少有人说10个最多-100条记录。所以在13个uniqueidenitifer领域创建一个索引对我来说似乎很昂贵。
我认为问题是SQL正在检查左连接的返回行数,这会导致性能问题。关于如何提高该部分性能的任何想法?
EDIT2 查找表具有转换表,因此在(ForeignKey +语言代码)的转换表上添加唯一索引极大地提高了查询性能。
答案 0 :(得分:2)
您应该将索引添加到用于将表连接在一起的字段以及正在WHERE
子句中使用的字段。有许多资源可用于建立有效索引的建议。它们将大大提高性能。
交易表上的示例语法:
CREATE CLUSTERED INDEX idx_acct_dt ON tbl_Transactions (Acct_No, Txn_Dt)
CREATE NONCLUSTERED INDEX idx_amt ON tbl_Transactions (Txn_Amt)
我喜欢我的索引名称,以指示在可能的情况下索引哪些字段,但您可以根据需要为其命名。
使用视图时,会使用基础表上的索引,但您也可以索引视图本身。底层表的索引可以帮助在视图之外进行性能,因此最好在底层表上构建好的索引,然后专门评估视图上的索引需求。