Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 降低一对一联接的成本_Sql_Sql Server_Performance - Fatal编程技术网

Sql 降低一对一联接的成本

Sql 降低一对一联接的成本,sql,sql-server,performance,Sql,Sql Server,Performance,我有一些性能问题,我认为大多数都与连接有关。 大多数查询都是针对视图运行的,视图只是该表的扩展版本,比如它获取城市名称、用户全名等 对于每个查询,系统首先统计视图中的项目,包括应用程序过滤器和用户提供的过滤器,然后带来这些项目的子集,如前20个,然后是第2个20个,等等 计数查询很昂贵。 当您进入最后一页时,分页也会变得更糟糕 我所有的表都有一个uniqueidentifier字段作为主键 我们使用的是EntityFramework 5.0,是的,这些查询都是 由LINQ生成 视图定义中的大多数

我有一些性能问题,我认为大多数都与连接有关。 大多数查询都是针对视图运行的,视图只是该表的扩展版本,比如它获取城市名称、用户全名等

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

计数查询很昂贵。 当您进入最后一页时,分页也会变得更糟糕

  • 我所有的表都有一个uniqueidentifier字段作为主键

  • 我们使用的是EntityFramework 5.0,是的,这些查询都是 由LINQ生成

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

  • 我们没有使用任何类型的数据库外键,没有任何限制 全部

  • 那么,我们可以做些什么(不涉及数字1和2)来提高性能呢

    编辑: 我已经检查了视图定义,有13个连接,其中两个连接到同一个表(用户),该表有大约2000条记录,另一个有连接的表有将近1000条记录,其余的很少,比如说最多10-100条记录。因此,在13个uniqueidenitifer字段上创建索引对我来说似乎代价高昂

    我认为问题在于SQL正在检查左连接的返回行计数,这导致了性能问题。关于如何提高该部分的性能,有什么想法吗

    EDIT2
    查找表有转换表,因此在(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
    (存在陷阱,过度索引是一件事,但通常即使这样,索引也不会被优化器使用,而实际上会损害性能)。