0

テーブル User とテーブル Order があり、100 件を超える注文をしたユーザーの名前を検索したい場合は、次のようなクエリを実行できます。

SELECT U.name
FROM User U
WHERE 100 < (
SELECT COUNT(*) FROM Orders O
WHERE O.uid=U.uid
)

相関サブクエリのため、これは低速です。

したがって、以下のように各ユーザーが行った注文数を含むビューを作成することで最適化できると思います

View UserOrderCount

uid    orderCount
0       11
1       108
2       100
3       99
4       32
5       67

次に、クエリははるかに簡単です。

SELECT U.name
FROM User U, UserOrderCount C
WHERE 100 < C.orderCount And U.uid=C.cid;

しかし、これにはさらに時間がかかることが判明しました。理由がわかりません...これについていくつかの光を当ててください、事前に感謝します!

編集:

ビューの作成方法は次のとおりです。

CREATE VIEW UserOrderCount
AS
select U.uid, count(*) AS orderCount
from User U, orders O
group by U.uid;
4

2 に答える 2

1

ビューを作成しても、これを高速化することは期待できません。同じ量の作業を舞台裏で行う必要があります。ビューはクエリのテキストを見やすくするだけです。実行が簡単になるわけではありません。(ただし、2 つの異なるクエリを使用していることに注意してください。1 つはサブクエリで、もう 1 つは結合です。これは、ビューの使用と直交しています。サブクエリでビューを使用することも、これら 2 つを一緒に使用すると、混乱が生じる可能性があります。)

9.3 の新機能であるマテリアライズド ビューを使用すると、カウントの計算結果が実際に格納されるため、実行が高速になります。しかし、これには代償として、マテリアライズド ビューを定期的に更新する必要があり、その間に古いカウントを使用することになります。

于 2013-11-05T22:30:58.013 に答える