Sql 降低一对一联接的成本
我有一些性能问题,我认为大多数都与连接有关。 大多数查询都是针对视图运行的,视图只是该表的扩展版本,比如它获取城市名称、用户全名等 对于每个查询,系统首先统计视图中的项目,包括应用程序过滤器和用户提供的过滤器,然后带来这些项目的子集,如前20个,然后是第2个20个,等等 计数查询很昂贵。 当您进入最后一页时,分页也会变得更糟糕Sql 降低一对一联接的成本,sql,sql-server,performance,Sql,Sql Server,Performance,我有一些性能问题,我认为大多数都与连接有关。 大多数查询都是针对视图运行的,视图只是该表的扩展版本,比如它获取城市名称、用户全名等 对于每个查询,系统首先统计视图中的项目,包括应用程序过滤器和用户提供的过滤器,然后带来这些项目的子集,如前20个,然后是第2个20个,等等 计数查询很昂贵。 当您进入最后一页时,分页也会变得更糟糕 我所有的表都有一个uniqueidentifier字段作为主键 我们使用的是EntityFramework 5.0,是的,这些查询都是 由LINQ生成 视图定义中的大多数
查找表有转换表,因此在(ForeignKey+语言代码)的转换表上添加唯一索引可以极大地提高查询性能。您应该向用于将表连接在一起的字段以及在
WHERE
子句中使用的字段添加索引。有许多资源可用于提供有关构建有效索引的建议。它们将大大提高性能
事务表上的语法示例:
CREATE CLUSTERED INDEX idx_acct_dt ON tbl_Transactions (Acct_No, Txn_Dt)
CREATE NONCLUSTERED INDEX idx_amt ON tbl_Transactions (Txn_Amt)
我喜欢我的索引名来指示哪些字段在可能的情况下被索引,但是您可以随意命名它们
使用视图时,将使用基础表上的索引,但也可以为视图本身编制索引。对基础表的索引可以帮助提高视图之外的性能,因此最好在基础表上建立良好的索引,然后专门评估视图上的索引需求。用于联接的字段是否包含在索引中?否。联接中使用的字段不包含在索引中。我已检查了视图,有13个连接,其中两个连接到同一个表(用户),该表有大约2000条记录(实际上在该字段上有一个索引),另一个有连接的表有大约1000条记录,其余的只有很少的记录,比如说最多10-100条记录。因此,在13个uniqueidenitifer字段上创建索引对我来说成本很高。我无法预测用户将过滤什么,因为我们允许他们过滤任何内容,但是的,我有我知道会被大量使用的索引。在存储和插入/更新性能中创建索引需要成本,但它们几乎普遍有助于
SELECT
(存在陷阱,过度索引是一件事,但通常即使这样,索引也不会被优化器使用,而实际上会损害性能)。