如何提高 SQL 查询执行性能



查询 1:

select a.*
from 
   (
   select 
row_number() over (order by id desc) as srno
id,name as myname,*
   from table
where name like 'search%' or column1 like 'search%' or column2 like 'search%'
or column3 like 'search%'
or column4 like 'search%'
or column5 like 'search%'
   ) a
where srno>=1 and srno<=50

我的桌子上有 100 000 行。此查询执行需要 48 秒。我已经应用了备用查询:

查询 2:

 select top 50
row_number() over (order by id desc) as srno
id,name as myname,*
   from table
where name like 'search%' or column1 like 'search%' or column2 like 'search%'
or column3 like 'search%'
or column4 like 'search%'
or column5 like 'search%'

查询 2 执行大约需要 0 秒有索引 全部就绪 在两种情况下都应用

有没有办法在 0 秒内执行查询 1?

我想要实时执行速度。

No.

在第二个查询中,当您有 50 条记录时,您就完成了。在第一个查询中,检查所有 100.000 条记录,然后仅检索前 50 条记录。

现在,如果您只想检查前 50 条记录,请尝试如下操作:

select a.*
from 
   (
   select 
row_number() over (order by id desc) as srno
id,name as myname,*
   from table
   ) a
where srno>=1 and srno<=5
and (a.name like 'search%'
 or a.column1 like 'search%'
 or a.column2 like 'search%'
 or a.column3 like 'search%'
 or a.column4 like 'search%'
 or a.column5 like 'search%')
我认为

没有必要在这里使用ROW_NUMBER()的分析函数。您的行可以由id标识,您可能仅将srn用于将结果限制为 50 行。因此,您可以简单地执行此操作:

SELECT TOP (50)
      id
    , name AS myname 
    , *
FROM  table
WHERE name LIKE 'search%' 
   OR column1 LIKE 'search%' 
   OR column2 LIKE 'search%'
   OR column3 LIKE 'search%'
   OR column4 LIKE 'search%'
   OR column5 LIKE 'search%'
ORDER BY id DESC

好吧,有了所有这些正则表达式和那么多行,你无能为力来改进它。我会说放一些全文搜索字段,或者清理您的输入,以便具有该类型正则表达式的所有数据都放入不同的表中。无论如何,正则表达式非常慢,如果您的表要继续增长,请不要期望很快获得太多性能。

在我看来

,在这两种情况下,您都会得到相同的结果集。

在第一个语句中,您正在搜索整个表,然后进行筛选。第二条语句在到达前 50 条记录时会停止,这是合理的,因为它更快。选择第二个。

连接列值,然后应用 LIKE 运算符来查找值。

SELECT a.* 
FROM   (SELECT Row_number() OVER (ORDER BY id DESC) AS srno, 
               id, 
               name                                 AS myname, 
               * 
        FROM   mytable) a 
WHERE  ( Isnull(a.name, '') + Isnull(a.column1, '') + Isnull(a.column2, '') + 
                  Isnull(a.column3, '') + Isnull(a.column4, '') + 
       Isnull(a.column5, '') ) LIKE 'search%' 
       AND srno >= 1 
       AND srno <= 50 

最新更新