gpt4 book ai didi

sql - 这个简单的 SQL 查询可以优化吗?

转载 作者:行者123 更新时间:2023-12-02 14:22:43 24 4
gpt4 key购买 nike

我有以下查询:

SELECT COUNT(*) 
FROM Address adr INNER JOIN
Audit a on adr.UniqueId = a.UniqueId
  • 基于数据库(130 万个地址,超过 400 万次审核)
  • 两个 UniqueId 列都是聚集主键

查询需要很长时间才能完成。我感觉很蠢,但是有什么办法可以优化吗?我想计算所有具有底层可审计的地址条目。

编辑:非常感谢您的所有输入,以下是更多详细信息:

  • 该查询不会经常运行(它仅用于验证),但感谢索引 View 提示,我肯定会将其添加到我的知识中。
  • 所有地址都有相关的一对一审核。并非所有审计都是地址。
  • 查询需要超过 1 分钟才能完成。我发现对于简单的计数来说这太长了。

最佳答案

由于您有两组数据,按相同的值排序..您是否尝试过合并连接而不是嵌套循环连接?

SET STATISTICS IO ON
SET STATISTICS TIME ON

SELECT COUNT(*)
FROM Address adr INNER JOIN
Auditable a on adr.UniqueId = a.UniqueId
OPTION (LOOP JOIN)

SELECT COUNT(*)
FROM Address adr INNER JOIN
Auditable a on adr.UniqueId = a.UniqueId
OPTION (MERGE JOIN)

SELECT COUNT(*)
FROM Address adr INNER JOIN
Auditable a on adr.UniqueId = a.UniqueId
OPTION (HASH JOIN)
<小时/>

编辑:

这些解释是概念性的。 SQL Server 可能正在执行比我的示例显示的更复杂的操作。这种概念性的理解,与 SET STATISTICS 命令对时间和逻辑 IO 的测量以及查询执行计划的检查相匹配,构成了我的查询优化技术的基础(四年来的发展)。愿它为你服务,也为我服务。

设置

  • 获得 5 副牌。
  • 使用 1 副数据集并生成一个父数据集。
  • 使用其他 4 副牌并生成子数据集。
  • 按卡值对每个数据集进行排序。
  • 令 m 为父数据集中的卡片数量。
  • 令 n 为子数据集中的卡片数量。

嵌套循环

  • 从父数据集顶部取出一张卡片。
  • 在子数据集中搜索(使用二分搜索)匹配项的第一次出现。
  • 从第一个匹配项开始在子数据集中向前查找,直到找到不匹配项。您现在已找到所有匹配项。
  • 对父数据集中的每张卡片重复此操作。

嵌套循环算法迭代父数据集,然后为每个父数据集搜索一次子数据集,成本为:m * log(n)

合并

  • 从父数据集顶部取出一张卡片。
  • 从子数据集顶部取出一张卡片。
  • 如果卡片匹配,则从每副牌的顶部抽出卡片,直到找到不匹配的卡片为止。生成父匹配和子匹配之间的每个匹配对。
  • 如果卡片不匹配,请找到父卡和子卡之间较小的一张,然后从该数据集顶部取出一张卡片。

合并连接算法迭代父数据集一次和子数据集一次,成本为:m + n。它依赖于所订购的数据。如果您要求对无序数据进行合并连接,您将引发排序操作!这使得成本为 (m * log(m)) + (n * log(n)) + m + n。在某些情况下,甚至这可能比嵌套循环更好。

哈希

  • 准备一张牌 table 。
  • 从父数据集中取出每张卡片,并将其放在您可以找到的卡片 table 上(不必与卡片值(value)有任何关系,只需方便您即可)。
  • 从子数据集中取出每张卡片,在纸板 table 上找到其匹配的父卡片并生成匹配对。

哈希连接算法迭代父数据集一次和子数据集一次,成本为:m + n。它依赖于拥有足够大的卡片表来保存父数据集的全部内容。

关于sql - 这个简单的 SQL 查询可以优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2819075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com