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 吗?

我想实时执行速度。

4

5 回答 5

1

我认为这里不需要使用分析功能ROW_NUMBER()。您的行可以由 标识,id 您可能正在使用srnonly 将结果限制为 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
于 2012-05-11T13:29:11.883 回答
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%')
于 2012-05-11T12:39:14.040 回答
0

连接列值,然后应用 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 
于 2012-05-11T12:48:26.690 回答
0

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

于 2012-05-11T12:37:54.947 回答
0

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

在第一条语句中,您正在搜索整个表,然后进行过滤。第二条语句在到达前 50 条记录时才停止,这仅是因为它更快是合理的。和第二个一起去吧。

于 2012-05-11T12:41:10.530 回答