Sql server 优化此查询的性能

Sql server 优化此查询的性能,sql-server,tsql,azure-sql-database,Sql Server,Tsql,Azure Sql Database,我有一个(简单的)查询,大约需要22秒才能完成: SELECT c.city_name, c.task_name, COUNT(c.customer_id) AS customers, ROUND(SUM(c.opportunitySize),2) AS opportunitySize FROM customeropp AS c WHERE account_id = '1000' AND campaign_cycle = 'm07a2020' GROUP B

我有一个(简单的)查询,大约需要22秒才能完成:

SELECT 
    c.city_name, c.task_name, COUNT(c.customer_id) AS customers, 
    ROUND(SUM(c.opportunitySize),2) AS opportunitySize
FROM
    customeropp AS c
WHERE 
    account_id = '1000' AND campaign_cycle = 'm07a2020'
GROUP BY 
    c.city_name, c.task_name    
ORDER BY 
    opportunitySize DESC        
FOR JSON PATH
我的理解是索引可以提高速度,因此我还添加了以下索引

CREATE NONCLUSTERED INDEX IX_campaign_and_account 
    ON customeropp (campaign_cycle, account_id) WITH (DROP_EXISTING = ON);

CREATE NONCLUSTERED INDEX IX_city_name 
    ON customeropp (city_name) WITH (DROP_EXISTING = ON);

CREATE NONCLUSTERED INDEX IX_task_name 
    ON customeropp (task_name)  WITH (DROP_EXISTING = ON);

CREATE NONCLUSTERED INDEX IX_opportunitySize 
    ON customeropp (opportunitySize DESC)  WITH (DROP_EXISTING = ON);
还有一些其他索引,但与此特定查询无关

列类型如下所示:

目前使用的表大约有300万条记录,数据库在无服务器的Azure数据库计划中运行(最多40个vCore,最多120 GB内存)

你知道我该如何让它跑得更快吗

编辑:


执行计划可在以下位置获得:

在索引定义中使用包含列

CREATE  INDEX index_name
ON table_name(campaign_cycle, account_id)
INCLUDE(city_name, task_name, opportunitySize,  customer_id );

你能把实际的执行计划贴到什么是执行计划上吗?查询并不简单——将结果转换为JSON代价高昂。按聚合排序需要在排序th之前计算并假脱机tempdb中的所有结果,这意味着没有任何索引可用于加速排序操作。将解释实际执行计划。您可以在
(帐户\u id、活动\u周期、城市\u名称、任务\u名称)上尝试(客户\u id、机会大小)
。它以该顺序处理
where
group by
子句,并提供
select
order by
子句所需的剩余数据。@HABO wow。。。在您介绍索引建议后,查询现在处于1秒以下。那感觉像魔术!这一项似乎可以提高查询性能,但不如上面的@HABO建议那么多,因为最好包含选定的列columns@Mrsmiri该索引主要改进
where
子句(
账户id
活动周期
)的性能,但也可以通过(city\u name`和
task\u name
)通过对这些列进行排序。此时,索引中没有的
select
列只有
customer\u id
opportunitySize
。可以从表行中检索它们,但使用
include
将它们添加到索引中,允许执行查询,而无需访问表行。I至少在理论上是这样。也许@JavierC会在帖子中添加新的执行计划,这样我们就可以看到了。@HABO这是新的执行计划