为什么int字段上的Cint(char字段)加入比int更快?

时间:2012-01-10 22:15:27

标签: sql ms-access join query-optimization

我在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*'

3 个答案:

答案 0 :(得分:1)

您是说tblA.number是char数据类型?

我认为使用cint()会更快,因为您将字符串转换为数字,然后与tblB.B列进行数字比较。

我无法想象有人会感到惊讶的是,比较字符串(逐字符出现)会运行任何接近比较两个数字的东西。

在第一个例子中,因为数据类型不匹配,所以第一个tblA.number是一个字符串,因此它很可能将tblB.B列转换为用于该比较的字符串。

因此,将数字转换为字符串可能会更慢(需要为字符串空间分配更多内存,然后在丢弃字符串时存在垃圾收集问题)。因此,不仅创建字符串需要花费时间,而且更糟糕的是进行字符串比较会更慢。

使用cint()将字符串转换(强制转换)为一个数字(可能更快,然后转换为字符串),然后进行数字比较(这肯定比字符串比较更快)。

所以我不能肯定上述原因,但肯定不会让人感到惊讶。如上所述,使用ShowPlan可能会在这里产生更多信息。

答案 1 :(得分:0)

这不是正常情况......除非只有文本字段的索引。

答案 2 :(得分:0)

浮现在脑海中的一些可能性:

  • 可能是第二个查询中的文本字段或表达式会导致查询优化器选择不同且更合适的连接策略。
  • 也许查询优化器能够以某种方式检测到你的所有数字在第二种情况下非常小,导致它使用比int更小的数据类型,从而导致更快的读取。
  • 可能在那里有文本字段会导致数据在页面中以不同方式对齐,从而导致更好的读取和缓存性能。
  • 也许有一些背景活动会在一次测试中以非常消极的方式影响您的测试机器

不幸的是,查询规划和优化中有很多因素。有时候只是不可能理解为什么它会以它的方式发生。