Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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_Tsql - Fatal编程技术网

Sql 简单查询性能问题

Sql 简单查询性能问题,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两个查询,它们背靠背运行并填充两个单独的网格。它们不是在同一个sql查询实例中运行的,而是背靠背运行的 我在SSMS中运行了这两个查询,每个查询大约需要5秒。BO_HRO约有600000行,BO_HParts约有1200000行,分别具有一对多关系。我还有一个SSMS建议的关于删除人、RO_NO和BName的BO_HRO索引,以及关于删除人、RO_NO、Quanity、PartNo和PartDesc的BO_HParts索引 SELECT TOP 10000 bo_hparts.partno,

我有两个查询,它们背靠背运行并填充两个单独的网格。它们不是在同一个sql查询实例中运行的,而是背靠背运行的

我在SSMS中运行了这两个查询,每个查询大约需要5秒。BO_HRO约有600000行,BO_HParts约有1200000行,分别具有一对多关系。我还有一个SSMS建议的关于删除人、RO_NO和BName的BO_HRO索引,以及关于删除人、RO_NO、Quanity、PartNo和PartDesc的BO_HParts索引

SELECT TOP 10000 bo_hparts.partno, 
                          bo_hparts.partdesc, 
                          SUM(bo_hparts.quanity) AS qtysum

FROM bo_hparts INNER JOIN bo_hro ON bo_hparts.ro_no = bo_hro.ro_no

WHERE bo_hparts.deleted_by < 0 AND bo_hro.deleted_by < 0

GROUP BY bo_hparts.partno, bo_hparts.partdesc
ORDER BY SUM(bo_hparts.quanity) DESC, bo_hparts.partno;

SELECT TOP 10000 bo_hro.bname, 
                          bo_hparts.partno, 
                          bo_hparts.partdesc, 
                          SUM(bo_hparts.quanity) AS qtysum

FROM bo_hparts INNER JOIN bo_hro ON bo_hparts.ro_no = bo_hro.ro_no

WHERE bo_hparts.deleted_by < 0 AND bo_hro.deleted_by < 0

GROUP BY bo_hro.bname, bo_hparts.partno, bo_hparts.partdesc
ORDER BY SUM(bo_hparts.quanity) DESC, bo_hro.bname, bo_hparts.partno
我的老板仍在要求提高绩效,我不知道还能做些什么来实现这一目标。有没有别的办法提高速度


我在这里有一个执行计划

可能会更改您的group by子句,所以请使用表别名/名称?

以下是一些想法:

将where子句更改为显式比较:

WHERE bo_hparts.deleted_by = -1 AND bo_hro.deleted_by = -1
这将允许您使用复合索引,例如bo_hpartsdeletted_by、ro_no。这可能有助于查询

为bo_hro创建覆盖索引。这将是bo_hroro__no,按数量删除。如果记录广泛,这可能会有所帮助

bo_hparts的覆盖索引可能也会有所帮助,但这可能是一个较小的表,因此可能没有那么重要

如果您关心最低数量,请尝试添加:

having sum(bo_hparts.quantity) > 1000
这可以使订单更有效率


不过,最终,您要做的是计算密集型的。如果需要此类查询的实时性能,可能需要考虑使用触发器使摘要数据保持最新。这会将查询简化为一个顺序,您甚至可以通过在摘要数据中添加索引来优化查询。

请使用表别名更新查询,以便我们可以判断列来自哪些表。此外,您还可以删除distinct-看看这是否有助于提高性能。而且,deleted_by是采用单个值(如-1)还是真的要检查多个值?@GordonLinoff添加了别名,而“distinct”并没有什么区别。假设您的deleted_是正确的,它只是一个-1或1-1的单个值没有被删除,1被删除在这种情况下,对于初学者,您可以简单地使用=-1代替<0。我不知道这会有多大的影响,但无论如何都值得去做…按总数排序。。。这很糟糕。这意味着,前10000名必须在所有行相加后进行-这是昂贵的。与其修改查询,不如将sum作为列添加到父表中?在这种情况下,它可以有一个索引,而不是通过一百万行,你只需要爬行一万行。当然,更新会更昂贵,但这就是为什么它被称为权衡。@PinnyM`=-1`没有改变性能。我确实把订单取消了,这使每个查询都缩短到了3秒;但是,这改变了预期的结果。表名没有任何影响。让我尝试重写:从bo_hparts a中选择TOP 10000 bo_hparts.partno、bo_hparts.partdesc、SUMbo_hparts.quanity作为qtysum,其中a.ro_no=b.ro_no和bo_hparts.deleted_by<0和bo_hro.deleted_by<0组由bo_hparts.partno,bo_hparts.partdesc顺序由SUMbo_hparts.quantity DESC,bo_hparts.partno@劳伦斯:你应该在你的答案中加入这些信息,而不是作为一个评论。虽然我真的不能把这些信息放在适当的位置上,除非进行明确的比较,它们都会有所帮助。我的老板不愿意仅仅为这个查询对表进行索引,而保留一个触发器对于他想要的东西来说是过分的。不得不告诉你的老板,如果没有额外的零件,这是行不通的,这很糟糕,但归根结底就是这样。