查询执行速度非常慢,有什么办法可以进一步改进它吗?

2024-01-21

我有以下查询,并且由于很多SUM函数调用,我的查询运行太慢。我的数据库中有很多记录,我想为每条记录获取今年和去年(过去 30 天、过去 90 天和过去 365 天)的报告:

SELECT 
    b.id as [ID]
    ,d.[Title] as [Title]
    ,e.Class as [Class]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 30 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 30 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 90 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 90 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Current - Last 365 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Current - Last 365 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-13,GETDATE()) and a.DateCol <= DATEADD(MONTH,-12,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 30 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-13,GETDATE()) and a.DateCol <= DATEADD(MONTH,-12,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 30 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-5,GETDATE()) and a.DateCol <= DATEADD(QUARTER,-4,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 90 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(QUARTER,-5,GETDATE()) and a.DateCol <= DATEADD(QUARTER,-4,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 90 Days Col2]

    ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-2,GETDATE()) and a.DateCol <= DATEADD(YEAR,-1,GETDATE()) THEN a.col1 ELSE 0 END) as [Last year - Last 365 Days Col1]
    ,Sum(CASE WHEN a.DateCol >= DATEADD(YEAR,-2,GETDATE()) and a.DateCol <= DATEADD(YEAR,-1,GETDATE()) THEN a.col2 ELSE 0 END) as [Last year - Last 365 Days Col2]


    FROM 
    tb1 a
INNER JOIN 
    tb2 b on a.id=b.fid and a.col3 = b.col4
INNER JOIN 
    tb3 c on b.fid = c.col5
INNER JOIN       
    tb4 d on c.id = d.col6
INNER JOIN 
    tb5 e on c.col7 = e.id
GROUP BY
    b.id, d.Title, e.Class

有谁知道如何改进我的查询以便运行得更快?

EDIT:我被鼓励搬家DATEADD函数调用where语句并首先加载前两年,然后在列中过滤它们,但我不确定建议的答案是否被执行和工作,可以在这里找到:https://stackoverflow.com/a/59944426/12536284 https://stackoverflow.com/a/59944426/12536284

如果您同意上述解决方案,请告诉我如何将其应用到当前的查询中?

仅供参考,我在 C#、实体框架(DB-First)中使用这个 SP,如下所示:

var result = MyDBEntities.CalculatorSP();

正如已经提到的,执行计划 https://developer.rackspace.com/blog/understanding-a-sql-server-execution-plan/在这种情况下会非常有帮助。根据您所显示的内容,您似乎已从总共 15 列中提取了 12 列tb1 (a), 因此您可以尝试在没有任何连接的情况下运行查询,仅针对tb1查看您的查询是否按预期工作。由于我看不出您的 SUM 函数调用有任何问题,我最好的猜测是您的联接有问题,我建议执行以下操作。例如,您可以首先排除最后一个连接,INNER JOIN tb5 e on c.col7 = e.id以及它的任何相关用法,例如e.Class as [Class] and e.Class在您的 group by 语句中。我们不会完全排除它,这只是一个 测试以确定问题是否与此相关,如果您的查询运行得更好并且如预期的那样,您可以尝试使用临时表作为解决方法而不是最后一个连接, 像这样:

SELECT *
INTO #Temp
FROM
  (
     select * from tb5
  ) As tempTable;

SELECT 
    b.id as [ID]
    ,d.[Title] as [Title]
    ,e.Class as [Class]

    -- SUM Functions

FROM 
    tb1 a
INNER JOIN 
    tb2 b on a.id=b.fid and a.col3 = b.col4
INNER JOIN 
    tb3 c on b.fid = c.col5
INNER JOIN       
    tb4 d on c.id = d.col6
INNER JOIN 
    #Temp e on c.col7 = e.id
GROUP BY
    b.id, d.Title, e.Class

实际上,临时表是临时存在于SQL Server上的表。临时表对于存储多次访问的即时结果集非常有用。你可以在这里读更多关于它的内容https://www.sqlservertutorial.net/sql-server-basics/sql-server-temporary-tables/ https://www.sqlservertutorial.net/sql-server-basics/sql-server-temporary-tables/和这里https://codingsight.com/introduction-to-temporary-tables-in-sql-server/ https://codingsight.com/introduction-to-temporary-tables-in-sql-server/

另外我强烈建议,如果您使用存储过程,请设置NOCOUNT to ON,它还可以提供显着的性能提升,因为网络流量大大减少:

SET NOCOUNT ON
SELECT *
INTO #Temp
-- The rest of code

基于this https://www.tech-recipes.com/rx/56506/sql-server-set-nocount-on-statement-with-examples/:

SET NOCOUNT ON 是一个设置语句,可防止显示受 T-SQL 查询语句影响的行数的消息。这在存储过程和触发器中使用以避免显示受影响的行消息。在存储过程中使用 SET NOCOUNT ON 可以显着提高存储过程的性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查询执行速度非常慢,有什么办法可以进一步改进它吗? 的相关文章

