查询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?
我想要实时执行速度。
答案 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