首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >MSSQL -在查询中执行多个计数不同的调用,运行缓慢。

MSSQL -在查询中执行多个计数不同的调用,运行缓慢。
EN

Stack Overflow用户
提问于 2012-08-29 08:43:36
回答 2查看 1.3K关注 0票数 1

我有具有以下模式的表:

设备

  • DeviceId
  • 名字

服务

  • ServiceId
  • 名字

软件

  • SoftwareId
  • 名字

Device_Software

  • DeviceId
  • SoftwareId
  • DiscoveryDate

Device_Service

  • DeviceId
  • ServiceId
  • DiscoveryDate

现在,我正在尝试编写一个查询,给出一个设备,以及设备拥有的不同软件和服务的数量。

如果我运行以下查询,我将在5秒内得到一个结果(设备有50,000行,软件和服务都有200行,链接表包括每个设备到每个软件和服务的链接)。只是为了测试的目的)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
  device.name
  ,COUNT(DISTINCT(device_software.softwareId))
FROM
  device
LEFT OUTER JOIN
  device_software ON device.deviceId = device_software.deviceId
GROUP BY device.name

但是,如果我试图将查询扩展为包含这两个查询的计数,则需要花费更长的时间(~30分钟,并且仍在继续):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
  device.name
  ,COUNT(DISTINCT(device_software.softwareId))
  ,COUNT(DISTINCT(device_service.serviceId))
FROM
  device
LEFT OUTER JOIN
  device_service ON device.deviceId = device_service.deviceId
LEFT OUTER JOIN
  device_software ON device.dDeviceId = device_software.deviceId
GROUP BY device.name

既然这是在存储过程中,我可以单独获取这两个计数并将其合并,但这似乎是一次黑客攻击。我在想,是否有人知道有更好的方法可以在一个查询中做到这一点,而不影响性能呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-29 09:00:52

我会尝试以下几种方法,看看它是否起作用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
device.name
a.cntSft, b.cntSrv
FROM device
LEFT JOIN
 ( SELECT deviceId, COUNT(DISTINCT softwareId) as cntSft FROM device_software 
 GROUP BY deviceId) a (ON a.deviceId = device.deviceId)
LEFT JOIN 
( SELECT deviceId, COUNT(DISTINCT serviceId) as cntSrv FROM device_service 
 GROUP BY deviceId) b (ON b.deviceId = device.deviceId);

您还可能不需要COUNT DISTINCT,而只需要使用此版本的查询的COUNT

票数 2
EN

Stack Overflow用户

发布于 2012-08-29 08:50:13

您可以考虑在Device_Software和Device_Service上建立索引视图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW dbo.v_Device_Software
WITH SCHEMABINDING
AS
  SELECT DeviceId, SoftwareId, DeviceCount = COUNT_BIG(*)
    FROM dbo.Device_Software
    GROUP BY DeviceId, SoftwareId;
GO
CREATE UNIQUE CLUSTERED INDEX x ON dbo.v_Device_Software(DeviceId, SoftwareId);
GO

CREATE VIEW dbo.v_Device_Service
WITH SCHEMABINDING
AS
  SELECT DeviceId, ServiceId, DeviceCount = COUNT_BIG(*)
    FROM dbo.Device_Service
    GROUP BY DeviceId, ServiceId;
GO
CREATE UNIQUE CLUSTERED INDEX x ON dbo.v_Device_Service(DeviceId, ServiceId);
GO

现在,您的查询变成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
  device.name
  ,COUNT(vsoft.DeviceId)
  ,COUNT(vserv.DeviceId)
FROM
  dbo.device
LEFT OUTER JOIN dbo.v_Device_Service AS vserv
  ON device.deviceId = vserv.DeviceId
LEFT OUTER JOIN dbo.v_Device_Software AS vsoft
  ON device.deviceId = voft.DeviceId
GROUP BY device.name;

但是有许多限制,您应该确保测试这对整个工作负载的影响,而不仅仅是这个查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12182704

