T-SQL子句语句优化(StoredProc的可选参数)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

我有一个存储的proc,它接受用于筛选的3个参数。如果传入特定值,我希望对此进行筛选。如果-1通过了,把所有的都给我。

我尝试了以下两种方法:

第一种:

SELECT field1, field2...etc  
FROM my_view  
WHERE  
parm1 = CASE WHEN @PARM1= -1 THEN parm1  ELSE @PARM1 END  
AND parm2 = CASE WHEN @PARM2 = -1 THEN parm2  ELSE @PARM2 END  
AND parm3 = CASE WHEN @PARM3 = -1 THEN parm3  ELSE @PARM3 END

第二种:

SELECT field1, field2...etc  
FROM my_view  
WHERE  
(@PARM1 = -1 OR parm1 = @PARM1)  
AND (@PARM2 = -1 OR parm2 = @PARM2)  
AND (@PARM3 = -1 OR parm3 = @PARM3)  

我在某个地方读到,第二条路会短路,如果是真的,永远也不会评估第二部分。我的DBA说它会强制进行表格扫描。我还没有证实这一点,但在某些情况下,它的运行速度似乎要慢一些。

该视图从中选择的主表大约有150万条记录,视图将继续连接到大约15个其他表上,以收集其他一组信息。

提问于
用户回答回答于

它不会很好地处理查询优化器,可能会强制进行表扫描。

第一种选择是尽可能好。您的改进选项是动态SQL或长存储过程,其中包含各种可能的筛选列组合,因此您可以获得独立的查询计划。您也可以尝试使用“WITH重新编译”选项,但我认为它不会对您有所帮助。

用户回答回答于

如果您正在运行SQLServer 2005或更高版本,则可以使用IFS生成多个版本的查询,并在适当的位置使用索引。每个查询计划都将放在查询缓存中。

它涵盖了尝试使用多个可选搜索条件编写查询的所有问题和方法。

这是目录:

  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

扫码关注云+社区