- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到一些奇怪的行为:
运行此查询:
SELECT TOP 5000 t1.f1,t1.f2,t1.f3
FROM t1
JOIN t2 on t1.f1 = t2.f1
WHERE t2.f1 IS NOT NULL AND (t1.f5 != t2.f3)
2 秒内生成 3447 行结果。
运行这个:
SELECT t1.f1,t1.f2,t1.f3
FROM t1
JOIN t2 on t1.f1 = t2.f1
WHERE t2.f1 IS NOT NULL AND (t1.f5 != t2.f3)
永远运行,直到我停止它(至少 120 分钟!!)。
表 t1
和 t2
保存大约 500k 条记录。
我一直认为如果总行数低于该数字,TOP
语句并不重要,但是,似乎存在非常显着的差异。这是正常现象(如果是,为什么)还是只是侥幸?
编辑:
根据要求:
t1:
CREATE TABLE [dbo].[t1](
[f1] [int] NOT NULL,
[f2] [varchar](10) NULL,
[f3] [varchar](4) NULL,
[f4] [int] NOT NULL,
[f5] [varchar](max) NULL,
CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED
(
[f1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
f2:
CREATE TABLE [dbo].[t2](
[f1] [nchar](10) NOT NULL,
[f2] [nchar](10) NOT NULL,
[f3] [varchar](max) NOT NULL,
[f4] [nchar](10) NULL,
[f5] [date] NULL,
[f6] [date] NULL,
[f7] [nchar](1) NULL,
CONSTRAINT [PK_t2] PRIMARY KEY CLUSTERED
(
[f1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
执行计划:
带顶部:
没有顶部:
看到这一点,我不得不得出结论,排序
(为什么这样做??)导致了延迟......你同意吗?
编辑2:根据要求,执行计划带有循环选项,没有顶部:
最佳答案
问题在于,您的两个表 [t1] 和 [t2] 对于 JOIN 列 f1
具有完全不同(且很大程度上不兼容)的数据类型。
这使得查询优化器无法准确估计这两个 500,000 行表之间将匹配的行数。它似乎使用了默认的“猜测”,在本例中是对实际数字 (3477) 的粗略估计。因此,当您不使用 TOP 时,它认为对行进行排序然后合并 (O(NLogN)) 比执行嵌套循环 (O(N^2)) 更有效,因为它确实没有意识到(合并)JOIN 实际上会消除几乎所有的行。
当你打开 TOP 5000 时,它会意识到嵌套循环更好,因为它会在不超过 5000 时被切断(远小于 500k^2,甚至小于 500k * Log(500k) ) 。但与嵌套循环不同的是,合并排序不能增量完成,它必须首先对所有行进行排序。因此,在 5000 处切断输出根本不会为您节省太多,因此嵌套循环显然是更好的选择(即使 JOIN 估计不好)。
<小时/>这里的根本问题是列 T2.f1 是一个 NCHAR(10),对于看起来应该包含整数的内容来说,这是一个非常糟糕的选择。最好的解决方案是将该列的数据类型更改为 INT。
如果由于某种原因你不能这样做,那么根据你的 SQL Server 版本,你可以通过添加一个持久计算列来结束运行,该计算列计算 [f1] 的 INT 转换值,然后抛出一个兼容的索引那个。对于这样的查询,这将允许索引和统计再次工作。
作为最后的手段,您还可以使用查询提示。我通常不推荐它们,因为它们往往是权宜之计,会在以后引起问题。但是,如果您认为这是唯一的选择,那么在查询末尾添加 OPTION (FAST 1000)
可能会起作用。
关于SQL TOP 5000 比结果行数少于 5000 的普通查询快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238682/
关于我需要什么和我目前拥有什么的简短介绍 我连接到一个数据库并从中获取我的数据,然后我得到 ( Name , LongNumber) 并且基本上我有一个事件( Action )在事件发生时触发(这个
有人可以帮我分解一下吗?为什么不能用两次乘法来完成? 复数的乘法 如果计算所需的乘法次数被视为其难度的衡量标准,并且这些计算是使用复数执行的,那么很自然地会问需要多少次实数乘法才能实现评估复杂产品的实
使用 PHP 的 preg_match() 函数,我将如何匹配 2 到 5 个字符之间的单词?在这种情况下,字母保证是大写的 A-Z,并且每个 $word 变量中只有一个单词。 它必须拒绝一个 6 个
想知道是否可以在 SQL 中选择多于/少于 x 个字符的内容。 例如,我有一个员工表,我想显示姓名中包含超过 4 个字符的所有员工姓名。 这是一个示例表 ID EmpName Dept 1 John
我需要选择相同 order_ID 的所有值,其中第一个日期和最后一个日期之间的差异等于或小于 7,但我不知道我应该怎么做,可以吗给我一些帮助,我应该怎么做? 数据库布局: +-------------
我有“名称”JavaScript 变量。如果变量“名称”包含少于 4 个字符,我想执行行:msg('name','Your name must contain minimum 4 characters
我最大限度地简化了代码以使其可读。我没有对 Bootstrap 文件夹进行任何更改。所以这是“简化的”HTML 页面: 3
我已经为我的网站实现了 PayPal 延迟链接支付,但我只需要延迟 3 天,而不是默认的 90 天。有人可以告诉我是否可以修改 PHP 脚本以指示 3 天,如果可以,请告诉我我在代码中的何处进行了此指
我想在不到 1 毫秒的时间内调用线程休眠。我读到 thread.Sleep 和 Windows 操作系统都不支持它。 解决方案是什么? 对于所有想知道我为什么需要这个的人:我正在进行压力测试,想知道我
我有一个 html 文档,当 URL 长度小于 30 个字符时,我想隐藏其中的一些 id(在本例中为 id="test")。 var test = document.getElementById('t
所以,我创建了一个带有缩略图导航的 slider ,但是当它的幻灯片少于 5 个时,问题就开始出现了。 它不是只显示它应该显示的幻灯片,而是重复幻灯片以填充容器高度,并且垂直缩略图不会在单击时更改幻灯
我希望能够隐藏少于 3 个字符的列表项,我该怎么做?我下面的代码有什么问题? 我是 JavaScript/jQuery 新手。 jQuery().ready(function () { if
常识说,对于足够小的数组,插入排序是最好的。例如,Timsort对最多 64 个元素的数组使用(二进制)插入排序;来自 Wikipedia : Some divide-and-conquer algo
我从 Javascript 对象动态地将数据添加到表中。我有一个代码最终是这样的: 1 1 2 3 1 2 即使 tds 不存在,我也希望每一行都有表格边框。所以基本上对于代码中的示例
vs2005支持::stdext::hash_map::std::map. 然而,在我的测试中,::stdext::hash_map 的插入和删除 OP 似乎比::std::map 慢。(少于 100
我正在尝试使用 ViewPager 组件实现无限轮播。我基于 Antonyt 创建的那个但是使用少于 4 个 View 会出现问题。由于 View 已经到位。必须是一种欺骗 Viewpager 在不同
在这篇关于 falsehoods programmers believe about time 的有趣文章中,其中之一是 Thread.sleep(1000) sleeps for >= 1000 m
我需要编写模拟真实用户交互的加特林场景。它应该偶尔发出一些请求,例如每个用户每小时 10 个(总共 20 个用户)。 根据我在文档中看到的,constantUsersPerSec接受 double ,
我正在尝试使用只有 7 列的网格创建日历。我想让这 7 列均匀分布并适合整行。目前,7 列加起来不等于 12,我得到 12 列,其中 5 列是空的。 Bootstrap 3 中是否有办法让所有 7 个
我有一个 170k 行的 .txt 文件。我正在将 txt 文件导入 Pandas 。 每行都有许多用逗号分隔的值。 我想提取具有 9 个值的行。 我目前正在使用: data = pd.read_cs
我是一名优秀的程序员,十分优秀!