改进查询计划编译/缓存

时间:2010-12-07 08:40:44

标签: sql-server sql-server-2005 tsql

我有一个非常基本的位置倒置索引,其中我存储了很多单词(搜索术语),我使用它来实现高效的通用搜索。

我的问题是查询计划编译实际上比执行本身花费的时间长得多,我想知道是否可以做些什么。

  1. 我正在使用动态T-SQL(从字符串构建查询)
  2. 我使用了很多CTE
  3. 有一堆过滤器复选框依赖于填充的初始搜索结果(获取搜索结果并获取某些实体的某些属性的计数)。例如对于搜索文本找到的每个人,给我相应的组织数量和他们各自的频率(计数)。这些需要重新评估。
  4. 我已经完成了参数化(虽然它们是默认大小,但不是一些常量,应该很好吗?)并且限定所有表格,我尽可能依赖于视图。
  5. 每次应用新过滤器时,查询都会发生结构性变化,或者更改需要重新编译的搜索项数量,并且需要时间,除了查询计划工作得非常好。

    事情就是这些CTE和滤波器盒的结果几乎相同或接近相同,即使它们在结构上不相同,我想知道是否有任何可以做的事情来改善编译时间。

    如果你想看T-SQL,我可以提供样本,它只是它很大,每次搜索大约有100行T-SQL。我想我先问一下,在我们走这条路之前,或许解决方案比我认为的要简单得多?

1 个答案:

答案 0 :(得分:1)

您是否考虑过应用OPTIMIZE FOR查询提示?

如果您可以将大型查询拆分为较小的参数化存储过程并合并其结果,则它们更有可能被缓存。

还可以选择在SQL Server 2008中优化临时工作负载(尽管这可能是最后的手段):

sp_CONFIGURE 'show advanced options',1
RECONFIGURE
GO

sp_CONFIGURE ‘optimize for ad hoc workloads’,1
RECONFIGURE
GO