我接到一个表,几十个不同的时间,并且每次我加入(或过滤器)基于结果的一个子串的一个列的(这是一个串,但留下的-填充零,而我不关心的最后四个数字)。因此,即使此列索引和我的查询将使用的指数,它表扫描因为SUBSTRING本身并不是编制索引的,因此SQL服务器计算出它对每一个行之前,作为它加入。

我在寻找的任何想法,关于如何加速这一进程。目前,有一个图表中(这是一个"SELECT*from",只要得到表一个友好的名称),我在考虑增加列认的计算,然后索引。我很开放的其他建议,虽然任何想法?

更多的细节: 我应该共享这个开始。表收到的复制从我们的记帐系统,因此编辑基础表中添加一个计算列不是一个选项。任何计算列必须加入图表。还有,导致零并不总是导致零点-他们有时其他数据,我不感兴趣。我想真正的问题是"我如何可以加入到数据中间的一个VARCHAR柱,同时还使用的指数?全文搜索?"

澄清我的例 我简化,但实质上,我们说我试图查的价值在列有以下价值观:

00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff

我感兴趣的行SUBSTRING(自7,5)="12345",所以我想要的行1至4,但不排5.我的建议是增列到我的"SELECT*"认为,具有这substring在它,然后编制索引的基础上。这样更有意义?

有帮助吗?

解决方案

假设你有你的领域,在这个格式:

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“%的东西”语句的条件筛选条件? (这适用于一个索引)

列更改为两列 - 你加入上的数据和额外的4个字符。 使用列的部分会减慢速度,你看到HVE

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top