0

我是 SQL 新手,正在尝试查询大型数据库,因此速度是个问题。我一直在使用如下所示形式的查询(第1行),它工作正常,但是当我修改它(将第1行切换为第2行)以使用常量进行剪切而不是在其中派生的值查询本身然后查询明显变慢(1的运行时间~1秒,2是几分钟)。我实际上预计它会更快。有人可以解释为什么会发生这种情况或建议我如何更好地重写此查询吗?

谢谢

询问

with local_sample as 

( SELECT b.mass, ...various other columns selected... 

FROM table1 TAB, table2 b 

WHERE ...a few clauses... )


SELECT min(prog.num), LTAB.mass, ...various other columns...

from local_sample LTAB, table2 prog

WHERE ...a few clauses... 

[**1**] and prog.mass > LTAB.mass/2.0

[**2**] and prog.mass > 31.62

group by ...columns...
4

1 回答 1

0

问题中的信息有点稀缺,所以猜测,这是一个隐含的转换问题。我的预感是 LTAB.mass 是与 prog.mass 相同的数据类型,因此不需要转换,但无论该数据类型是什么,都不能很好地与小数一起使用。

sql 中的数字有多种形式,大多数时候我们不必考虑它,因为转换非常快并且发生在后台。不过,有时您会遇到与其他格式不兼容的数字类型格式(例如浮点数),这可能会成为性能痛点。

因此,这是一种测试问题是否存在的方法,请运行以下查询(假设 Microsoft SQL Server 是您的 RDBMS):

select SQL_VARIANT_PROPERTY(Mass,'BaseType') AS 'Base Type'
From table2

如果我的预感是正确的,它将返回 float 作为基本类型。如果是这种情况并且隐式转换是问题,那么下面应该以与查询 1 类似的方式工作:

with local_sample as 
( SELECT b.mass, ...various other columns selected... 
FROM table1 TAB, table2 b 
WHERE ...a few clauses... )

Declare @Mass float = 31.62

SELECT min(prog.num), LTAB.mass, ...various other columns...
from local_sample LTAB, table2 prog
WHERE ...a few clauses... 
and prog.mass > @Mass
group by ...columns...

无论如何,如果这对你不起作用,请告诉我。

于 2015-10-20T16:59:06.927 回答