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

他にCTE内にある場合は?

    試してください:

    ;with CTE_AorB
    (
        select * from table_A WHERE (condition true)
        union all
        select * from table_B WHERE NOT (condition true)
    ),
    CTE_C as
    (
       select * from CTE_AorB // processing is removed
    )
    

    動的検索条件の鍵は、インデックスが使用されていることを確認することです。このトピックの処理方法に関する非常に包括的な記事は次のとおりです:

    Erland Sommarskog による T-SQL の動的検索条件

    複数のオプションの検索条件を使用してクエリを作成しようとするすべての問題と方法をカバーしています。この主な注意事項は、コードの重複ではなく、インデックスの使用です。クエリがインデックスの使用に失敗すると、パフォーマンスが低下します。使用できる手法がいくつかありますが、インデックスの使用が許可される場合と許可されない場合があります。

    目次はこちら:

      Introduction
          The Case Study: Searching Orders
          The Northgale Database
       Dynamic SQL
          Introduction
          Using sp_executesql
          Using the CLR
          Using EXEC()
          When Caching Is Not Really What You Want
       Static SQL
          Introduction
          x = @x OR @x IS NULL
          Using IF statements
          Umachandar's Bag of Tricks
          Using Temp Tables
          x = @x AND @x IS NOT NULL
          Handling Complex Conditions
       Hybrid Solutions – Using both Static and Dynamic SQL
          Using Views
          Using Inline Table Functions
       Conclusion
       Feedback and Acknowledgements
       Revision History

    適切なバージョンの SQL Server 2008 を使用している場合は、使用できる追加の手法があります。次を参照してください。 SQL 2008 用 T-SQL バージョンの動的検索条件 (SP1 CU5 以降)

    SQL Server 2008 の適切なリリースを使用している場合は、OPTION (RECOMPILE) を追加するだけです。 クエリに追加され、実行時のローカル変数の値が最適化に使用されます。

    これを考慮してください、OPTION (RECOMPILE) このコードを使用します (この混乱した OR ではインデックスを使用できません) s):

    WHERE
        (@search1 IS NULL or [email protected])
        AND (@search2 IS NULL or [email protected])
        AND (@search3 IS NULL or [email protected])
    

    実行時に次のように最適化します (@Search2 のみが値とともに渡された場合):

    WHERE
        [email protected]
    

    インデックスを使用できます (Column2 に定義されている場合)



    1. JDBCを使用してOracleテーブルからXMLTYPE列を抽出しようとしていますが、いくつか問題があります。

    2. mysqlデータベースの増分バックアップを作成するにはどうすればよいですか?

    3. 適切な全文索引Rails/PostgreSQL / pg_search

    4. OracleでのNLS_CHARACTERSETWE8ISO8859P1およびUTF8の問題