随机推荐

  • VS Code Python 安装和 Python 解释器无法识别

    我在 VS Code 上收到此消息 Python is not installed Please download and install python before using the extension 也没有 Python Inter
  • 创建静态库时嵌入所有外部引用

    我需要为 C 代码创建一个包装器库来包装我的 C 库 有没有一种方法可以创建该包装器库 使得用户只需要链接该包装器库 而不必在链接器命令行上包含所有 C 库 我的测试项目的结构如下所示 lib cpp print cc print h li
  • 适用于 iOS 和 Android 的经典蓝牙包可能吗?

    After learning https stackoverflow com questions 64417509 basic flutter bluetooth questions一般而言 正确了解 BLE 和蓝牙后 我决定使用经典蓝牙来
  • 玩法 2:将表单绑定到 List[Model] 的惯用方法

    我有几个 CRUD 操作要执行 每个操作都针对一组模型 例如比赛日程 球队名单 比赛结果 比赛统计数据等 到目前为止 在我的 Play 体验中 仅几个月 有 1 个项目上线 我一直在使用一对一表单绑定到模型实例 我知道我可以对表单字段名称进
  • ggplot在pdf中嵌入字体

    我一直在使用以下指南来导出用ggplotto pdf 绘图字体指南 http zevross com blog 2014 07 30 tired of using helvetica in your r graphics heres how
  • 如何将 API 响应(json)绑定到 Angular4 中的下拉菜单

    我正在 Angular4 应用程序中工作 我需要绑定 API 响应数据的下拉列表 我不知道如何从 API 获取特定部分的特定数据 这里API包含类别 组和子组数据 每个组有2个子组 我为此创建了一个 stackblitz 文件 请看一下 h
  • 为什么不使用 document.write 呢? [复制]

    这个问题在这里已经有答案了 为什么通常不认为使用document write在 JavaScript 中 我知道这不是最优雅或最好的方法 但是它有任何真正的错误吗 一直好吗 在什么情况下会比inner HTML 据我所知 如果在加载后使用
  • Flask 说“没有提供 FLASK_APP 环境变量”[重复]

    这个问题在这里已经有答案了 我正在尝试运行 Flask 应用程序flask run但无论如何 我收到此错误 Error Could not locate Flask application You did not provide the F
  • 如何使用 serde_json 动态构建 json 数组或对象?

    我需要在运行时构建一个 json 对象 现在 只是一个简单的 key stringvalue 对象 但每个键 值对必须添加到循环中 这看起来非常简单 基本 但我没有找到任何好的示例或文档 我终于设法让一些东西发挥作用 但它似乎太复杂了 不是
  • 如何在 Windows 上获得 git 分支的图形表示,真正显示存储库的拓扑?

    我的最后一个问题已关闭 因为显然是重复的并且已得到多次答复 然而 没有一个答案提到 无法在终端中显示 Git 树 https stackoverflow com questions 1064361 unable to show a git
  • 自定义 uitableViewCell 内的 NSTimer

    我正在从 viewController 激活自定义单元类中的函数 自定义单元格类如下所示 import UIKit class TableViewCell UITableViewCell var counter 10 class func
  • 如何对非 ASCII 字符使用 tolower 函数

    我正在尝试对非 ASCII 字符应用较低的函数 以下代码在Linux Ubuntu 环境中不起作用 但在Windows中有效 int main std string data std transform data begin data en
  • Java:来自 class.getResource( ... ) 的 NullPointerException

    我正在编写一个小型应用程序 当我尝试创建 ImageIcon 时 我总是遇到异常 异常是由这行代码引起的 prayerLevel setIcon new ImageIcon getClass getResource icons icon p
  • 使用原始文件的共享外部包?

    我们有一些项目依赖共享类型进行通信 团队决定使用这些类型的共享包 并希望使用协议缓冲区来实现此实现 如果重要的话 语言是 Go 并且所有这些项目都不是公开的 我们如何使用项目中未定义的协议缓冲区类型 我似乎无法找到一种在应用程序之间共享完全
  • 在 C 扩展中定义 Python 枚举 - 我这样做对吗?

    我正在开发一个 Python C 扩展 我想公开一个完全在 C 中定义的自定义枚举 如 继承自 enum Enum 的类 事实证明这不是一个简单的任务 并且使用常规的继承机制 tp base不起作用 很可能是由于 Enum 的元类没有被引入
  • 在 C 中更改 .bin 文件的数据

    我有很多数据以 bin 格式存储为结构序列 我希望能够随机读取任何结构并在 C 中修改它 我正在尝试使用以下代码 但它不起作用 有人可以帮我解决吗 另外 是否可以从中间的文件中删除中间结构 代码如下 include
  • 从静态域提供 CSS

    我想从静态无 cookie 域提供我的 CSS 和图像 现在我的问题是如何指向 css 文件中的图像 我不想在 css 文件中对我的域进行硬编程 例如 http static com image png http static com im
  • 在搅拌机 2.76 中将装备重量从一个网格转移到另一个网格

    我最近开始使用搅拌机来创建我自己的游戏模型等 我创建了一个模型 对其进行了装备 单独创建了衣服 现在我想将这些衣服添加到我的模型中 以便它随装备移动而不会刺穿皮肤 因此 有很多使用重量转移工具的解决方案 但我似乎无法在 Blender 2
  • 如果设计师可以使用@font-face,为什么还要使用 sIFR?

    如果设计师可以使用 font face 为什么还要使用 sIFR font face 有什么问题吗 font face font family Hacen Tehran eot src url Hacen Tehran eot font f
  • 查询执行速度非常慢,有什么办法可以进一步改进它吗?

    我有以下查询 并且由于很多SUM函数调用 我的查询运行太慢 我的数据库中有很多记录 我想为每条记录获取今年和去年 过去 30 天 过去 90 天和过去 365 天 的报告 SELECT b id as ID d Title as Title