T-SQL Where Clause Case Statement Optimization (optional parameters to StoredProc)

后端 未结 5 965
死守一世寂寞
死守一世寂寞 2021-02-05 11:19

I\'ve been battling this one for a while now. I have a stored proc that takes in 3 parameters that are used to filter. If a specific value is passed in, I want to filter on that

相关标签:
5条回答
  • 2021-02-05 11:26

    SQL 2008 and later make some improvements to optimization for things like (MyCase IS NULL OR MyCase = @MyCaseParameter) AND ....

    If you can upgrade, and if you add an OPTION (RECOMPILE) to get decent perf for all possible param combinations (this is a situation where there is no single plan that is good for all possible param combinations), you may find that this performs well.

    http://blogs.msdn.com/b/bartd/archive/2009/05/03/sometimes-the-simplest-solution-isn-t-the-best-solution-the-all-in-one-search-query.aspx

    0 讨论(0)
  • 2021-02-05 11:27

    If you pass in a null value when you want everything, then you can write your where clause as

       Where colName = IsNull(@Paramater, ColName)  
    

    This is basically same as your first method... it will work as long as the column itself is not nullable... Null values IN the column will mess it up slightly.

    The only approach to speed it up is to add an index on the column being filtered on in the Where clause. Is there one already? If not, that will result in a dramatic improvement.

    0 讨论(0)
  • 2021-02-05 11:40

    I read somewhere that the second way will short circuit and never eval the second part if true. My DBA said it forces a table scan.

    You read wrong; it will not short circuit. Your DBA is right; it will not play well with the query optimizer and likely force a table scan.

    The first option is about as good as it gets. Your options to improve things are dynamic sql or a long stored procedure with every possible combination of filter columns so you get independent query plans. You might also try using the "WITH RECOMPILE" option, but I don't think it will help you.

    0 讨论(0)
  • 2021-02-05 11:53

    if you are running SQL Server 2005 or above you can use IFs to make multiple version of the query with the proper WHERE so an index can be used. Each query plan will be placed in the query cache.

    also, here is a very comprehensive article on this topic:

    Dynamic Search Conditions in T-SQL by Erland Sommarskog

    it covers all the issues and methods of trying to write queries with multiple optional search conditions

    here is the table of contents:

      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
    0 讨论(0)
  • 2021-02-05 11:53

    No other way I can think of then doing:

    WHERE

    (MyCase IS NULL OR MyCase = @MyCaseParameter) AND ....

    The second one is more simpler and readable to ther developers if you ask me.

    0 讨论(0)
提交回复
热议问题