提高字母数字文本搜索查询的性能

时间:2015-12-18 07:08:00

标签: sql sql-server tsql

我有数百万条记录,我只是发布样本数据。实际上,我希望通过使用 LIKE或LEFT 来获取认可数据,但在执行时间内它们之间没有区别。在处理字母数字数据时,是否有更好的方法可以在更短的时间内获取数据。我在表中有4.4M记录。建议我

declare @t table (val varchar(50))

insert into @t(val)values 
('0-1AB11BC11yerw123Endorsement'),
('0-1AB114578Endorsement'),
('0-1BC11BC11yerw122553Endorsement'),
('0-1AB11BC11yerw123newBusiness'),
('0-1AB114578newBusiness'),
('0-1BC11BC11yerw122553newBusiness'),
('0-1AB11BC11yerw123Renewal'),
('0-1AB114578Renewal'),
('0-1BC11BC11yerw122553Renewal')



SELECT   * FROM @t  where RIGHT(val,11) = 'Endorsement'

 SELECT  * FROM @t  where val like  '%Endorsement%'

3 个答案:

答案 0 :(得分:3)

想象一下,你必须在电话簿中找到以某个字符串结尾的名字。您所能做的就是阅读每个名称并进行比较。它根本无法帮助您查看A,B,C等名称的起始位置,因为您对名称的初始字符不感兴趣,而只对最后一个字符感兴趣。嗯,你唯一可以做的就是加快速度,要求一些朋友帮助你,每个人只扫描一系列页面。在DBMS中它是相同的。 DBMS执行全表扫描并尽可能并行化。

但是,如果你有一本电话簿向后列出单词,那么你会看到哪些单词结束与A,B,C等,这肯定会有所帮助。在SQL Server中:在反向字符串上创建计算列:

alter table t add reverse_val as reverse(val);

并添加索引:

create index idx_reverse_val on t(reverse_val);

然后用LIKE查询字符串。 DBMS应该注意到它可以使用索引来加速搜索过程。

select * from t where reverse_val like reverse('Endorsement') + '%';

说完这句话之后,你对字符串的结尾感兴趣似乎很奇怪。在一个好的数据库中存储原子信息,例如你不会将一个人的姓名和出生日期存储在同一列('John Miller 12.12.2000')中,而是在单独的列中。当然,确实会发生你存储名称并希望查找以包含子字符串开头,以其结尾的名称,但毕竟这是一件罕见的事情。检查您的专栏并考虑其内容是否应该是单独的列。如果您在单独的列中有字符串('认可','续订'等),这将真正加快查找速度,因为您所要做的就是询问{{1并且对于该列的索引,这对于DBMS来说是一个超级简单的任务。

答案 1 :(得分:1)

尝试charindex或patindex:

SELECT *
FROM @t t
WHERE CHARINDEX('endorsement', t.val) > 0


SELECT *
FROM @t t
WHERE PATINDEX('%endorsement%', t.val) > 0

答案 2 :(得分:0)

CREATE  TABLE tbl 
(val varchar(50));

insert into tbl(val)values 
('0-1AB11BC11yerw123Endorsement'),
('0-1AB114578Endorsement'),
('0-1BC11BC11yerw122553Endorsement'),
('0-1AB11BC11yerw123newBusiness'),
('0-1AB114578newBusiness'),
('0-1BC11BC11yerw122553newBusiness'),
('0-1AB11BC11yerw123Renewal'),
('0-1AB114578Renewal'),
('0-1BC11BC11yerw122553Renewal');


CREATE CLUSTERED INDEX inx
ON dbo.tbl(val) 


 SELECT  * FROM tbl  where val like  '%Endorsement';
--LIKE '%Endorsement' will give better performance it will utilize the index well efficiently than RIGHT(val,ll)