2

このSQLクエリにはパフォーマンスの低下がありますか?

フルネームを選択し、((名前+'' +姓)をフルネームとして選択し、mytableからアドレスを選択)からタブとして

と比べて:

mytableからフルネーム、アドレスとして(name +'' + lastname)を選択します

多分あなたは思うかもしれません..なぜ私がこれをしたいのか、理由はSQLServerがgroupbyでエイリアスを使用することを許可していないので、サブクエリを使用してこれを行うことができます

select fullname、address from(select(name +'' + lastname)as fullname、address from mytable)as tab group by fullname

それ以外の

(name +'' + lastname)as fullname、address by mytable group by name +'' + lastname

これは単なる例であり、エイリアスは基本的な連結のエイリアスですが、何かの連結はより複雑であり、グループ句に書き直すのは本当に醜いです。

4

3 に答える 3

3

サブクエリ自体がパフォーマンスの問題を引き起こす可能性はほとんどありません。クエリ プランナーはおそらくクエリを再配置して、最終的にサブクエリにならないようにします。パフォーマンス プランを見ると、クエリに実際に何が起こっているかがわかります。

パフォーマンスの問題となる可能性があるのは、計算された値に基づいてグループ化していることです。つまり、データベースはグループ化にインデックスを使用できないため、すべての値を作成してから並べ替える必要があります。

可能であれば、計算で使用される値をグループ化する必要があります。たとえば、次のようになります。

select name + ' ' + lastname as fullname
from mytable
group by name, lastname
于 2013-01-29T13:48:59.223 に答える
0

あなたの質問を完全に理解しているかどうかはわかりませんが、一般的に、サブクエリはパフォーマンスに悪影響を与えるため、避ける必要があります。CONCAT構文を使用しないのはなぜですか?

select CONCAT(name, ' ', lastname) as fullname, address from mytable group by CONCAT(name, ' ', lastname);

状況と複雑さによっては、GROUP_CONCATも確認する必要がある場合があります。

于 2013-01-29T13:47:43.593 に答える
0

パフォーマンスを向上させるための 1 つのオプションとして、Persisted キーワードを fullname として名前を付けた計算列を作成することがあります。

ALTER TABLE dbo.[yourtable] ADD
fullname AS (firstname+' '+lastname) PERSISTED
GO
--instead of SELECT firstname + ' ' + lastname, address FROM dbo.[yourtable]     
SELECT fullname, address 
FROM dbo.[yourtable]
于 2013-01-29T14:09:43.157 に答える