SQL Server 连接后行数低估

2024-02-06

当实际行数为 2000 时,查询优化器估计联接结果只有一行。这导致数据集上的后续联接的估计结果只有一行,而其中一些联接的结果却高达 2000 30,000。

计数为 1 时,QO 正在为许多连接选择循环连接/索引查找策略,这太慢了。我通过限制可能的加入策略来解决这个问题WITH OPTION (HASH JOIN, MERGE JOIN),这将整体执行时间从 60 多分钟缩短到 12 秒。然而,我认为由于行数错误,QO 仍然生成了一个不太理想的计划。我不想手动指定连接顺序和详细信息——受此影响的查询太多,因此不值得。

这是 Microsoft SQL Server 2000 中的一个中等查询,其中多个表选择连接到主选择。

我认为 QO 可能高估了联接中多方的基数,期望表之间的联接列具有更少的公共行。

在连接之前扫描索引的估计行数是准确的,只是某些连接之后的估计行数太低了。

数据库中所有表的统计信息都是最新的并自动刷新。

早期的不良联接之一是在一个通用“Person”表(用于所有人共有的信息)和一个专门的人员表(所有这些人中大约 5% 属于该表)之间。两个表(以及连接列)中的聚簇 PK 都是 INT。该数据库是高度规范化的。

我认为根本问题是某些连接后行数估计错误,所以我的主要问题是:

  • 如何修复 QO 的连接后行计数估计?
  • 有没有一种方法可以暗示连接将有很多行,而无需手动指定整个连接顺序?

尽管统计数据是最新的,但扫描百分比还不够高,无法提供准确的信息。我在每个有问题的基表上运行了这个,通过扫描所有行(而不仅仅是默认百分比)来更新表上的所有统计信息。

UPDATE STATISTICS <table> WITH FULLSCAN, ALL

该查询仍然有很多循环连接,但连接顺序不同,并且运行时间为 2-3 秒。

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

SQL Server 连接后行数低估 的相关文章

  • 在单个 mongodb 查询中查找并计数

    我的文档看起来像这样 id ObjectId 572c4bffd073dd581edae045 name What s New in PHP 7 description PHP 7 is the first new major versio
  • 当我使用可变参数而不是常量参数时,为什么我的内联表 UDF 慢得多?

    我有一个表值内联 UDF 我想过滤该 UDF 的结果以获得一个特定值 当我使用常量参数指定过滤器时 一切都很好 并且性能几乎是瞬时的 当我使用可变参数指定过滤器时 它会花费明显更大的时间块 大约是逻辑读取的 500 倍和持续时间的 20 倍
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe
  • SQL Server 2012:有条件地增加计数器用户 ROW_NUMBER()

    我正在尝试申请ROW NUMBER 根据特定条件增加计数器 我的数据如下所示 目标计数器是Prep column id DSR PrepIndicator Prep 1662835 1 1 1 1662835 14 2 2 1662835
  • 如何使用 SQL 通过表示多级订单的 varchar 字段正确排序?

    我不太喜欢数据库 我发现在查询上出现以下问题SQL服务器数据库旧的遗留应用程序的 我声明不幸的是我无法更改数据库结构 字段类型 这非常难看 我有以下情况 SELECT Sottocategoria IdSottocategoria IdCa
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 使用 APDU 命令的有效 NFC 读取比特率是多少?

    我目前正在使用 Android IsoDep trancieve 函数发送和接收累计 1628 字节的数据 该函数分布在 35 个 APDU 命令 选择应用程序 身份验证 读取 中 字节计数包括返回的 MAC 校验和以及由 transcie
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • 从字符串中删除某些字符

    我正在尝试删除某些字符 目前我的输出如下cityname district但我想删除cityname SELECT Ort FROM dbo tblOrtsteileGeo WHERE GKZ 06440004 Output B dinge
  • 当从属文本框中没有输入文本时,如何让 gridview 显示所有表格行?

    下面的代码可以正常工作 并根据文本框中输入的文本过滤我的网格视图 当我的文本框中没有输入任何文本时 我没有得到任何结果 并且无法理解为什么 我的问题 如何让gridview显示all当文本框中没有输入文本时表行 MSSQL Search n
  • 如何删除 Sql Server 2005 中存在的临时 SP

    我的问题很简单 如何删除临时存储过程 如果存在 这是因为当我在脚本中创建临时 SP 时 它会在第二次运行时抛出类似 数据库中已存在名为 sp name 的对象 的错误 我不想向用户显示此消息 请帮我 您的解决方案受到高度赞赏 临时进程的删除
  • 使用 FileInputStream 时如何确定理想的缓冲区大小?

    我有一个从文件创建 MessageDigest 哈希 的方法 我需要对很多文件 gt 100 000 执行此操作 用于读取文件的缓冲区应该设置多大才能最大限度地提高性能 大多数人都熟悉基本代码 为了以防万一 我将在这里重复一遍 Messag
  • 在 C# 中执行基于存储过程的查询后,如何重新使用 CommandText 的 SqlCommand 对象?

    我有一个示例代码 aCommand CommandType CommandType StoredProcedure aCommand Parameters AddWithValue book id bookID aCommand Param
  • 获取在任何日期创建的表的列表?

    我遇到了这样的情况 我想查找我在 2012 年 9 月 14 日 2012 年 9 月 14 日 在 sql server 上创建的表 是否有任何查询会列出在此日期创建的这些表 SELECT FROM sys tables WHERE cr
  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private

