我在microsoft访问中运行以下2个查询产生相同的结果,但第二个查询在大约5秒内运行,而第一个查询大约需要10分钟。我完全迷失在这里。第一个查询在另一个整数字段上连接一个整数字段,第二个查询将一个cint(text)
字段连接到一个整数字段上,并且运行速度更快。
在10分钟内运行:
我设置了tblA.number =整数字段
SELECT A, B, sum(d) as C
FROM tblA
INNER JOIN (tblB INNER JOIN tblC ON tblB.A = tblC.A)
ON tblA.number = tbl B.B)
GROUP BY A, B
HAVING F like '*808*'
在5秒内运行: - 注意cint(tblA.A)
I set tblA.number = text field
SELECT A, B, sum(d) as C
FROM tblA
INNER JOIN (tblB INNER JOIN tblC ON tblB.A = tblC.A)
ON cint(tblA.number) = tbl B.B)
GROUP BY A, B
HAVING F like '*808*'
答案 0 :(得分:1)
您是说tblA.number是char数据类型?
我认为使用cint()会更快,因为您将字符串转换为数字,然后与tblB.B列进行数字比较。
我无法想象有人会感到惊讶的是,比较字符串(逐字符出现)会运行任何接近比较两个数字的东西。
在第一个例子中,因为数据类型不匹配,所以第一个tblA.number是一个字符串,因此它很可能将tblB.B列转换为用于该比较的字符串。
因此,将数字转换为字符串可能会更慢(需要为字符串空间分配更多内存,然后在丢弃字符串时存在垃圾收集问题)。因此,不仅创建字符串需要花费时间,而且更糟糕的是进行字符串比较会更慢。
使用cint()将字符串转换(强制转换)为一个数字(可能更快,然后转换为字符串),然后进行数字比较(这肯定比字符串比较更快)。
所以我不能肯定上述原因,但肯定不会让人感到惊讶。如上所述,使用ShowPlan可能会在这里产生更多信息。
答案 1 :(得分:0)
这不是正常情况......除非只有文本字段的索引。
答案 2 :(得分:0)
浮现在脑海中的一些可能性:
不幸的是,查询规划和优化中有很多因素。有时候只是不可能理解为什么它会以它的方式发生。