复制
相关文章
mysql聚合统计数据查询缓慢优化方案
随着业务发展,这些表会越来越大,如果处理不当,查询统计的速度也会越来越慢,直到业务无法再容忍。
宣言言言
2019/12/18
6.9K0
DNS在远程调用执行中的应用
纯属蹭log4j2热度文,和安全没有直接的关系,本文只谈DNS以及日志应用; 通过dnslog.cn的截图,分析dnslog.cn的原理,基于此,介绍了可以获取更多信息的ceye的功能;在应用场景上,我们通过该原理提供了用户出口IP同本地DNS递归出口IP的对应关系,延伸出了排障场景和数据分析场景。
hermanzeng
2021/12/14
6K3
DNS在远程调用执行中的应用
Oracle——无法在查询中执行 DML 操作
create or replace function test_f(id varchar2) return varchar2 is Result varchar2(100); begin insert into sfcs_temp_17109 (sn)values(id);
_一级菜鸟
2019/09/10
4.2K0
Oracle——无法在查询中执行 DML 操作
pytest运行_pytest执行多个py文件
pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例。 方便我们在运行用例的时候加上–lf 和 –ff 参数,快速运行上一次失败的用例。 –lf, –last-failed 只重新运行上次运行失败的用例(或如果没有失败的话会全部跑) –ff, –failed-first 运行所有测试,但首先运行上次运行失败的测试(这可能会重新测试,从而导致重复的fixture setup/teardown)
全栈程序员站长
2022/09/16
2K0
idea运行缓慢_intellij idea运行不了
  1、由于默认的jvm太多,但是实际上可以用的比较少,我们可以这样进行设置,使用鼠标右键单击桌面上的IntelliJ IDEA软件图标,选择“打开文件所在的位置”一栏
全栈程序员站长
2022/10/02
9140
idea运行缓慢_intellij idea运行不了
java中==、equals的不同AND在js中==、===的不同
       1.==操作符:首先,对于非基本数据类型的对象比较,相同内存中存储的变量的值是否相等,注意是相同内存地址的才可,并且数值相同(当然地址相同,值也一定相同)才会返回true.     但是,对于基本数据类型的比较(比如:int flot double等),值相同,"=="比较便会返回true.(这是编译的规则,当进行基本数据类型的比较时,会编译生成if_icmpne指令不会进行比较地址。而进行对象比较时,会生成if_icmpne指令,会比较地址。生成的指令都是不同的)。
