sql >> データベース >  >> RDS >> Sqlserver

ORDERBY句を使用してビューを作成します

    この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を入力します。 また、並べ替えに費用がかかる場合は、それをサポートするためにインデックスを追加/変更することを検討してください。



    1. PostgreSQLでの高可用性の管理–パートIII:Patroni

    2. 単一のホストで複数のPostgreSQLインスタンスを実行する

    3. OracleSql開発者でExplainPlanを表示するにはどうすればよいですか?

    4. クエリを使用して既存のテーブルのSQL作成スクリプトを生成する