我加入到一个表几十个不同的时代,每一次,我基于列(这是一个字符串,但用零左填充,和我不”之一的子串的结果,加入(或过滤器)关于最后四位数字不在乎)。 其结果是,即使该列索引,我的查询将使用索引,它表扫描,因为SUBSTRING本身不被索引,所以SQL Server有,因为它是在加入之前,计算它的每一行。
我在寻找如何加快这一进程的任何想法。 目前,在桌子上一个视图(这是一个“SELECT * FROM”,只是为了给表的友好名称)和我正在考虑添加一列向被计算的视图,然后该索引。 我接受其他的建议,虽然 - 什么想法?
更多详细信息:我应该分享这个开始。 该表接收来自我们的计费系统中复制,因此,编辑基础表中添加计算列是不是一种选择。 任何计算列必须被添加到桌子上的视图。 此外,前导零并不总是前导零-他们说我不感兴趣,我想真正的问题是有时其他数据“ 我如何加入到数据VARCHAR列的中间,同时利用索引?全文搜索?“
澄清我的例子中,我简化了,但本质上,比方说我试图查找值与以下值的列:
00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff
我感兴趣的是行,其中SUBSTRING(7,5)=“12345”,所以我想1-4行,但不为行5.什么我建议是添加一列到我的“SELECT *”认为,有这样子的,然后索引基于这一点。 这是否更有意义?
假设你有这个格式的字段:
00Data0007
000000Data0011
0000Data0015
,你可以做到以下几点:
创建一个计算列: ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
这将改变你列到以下几点:
ataD00 ataD000000 ataD0000
创建对列的索引
发出此查询搜索的字符串Data
:
SELECT * FROM mytable WHERE ndata LIKE N'ataD%' AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
第一个条件将用于粗过滤的索引。
第二个将确保(即成为计算列的拖尾字符)所有的主角都不过是零。
见我的博客性能细节此项:
更新
如果你只是想在一个索引SUBSTRING
不改变你的模式,创建一个视图是一个选项。
CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM mytable
CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)
SELECT id, data
FROM v_substring75
WHERE substring75 = '12345'
计算列添加到您的表,并创建该列的索引。
ALTER TABLE MyTable
Add Column CodeHead As LEFT(Code,Len(Code)-4)
然后创建这个索引。
CREATE INDEX CodeHeadIdx ON MyTable.CodeHead
您可以重新词组筛选条件在LIKE“%的东西”语句的条款? (这适用于一个索引)
Change the column to two columns - the data you join on and the extra 4 characters.
Using parts of a column slows things down as you hve seen