参数化效率与构建查询的效率

时间:2017-08-09 18:20:16

标签: c# sql sql-server

我正在研究搜索500k +行的搜索功能。我试图让它尽可能高效,我只是想知道这两种方法中的哪一种对SQL查询更有效。

  1. 在c#应用程序中构建查询的where子句,并将其作为文本查询传递给SQL。

  2. 使用所有可能的where子句创建一个过程并检查(@var =''或COL = @var)

  3. 其他建议?

  4. 我知道最好在SQL中运行参数化查询,因为它在内存中保存了查询执行计划,这就是为什么动态创建查询似乎不是我最好的选择。

3 个答案:

答案 0 :(得分:1)

存储过程的执行计划由sql server计算并缓存以供将来使用,从而使后续调用更快。但是,由应用程序运行的动态sql语句不会获得此优势,并且每次运行都会计算自己的执行计划,从而导致性能下降。

回答你的问题:使用存储过程更有效/更有益。

作为存储过程的额外奖励,在逻辑更改的情况下,您无需重建/重新发布应用。

编辑:如果您正在尝试构建某种特殊数据查看器应用程序,您可以找到最广泛的术语,该术语将产生一小部分结果,按该列索引( s),创建一个存储过程。然后将结果返回到您的应用层,并使用LINQ进一步按N列过滤结果。

例如,按日期索引表格。然后运行存储过程并返回按日期范围过滤的行:WHERE date BETWEEN @StartDate AND @EndDate。然后使用LINQ过滤应用程序中的结果集。

EDIT2:另一方面,如果预期的执行次数很少(低于每分钟60次),您可以使用LINQ2SQL或实体框架并使用LINQ查询构建整个内容。

答案 1 :(得分:1)

在测试了这里推荐的几种不同方法之后,基于以下链接(由@HLGEM提供),我使用了OPTION (RECOMPILE)的存储过程。这大大减少了查询执行时间。似乎每次重新编译查询都有助于优化特定搜索条件的查询计划。

http://sommarskog.se/dyn-search.html

答案 2 :(得分:0)

将参数传递给存储过程而不是在C#应用程序中创建where子句。在进行性能调整时需要考虑各种因素,例如索引,列连接等。您可能也希望看到执行计划。