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

标签 sql sql-server performance

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

以下查询将在不到一秒的时间内返回“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

关于与具有几百万行的表上的 "<>"相比,SQL Server "="运算符非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7419251/

相关文章:

sql - 检查唯一性(SQL)的最佳方法是什么

c - x64 操作系统上 x32 ELF 的除法性能

c# - 在 Unity 中使用泰文设置标签时性能非常差

SQL - "Save results as CSV"- 使用逗号而不是分号

MySQL 变量错误

.net - 如何在 Entity Framework 5.0 中获取数据集作为查询结果?

mysql - 在 MySQL 中创建函数时遇到问题

.net - Entity Framework : add info to relational tables but keep EF object format

SQL 查找字符串

java - java的TreeMap的效率是基于键还是值的数量?