表上有几百万行``=''相比,SQL Server`` <>'';操作
技术问答
228 人阅读
|
0 人回复
|
2023-09-14
|
我有两张表。表格有77000行。日志大约有270万行。
* Q* f6 O9 e, E0 A6 n以下查询在不到一秒钟内返回 30198:
5 Y: h; R+ g( V. [# L0 Q3 t# ?SELECT COUNT(DISTINCT logs.DOCID) FROM logs,forms WHERE logs.DOCID = forms.DOCID;到目前为止,此查询已运行约15分钟,但尚未完成:2 |1 |- F5 ]3 b$ n* y: y
SELECT COUNT(DISTINCT logs.DOCID) FROM logs,forms WHERE logs.DOCID forms.DOCID;为什么不相等查询 这么 慢?' E7 K6 S" D) w. G
9 ~5 J g; y% D5 U) d0 l; x2 U9 e5 m 解决方案:
8 T) @( j# \: Z/ S$ T2 @2 X) S 因为=将连接操作从每个表减少到匹配行(假设这些)docid是唯一的)。
. k/ [4 V d- @( x* a这样想吧-你跳了五个男孩和五个女孩的舞蹈:1 q8 o- {% ]) w! ~
Adam AliceBob BettyCharly CathyDick DebEvan Elly你用第一个字母匹配它们。
2 B; j& b& J5 c, ~Adam->AliceBob->Bettyetc...一对配对! Y! H% m. `( U- ^# y
但是,如果你通过首字母不匹配来匹配它们,你会得到以下结果:1 _" N% F: n- e+ A4 C
Adam->BettyAdam->CathyAdam->DebAdam->EllyBob->Aliceetc...你已经大大增加了配对的数量。这就是为什么你的查询需要这么长时间。事实上,你实际上是在试图获得它m xn行,而不是min(m,n)。使用这些数据,你最终会得到25行,而不是5行。您正在处理77000 表的大小* 2,700,000 =$ X9 e9 L- _0 u0 B9 i0 C' k/ o9 m
减去2079亿行ID总共有207、899、923、000行数据集。$ Z: E, z2 g% T" _* A
根据您的查询要求,尝试左连接并查找空的右侧记录:+ T4 P! z( q0 d, L
SELECT DISTINCT logs.DOCIDFROM logsLEFT JOIN forms ON logs.DOCID = forms.DOCIDWHERE forms.DOCID IS NULL |
|
|
|
|
|