我是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...
答案 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...
无论如何,请告诉我这是否对您不起作用。