降低一对一连接的成本

时间:2014-02-19 17:54:02

标签: sql sql-server performance

我遇到了一些性能问题,我认为其中大多数与连接有关。 大多数查询都是针对视图运行的,而视图只是表格的丰富版本,就像获取城市名称,用户全名等一样。

对于每个查询,系统首先计算该视图中的项目数,包括应用程序明智的过滤器和用户提供的过滤器,然后带来这些项目的子集,如前20,然后是第2 20等。

计数查询很昂贵。 当你走向最后几页时,寻呼也会变得更糟。

  1. 我的所有表都有一个uniqueidentifier字段作为主键。

  2. 我们正在使用EntityFramework 5.0,是的,这些查询都是 由LINQ生成。

  3. 视图定义中的大多数连接都是“左连接”。

  4. 我们没有使用任何类型的数据库外键,没有约束 所有

  5. 那么我们可以做些什么(不涉及1号和2号)来提高性能呢?

    修改 我已经检查了视图定义,其中有13个连接其中2个到同一个表(用户),其中有2.000个记录,另一个有连接的表有接近1.000个记录,其余的很少有人说10个最多-100条记录。所以在13个uniqueidenitifer领域创建一个索引对我来说似乎很昂贵。

    我认为问题是SQL正在检查左连接的返回行数,这会导致性能问题。关于如何提高该部分性能的任何想法?

    EDIT2 查找表具有转换表,因此在(ForeignKey +语言代码)的转换表上添加唯一索引极大地提高了查询性能。

1 个答案:

答案 0 :(得分:2)

您应该将索引添加到用于将表连接在一起的字段以及正在WHERE子句中使用的字段。有许多资源可用于建立有效索引的建议。它们将大大提高性能。

SQL Server Index Design Guide

交易表上的示例语法:

CREATE CLUSTERED INDEX idx_acct_dt ON tbl_Transactions (Acct_No, Txn_Dt)
CREATE NONCLUSTERED INDEX idx_amt ON tbl_Transactions (Txn_Amt)

我喜欢我的索引名称,以指示在可能的情况下索引哪些字段,但您可以根据需要为其命名。

使用视图时,会使用基础表上的索引,但您也可以索引视图本身。底层表的索引可以帮助在视图之外进行性能,因此最好在底层表上构建好的索引,然后专门评估视图上的索引需求。