SQL服务器上的索引计算列?
-
19-09-2019 - |
题
我接到一个表,几十个不同的时间,并且每次我加入(或过滤器)基于结果的一个子串的一个列的(这是一个串,但留下的-填充零,而我不关心的最后四个数字)。因此,即使此列索引和我的查询将使用的指数,它表扫描因为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