我有数百万条记录,我只是发布样本数据。实际上,我希望通过使用 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%'
答案 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)