优化sql脚本最大化CPU

时间:2017-10-16 10:21:07

标签: sql-server database query-optimization

我有一个在SQL Statement下生成的应用程序。

select ROW_NUMBER() OVER (ORDER BY col1) SerialNo, col1, col2, col3, col4, 
col5, col6, col7, col8
from tableA where  (col3 like '%search1%' or col9 like '%search1%'or col10 
like '%search1%'or col5 like '%search1%' ) 
order by col5

最近它变得如此缓慢(表有超过600万条记录)并且它最大限度地利用了CPU。有关如何优化此查询的任何想法? "搜索1"用户按空格分割的任何字符串。"

我已经使用性能监视器进行分析,并实施了所有似乎使其恶化的建议。

2 个答案:

答案 0 :(得分:1)

Concat你的列来搜索这个concat;

where col3+col9+col10+col5 like '%search1%'

使用过滤器创建子查询,然后在该记录集的行上执行ROW_NUMBER

select ROW_NUMBER() OVER (ORDER BY col1) SerialNo, col1, col2, col3, col4, 
col5, col6, col7, col8
from (select SerialNo,col1, col2, col3, col4, 
col5, col6, col7, col8 from tableA where  col3+col9+col10+col5 like '%search1%'
) as tfiltered
order by col5

答案 1 :(得分:1)

这就是:

  1. 按顺序读取整个表记录以便查找所需记录。 (这需要更长的时间,DBMS是否尝试使用索引。)
  2. 按col1对结果行进行排序。当结果集很大时,这可能需要很长时间。
  3. 按结果行排序结果行。这可能需要很长时间。
  4. 我看到以下方法可以加快速度:

    1. 使用多个CPU,您可以在第一步强制执行并行执行。这可能会有所帮助,但是如果有多个CPU可用,SQL Server本身通常会决定在线程中运行它。我发现这篇文章的主题是:https://www.mssqltips.com/sqlservertip/4939/how-to-force-a-parallel-execution-plan-in-sql-server-2016/
    2. 投资硬件。多个CPU用于上述要点。更多内存用于排序。更快的驱动器。
    3. 限制搜索。到目前为止,用户可以通过输入's thi'来寻找'this thing'。如果将此限制为整个单词,则可以使用全文搜索。或者,如果您将此限制为某些关键词,则可以使用自己构建的查找表。 (例如,而不是寻找'%shoes%',你有表格条目所涉及的类别,而你会查找category ='shoes'。)