このORDER BY
についてどう思うかわかりません 達成していますか?たとえあなたがするとしても ORDER BY
を置く 法的な方法でビューに表示されます(例:TOP
を追加する 句)、ビューから選択した場合、例: SELECT * FROM dbo.TopUsersTest;
ORDER BY
なし 句を使用すると、SQL Serverは最も効率的な方法で行を自由に返すことができますが、これは必ずしも期待する順序と一致するとは限りません。これは、ORDER BY
が原因です。 結果を並べ替える目的と、TOP
に含める行を指定する目的の2つを提供しようとするため、オーバーロードされます。 。この場合、TOP
常に勝ちます(データをスキャンするために選択したインデックスによっては、注文が期待どおりに機能していることがわかる場合がありますが、これは単なる偶然です)。
目的を達成するには、ORDER BY
を追加する必要があります ビュー自体のコードではなく、ビューからデータをプルするクエリに対する句。
したがって、ビューコードは次のようになります。
CREATE VIEW [dbo].[TopUsersTest]
AS
SELECT
u.[DisplayName], SUM(a.AnswerMark) AS Marks
FROM
dbo.Users_Questions AS uq
INNER JOIN [dbo].[Users] AS u
ON u.[UserID] = us.[UserID]
INNER JOIN [dbo].[Answers] AS a
ON a.[AnswerID] = uq.[AnswerID]
GROUP BY u.[DisplayName];
ORDER BY
意味がないので、含めるべきではありません。
説明のために、AdventureWorks2012を使用して、次の例を示します。
CREATE VIEW dbo.SillyView
AS
SELECT TOP 100 PERCENT
SalesOrderID, OrderDate, CustomerID , AccountNumber, TotalDue
FROM Sales.SalesOrderHeader
ORDER BY CustomerID;
GO
SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue
FROM dbo.SillyView;
結果:
SalesOrderID OrderDate CustomerID AccountNumber TotalDue
------------ ---------- ---------- -------------- ----------
43659 2005-07-01 29825 10-4020-000676 23153.2339
43660 2005-07-01 29672 10-4020-000117 1457.3288
43661 2005-07-01 29734 10-4020-000442 36865.8012
43662 2005-07-01 29994 10-4020-000227 32474.9324
43663 2005-07-01 29565 10-4020-000510 472.3108
そして、実行プランから、TOP
およびORDER BY
SQL Serverによって完全に無視され、最適化されています:
TOP
はありません 演算子はまったくなく、並べ替えはありません。 SQLServerはそれらを完全に最適化しました。
ここで、ビューを変更してORDER BY SalesID
と言うと 、その後、ビューが示す順序を取得するだけですが、前述のように、偶然の一致のみです。
ただし、外部クエリを変更してORDER BY
を実行する場合 あなたが欲しかった:
SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue
FROM dbo.SillyView
ORDER BY CustomerID;
結果は希望どおりに並べ替えられます:
SalesOrderID OrderDate CustomerID AccountNumber TotalDue
------------ ---------- ---------- -------------- ----------
43793 2005-07-22 11000 10-4030-011000 3756.989
51522 2007-07-22 11000 10-4030-011000 2587.8769
57418 2007-11-04 11000 10-4030-011000 2770.2682
51493 2007-07-20 11001 10-4030-011001 2674.0227
43767 2005-07-18 11001 10-4030-011001 3729.364
そして、計画はまだTOP
を最適化しています / ORDER BY
ビューに表示されますが、CustomerID
で並べ替えられた結果を表示するために、並べ替えが追加されます(少額の費用はかかりません)。 :
したがって、話の教訓として、ORDERBYをビューに入れないでください。それらを参照するクエリにORDERBYを入力します。 また、並べ替えに費用がかかる場合は、それをサポートするためにインデックスを追加/変更することを検討してください。