我正在研究搜索500k +行的搜索功能。我试图让它尽可能高效,我只是想知道这两种方法中的哪一种对SQL查询更有效。
在c#应用程序中构建查询的where子句,并将其作为文本查询传递给SQL。
使用所有可能的where子句创建一个过程并检查(@var =''或COL = @var)
其他建议?
我知道最好在SQL中运行参数化查询,因为它在内存中保存了查询执行计划,这就是为什么动态创建查询似乎不是我最好的选择。
答案 0 :(得分:1)
存储过程的执行计划由sql server计算并缓存以供将来使用,从而使后续调用更快。但是,由应用程序运行的动态sql语句不会获得此优势,并且每次运行都会计算自己的执行计划,从而导致性能下降。
回答你的问题:使用存储过程更有效/更有益。
作为存储过程的额外奖励,在逻辑更改的情况下,您无需重建/重新发布应用。
编辑:如果您正在尝试构建某种特殊数据查看器应用程序,您可以找到最广泛的术语,该术语将产生一小部分结果,按该列索引( s),创建一个存储过程。然后将结果返回到您的应用层,并使用LINQ进一步按N列过滤结果。
例如,按日期索引表格。然后运行存储过程并返回按日期范围过滤的行:WHERE date BETWEEN @StartDate AND @EndDate
。然后使用LINQ过滤应用程序中的结果集。
EDIT2:另一方面,如果预期的执行次数很少(低于每分钟60次),您可以使用LINQ2SQL或实体框架并使用LINQ查询构建整个内容。
答案 1 :(得分:1)
在测试了这里推荐的几种不同方法之后,基于以下链接(由@HLGEM提供),我使用了OPTION (RECOMPILE)
的存储过程。这大大减少了查询执行时间。似乎每次重新编译查询都有助于优化特定搜索条件的查询计划。
答案 2 :(得分:0)
将参数传递给存储过程而不是在C#应用程序中创建where子句。在进行性能调整时需要考虑各种因素,例如索引,列连接等。您可能也希望看到执行计划。