如何提高SQL查询执行性能?

时间:2012-05-11 12:31:36

标签: 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

我桌上有10万行。此查询执行需要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?

我想要实时执行速度。

5 个答案:

答案 0 :(得分:1)

没有

在第二个查询中,当您有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%')

答案 1 :(得分:1)

我认为不需要在此处使用分析函数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

答案 2 :(得分:0)

对于所有这些正则表达式和那么多行,你没有太多可以做的改进。 我会说放一些全文搜索字段或者可能会清理你的输入,所以这种类型的正则表达式的所有数据都会进入另一个表。无论如何,如果你的桌子要继续增长,那么正则表达式会非常缓慢。不会期待很快就会有很多表现。

答案 3 :(得分:0)

在我看来,你在两种情况下都得到了相同的结果集。

在第一个语句中,您将搜索整个表,然后进行过滤。第二个语句在到达前50个记录时停止,这是合理的,它更快。去第二个。

答案 4 :(得分:0)

Concat the columns value,然后应用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