洋仔聊编程
2019/01/15
4K0
增长分析-在缓慢变化中的跳变
本文首发于腾讯内部知识分享平台「乐问KM」、腾讯官方公众号「腾讯大讲堂」《数据分析:在缓慢变化中寻找跳变——基于缓慢变化维度的用户分群》,作者日后创建个人公众号,以转载形式发布本文。
刘健阁
2021/08/13
7130
增长分析-在缓慢变化中的跳变
SparkSql中多个Stage的并发执行
写一篇水水的技术文,总结一下sparksql中不同stage的并行执行相关,也是来自于一位群友的提问:
数据仓库践行者
2022/11/25
1.6K0
SparkSql中多个Stage的并发执行
SAP关闭正在执行的缓慢的程序
第一种最简单的方法就是右键任务栏——结束会话。 第二种也很简单,就是点击左上角的小图标——停止事务。 第三种则是利用事务代码SM50——选中条目——菜单“管理”——删除会话。 至于网上所说利用SM12
matinal
2020/11/27
6100
SAP关闭正在执行的缓慢的程序
.NET 5在Docker中访问MSSQL报错
不知道你有没有在.NET Core/.NET 5的Docker访问MS SQL Server数据库,如果有,那么很有可能会遇到这个错误。
Edison Zhou
2021/12/02
2.5K0
.NET 5在Docker中访问MSSQL报错
一条查询SQL在MySQL中是怎么执行的
平时我们使用的数据库,看到的通常是一个整体,比如我们执行一条查询SQL,返回一个结果集,却不知道这条语句在MySQL内部是如何执行的,接下来我们就来简单的拆解一下MySQL,看看MySQL是由哪些“零件”组成的,在这个过程中逐步的揭开MySQL的面纱,对MySQL有个深入的理解。这样在我们以后遇到MySQL的一些异常或者问题的时候,就可以快速定位问题并解决问题。
故里
2020/11/25
4.8K0
一条查询SQL在MySQL中是怎么执行的
golang实现动态调用不同struct中不同的方法
在我们的业务中,尤其涉及到后台业务,在我们不用考虑性能的情况下,我们写后台框架的时候,可能会遇到这样的一些情况,如何通过某些struct名和方法名传递进来执行不同的逻辑。这个时候我想的是go的反射是最好的实现这种功能,当然在go里面也可以通过定义配置来实现进入动态进入不同的struct名和方法名,或者其他方式(如果你有更好的方式,可以互相交流)。
公众号-利志分享
2022/04/25
1.7K0
PostgreSQL中的查询:1.查询执行阶段
PG客户端-服务协议的基本目的是双重的:将SQL查询发送到服务,接收整个执行结果作为响应。服务接收到查询去执行要经过几个阶段。
yzsDBA
2022/03/29
3.2K0
PostgreSQL中的查询:1.查询执行阶段
如何修复运行缓慢的 WordPress 网站?
就其 SEO 而言,网站和网页的速度和性能非常重要。速度更快的网站可能在搜索引擎结果页面上排名更高。它也有可能获得更多的网络流量和浏览量。对于商业网站,这直接转化为营业额的增加和更好的覆盖面。
海拥
2023/01/01
2.1K0
SORT命令在Redis中的实现以及多个选项时的执行顺序
SORT命令在Redis中实现了对存储在列表、集合、有序集合数据类型的元素进行排序的功能。
一凡sir
2023/10/05
6040
SORT命令在Redis中的实现以及多个选项时的执行顺序
MSSQL语句执行工具asp版
    之前自己网上找各种方法拼拼凑凑出来的一个脚本,目的是在asp环境下连接mssql并执行命令。
phith0n
2020/10/15
1.7K0
数据分析:在缓慢变化中寻找跳变——基于缓慢变化维度的用户分群
引导语 数据分析中,我们常常有下面几种分群方式 基础属性类:年龄、性别、城市、学历、用于首次来源 ·  特点:基本是不变化的,虽然年龄、城市等也会发生变化,但本质上我们是将其作为一个用户固定属性进行分析 ·  优势:用户属性稳定,分群永远不变化 · 劣势:是维度有限,很多分析维度很难找到固定属性 图:某业务用户数分年龄段曲线(来自腾讯灯塔截图) 动态属性类:当天启动方式、当日拉活渠道、新老用户、当日播放视频数、当日是否领取红包 · 特点:基本上是基于用户当天的一些行为或状态数据,例如启动方式,每天
腾讯大讲堂
2020/07/31
7630
Express调用mssql驱动公共类dbHelper
直接上代码: /** * Created by chaozhou on 2015/9/18. */ var mssql = require('mssql'); var user = "sa", password = "sa", server = "192.168.20.132", database = "ggcms"; /** * 默认config对象 * @type {{user: string, password: string, server: string, dat
磊哥
2018/05/08
9260
关于lr调用jar在vuser中可以运行,但是controller中却报错的问题
如题,错误如下:javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found 查找了很多地方,没有找到原因,很偶然的在一个帖子里面发现了上述错误,虽然不是loadrunner的。但还是拿来试了试。居然解决了这个问题。 方法:在java vuser中的init中加上如下两句话: System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");         System.setProperty("javax.xml.parsers.SAXParserFactory","com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
流柯
2018/08/30
8600
点击加载更多

相似问题

蜂巢多个不同的查询运行缓慢?

22

MSSQL查询运行缓慢,大量左联接。

22

运行缓慢的查询,CF 9& MSSQL 2008;错误的执行计划?

15

多个表的计数和MSSQL查询

25

如何执行此查询:多个不同的计数

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文