SQL服务器 - 指数计算列?(SQL Server - index on a computed c

2019-07-03 14:06发布

我加入到一个表几十个不同的时代,每一次,我基于列(这是一个字符串,但用零左填充,和我不”之一的子串的结果,加入(或过滤器)关于最后四位数字不在乎)。 其结果是,即使该列索引,我的查询将使用索引,它表扫描,因为SUBSTRING本身不被索引,所以SQL Server有,因为它是在加入之前,计算它的每一行。

我在寻找如何加快这一进程的任何想法。 目前,在桌子上一个视图(这是一个“SELECT * FROM”,只是为了给表的友好名称)和我正在考虑添加一列向被计算的视图,然后该索引。 我接受其他的建议,虽然 - 什么想法?

更多详细信息:我应该分享这个开始。 该表接收来自我们的计费系统中复制,因此,编辑基础表中添加计算列是不是一种选择。 任何计算列必须被添加到桌子上的视图。 此外,前导零并不总是前导零-他们说我不感兴趣,我想真正的问题是有时其他数据“ 我如何加入到数据VARCHAR列的中间,同时利用索引?全文搜索?“

澄清我的例子中,我简化了,但本质上,比方说我试图查找值与以下值的列:

00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff

我感兴趣的是行,其中SUBSTRING(7,5)=“12345”,所以我想1-4行,但不为行5.什么我建议是添加一列到我的“SELECT *”认为,有这样子的,然后索引基于这一点。 这是否更有意义?

Answer 1:

假设你有这个格式的字段:

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')) 

    第一个条件将用于粗过滤的索引。

    第二个将确保(即成为计算列的拖尾字符)所有的主角都不过是零。

见我的博客性能细节此项:

  • SQL Server :领先使用索引通配符匹配

更新

如果你只是想在一个索引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'


Answer 2:

计算列添加到您的表,并创建该列的索引。

ALTER TABLE MyTable
Add Column CodeHead As LEFT(Code,Len(Code)-4)

然后创建这个索引。

CREATE INDEX CodeHeadIdx ON MyTable.CodeHead


Answer 3:

您可以重新词组筛选条件在LIKE“%的东西”语句的条款? (这适用于一个索引)



Answer 4:

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



文章来源: SQL Server - index on a computed column?