当前位置: 首页 > 面试题库 >

与具有几百万行的表上的``=''相比,SQL Server`` <>''运算符非常慢

元胡媚
2023-03-14
问题内容

我有两张表。表单有〜77000行。日志大约有270万行。

以下查询在不到一秒钟的时间内html" target="_blank">返回“ 30198”:

SELECT COUNT(DISTINCT logs.DOCID) FROM logs, forms WHERE logs.DOCID = forms.DOCID;

到目前为止,此查询已运行了约15分钟,但尚未完成:

SELECT COUNT(DISTINCT logs.DOCID) FROM logs, forms WHERE logs.DOCID <> forms.DOCID;

为什么“不相等”查询 这么 慢?


问题答案:

因为=将连接操作从每个表减少到一个匹配行(假定这些docid是唯一的)。

这样想吧-您跳了5个男孩和5个女孩的舞蹈:

Adam      Alice
Bob       Betty
Charly    Cathy
Dick      Deb
Evan      Elly

您用第一个字母将它们配对。所以

Adam->Alice
Bob->Betty
etc...

一对配对

但是,如果您通过“首字母不匹配”将它们配对,则会得到以下结果:

Adam->Betty
Adam->Cathy
Adam->Deb
Adam->Elly
Bob->Alice
etc...

您已经大大增加了配对的数量。这就是为什么您的<>查询需要这么长时间的原因。实际上,您实际上是在尝试获取m x n行,而不是min(m,n)。使用此数据,您最终得到25行,而不是5行。对于您指定的表大小,您正在处理77,000 * 2,700,000 =
2079亿行,减去两个ID匹配的77,000,总共207,899,923,000行联接的数据集。

根据您的查询要求,尝试左连接并查找空的右侧记录:

SELECT DISTINCT logs.DOCID
FROM logs
LEFT JOIN forms ON logs.DOCID = forms.DOCID
WHERE forms.DOCID IS NULL


 类似资料:
  • 问题内容: Java是强静态转换,因此这意味着“ ===”没有用处 我看了很多文档,但没有看过相同比较运算符。 问题答案: 在弱类型语言(例如Javascript)中非常有用,因为它可以验证被比较的对象是同一类型,并避免隐式转换。 在Java之类的强类型语言中绝对没有用,因为您不能在不编写特定方法的情况下比较不同类型的变量。 例如,如果你想一个比一个的,你将不得不写一些特殊的方法,例如: 但这几乎

  • 问题内容: 我最近开始使用Google Colab,并且想训练我的第一个卷积神经网络。我进口从我的谷歌驱动器感谢图像,我得到了答案在这里。 然后,我将代码粘贴以将CNN创建到Colab中,并开始了该过程。这是完整的代码: 第1部分:设置Colab以从云端硬盘导入图片 (第1部分是从这里复制的,因为它对我来说是有效的 第1步: 第2步: 第三步: 步骤4: 步骤5: 第2部分:复制粘贴我的CNN 我

  • 问题内容: 我最近了解到,“%”符号用于计算Python中整数的余数。但是我无法确定是否还有其他运算符或方法来计算Python中的百分比。 就像使用“ /”会给您商数一样,如果仅对整数之一使用浮点数,它实际上会像传统除法一样为您提供答案。那么有没有一种方法可以计算出百分比呢? 问题答案: 在Python中没有这样的运算符,但是自己实现是很简单的。在计算实践中,百分比几乎不像模数有用,所以我认为没有

  • 问题内容: 我正在使用Python进行一些数据分析。我有两个表,第一个(叫它“ A”)有1000万行和10列,第二个(“ B”)有7300万行和2列。他们有1个具有共同ID的列,我想根据该列将两个表相交。特别是我想要表的内部联接。 我无法将表B作为pandas数据框加载到内存中,以在pandas上使用常规合并功能。我尝试通过读取表B上的文件的块,将每个块与A相交,并将这些交集连接起来(内部联接的输

  • 已定义查询的Dao: 来自Hibernate调试日志的SQL: 当我在数据库上执行这个查询时,大约需要15ms,从代码上执行大约需要1.5秒。我在代码中注释掉了这一行,滞后消失了,所以问题肯定是这个jpql选择。 数据库连接配置: 更新1: debug.log:

  • 我们将简单浏览一下运算符和它们的用法: 技巧 你可以交互地使用解释器来计算例子中给出的表达式。例如,为了测试表达式2 + 3,使用交互式的带提示符的Python解释器: >>> 2 + 3 5 >>> 3 * 5 15 >>> 表5.1 运算符与它们的用法 运算符 名称 说明 例子 + 加 两个对象相加 3 + 5得到8。'a' + 'b'得到'ab'。 - 减 得到负数或是一个数减去另一个数 -