随机推荐

  • System.UnauthorizedAccessException:创建 COM 组件的实例失败,并出现错误 80070005 (C#)

    我在使用 C NET 命令行应用程序时遇到问题 其主要思想是使用 COM 对象从其他程序获取数据 当手动执行或作为 Node js 服务器内的子进程运行时 它工作正常 但是当整个项目作为 Windows 服务安装时 C 应用程序会响应以下错
  • 如何在单独的文件中创建命名查询

    我需要将所有命名查询保存在一个单独的文件中 例如 javax persistence NamedQueries NamedQuery name Employee findAll query SELECT e FROM Employee e
  • web.config 中与 targetFramework 相关的配置错误

    我在 Visual Studio 2015 中制作了一个 MVC 网站 它可以在我的本地主机上运行 但是当我发布我的网站并放入我的主机时 它不起作用 它给了我这个错误通知 应用程序中的服务器错误 配置错误 解析器错误消息 targetFra
  • FFmpeg 使用 URL 进行文件转换

    我需要将 MP4 转换为 AVI MP4 视频上传到 Windows Azure Blob 存储中 并且存储可公开访问 当我们编写 ffmpeg 命令行时我的问题 我可以提供 Blob 存储中视频的 URL吗 ffmpeg ihttps a
  • 用于重试同一请求的 HTTP 状态码

    是否有 HTTP 状态代码来指示客户端再次执行相同的请求 我面临着服务器在处理请求时必须 等待 锁消失的情况 但当锁消失时 请求可能会接近其超时限制 因此 一旦锁定清除 我想指示客户端再次执行相同的请求 我想出的最好的办法是使用 HTTP
  • Angular 将特定数据检索到 $scope 变量中不起作用

    我这里初始化 scope statuses 然后 如果我只是将 http get 中的数据设置为 scope 变量 那么 有效 但我需要对其进行更多过滤 scope statuses result data Devices console
  • 如何在c99中使用ftruncate而不发出警告

    我想在我的代码中使用 ftruncate 函数 我必须使用选项 std c99 进行编译 我收到警告 In function test warning implicit declaration of function ftruncate W
  • 将 gtfs 实时数据流式传输为人类可读的格式

    我正在尝试使用 Java 下载可读的 gtfs 实时数据 协议缓冲区格式 以便我可以在文本文件中查看它 我尝试了几种方法 方法 1 URL url new URL uri byte buffer new byte 4096 InputStr
  • JavaScript 评估问题

    var x 5 function f y return x y 2 function g h var x 7 return h x var x 10 z g f 我正在解决课堂上教科书上的一些问题 为下一次考试做准备 但无法弄清楚上述内容如
  • Pandas 对条形图进行分组和重采样:

    我有一个数据框 以高时间频率 为了计算平均浓度 我必须对每日和每月数据应用质量控制过滤器 我的方法是首先应用过滤器并每年重新采样 然后按位置和年份进行分组 另外 在所有位置 在标题为 位置 的列中 中 我只需选择几行 因此 我对原始数据框进
  • SMIL(同步多媒体集成语言)的未来?

    SMIL 同步多媒体集成语言 最后一次更新是在2008年 有谁知道在同步多媒体文件时是否有更好的协议可以遵循 SMIL 没有天然的竞争对手 因此任何其他解决方案都将依赖于脚本 它支持 ePub 阅读器 例如Azardi http azard
  • 为什么删除不是 Subversion 的基本功能?

    几年来 我一直在等待 Subversion 提供 永久删除 消除 功能 我犹豫是否要过渡到 Subversion 来自 Visual SourceSafe p 因为我认为这是一个基本功能 否则我会期望存储库会不可阻挡地增长 然而 由于某种原
  • 阻塞读和非阻塞读有什么区别?

    在上述问题中添加等待 不等待指示器的概念作为 TCP IP 或 UDP 环境中 ReadMessage 函数的参数 第三方功能描述指出 此函数用于从先前的 registerforinput 调用定义的队列中读取消息 输入等待 不等待指示器将
  • Pandas - 计算相对于最早值的每日差异

    这可能很容易 但由于某种原因 我发现它很难完成 任何提示将非常感谢 我有一些每天 5 分钟间隔的时间序列数据 唉 Date Values 2012 12 05 09 30 00 5 2012 12 05 09 35 00 7 2012 12
  • 在同一行文本上对齐不同的字体大小以便看起来不错?

    基本上 我希望在同一行上有一个 h1 和一个 p 元素 但是对齐方式偏离了很多 意味着 H1 高于 P 并且看起来很糟糕 并且我之前从未使用 css 做过这样的事情 我已经整理了一个 jsfiddle 来配合它 这里是代码 h1 style
  • ASP.NET MVC3 Razor - 如何有条件地退出或结束或返回或中断部分视图?

    使用 Razor 如何有条件地退出或结束或返回或中断部分视图 if Model null return 不 你不return在视图中 您只需不在主视图中包含此类部分即可 if Model null Html Partial somePart
  • Python CFFI 的内存管理和析构函数/free() 约定?

    如果我包装一个 C 类 from ffi import ffi lib class MyClass object def init self self c class lib MyClass create 确保的最佳实践是什么lib MyC
  • 我可以获得 HTMLElement DOM 对象的完整 HTML 表示形式吗?

    我正在使用 jquery 来解析一些 HTML 例如 html contents each function var element this tagName 我可以使用 DOM 或更友好的 jQuery 函数访问 tagName 子项 父
  • 迭代数组的每个元素(第一个元素除外)

    编写此代码的惯用 Ruby 方式是什么 给定一个数组 我想迭代该数组的每个元素 但跳过第一个元素 我想在不分配新数组的情况下执行此操作 这是我想出的两种方法 但都不是特别优雅 这可行 但似乎太冗长了 arr each with index
  • SQL Server 连接后行数低估

    当实际行数为 2000 时 查询优化器估计联接结果只有一行 这导致数据集上的后续联接的估计结果只有一行 而其中一些联接的结果却高达 2000 30 000 计数为 1 时 QO 正在为许多连接选择循环连接 索引查找策略 这太慢了 我通过限制