变量

时间:2015-10-20 14:37:05

标签: sql native-sql

我是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...

1 个答案:

答案 0 :(得分:0)

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

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

所以这里有一种方法来测试问题是否运行以下查询(假设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...

无论如何,请告诉我这是否对您不起作用。