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 と同じデータ型であるため、変換は必要ありませんが、そのデータ型が何であれ、10 進数ではうまく機能しません。

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

とにかく、それがうまくいかない場合はお知らせください。

于 2015-10-20T16:59:06.927 に答える