【发布时间】:2010-11-22 07:59:59
【问题描述】:
我要加入一个表几十次,每次,我都会根据其中一列的 SUBSTRING 的结果加入(或过滤)(它是一个字符串,但用零填充,并且我不在乎最后四位数字)。结果,即使该列已编入索引并且我的查询将使用该索引,它也会执行表扫描,因为 SUBSTRING 本身没有编入索引,因此 SQL Server 必须在加入之前为每一行计算它。
我正在寻找有关如何加快此过程的任何想法。目前,表上有一个视图(它是“SELECT * FROM”,只是为了给表一个友好的名称),我正在考虑在计算的视图中添加一个列,然后对其进行索引。不过,我愿意接受其他建议 - 有什么想法吗?
更多详情: 我应该一开始就分享这个。该表从我们的计费系统接收复制,因此编辑基础表以添加计算列不是一种选择。任何计算列都必须添加到表的视图中。此外,前导零并不总是前导零 - 它们有时是我不感兴趣的其他数据。我想真正的问题是“如何在 VARCHAR 列中间加入数据而还使用索引?全文搜索?"
澄清我的例子 我正在简化,但本质上,假设我正在尝试在具有以下值的列中查找值:
00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff
我对 SUBSTRING(7,5)="12345" 的行感兴趣,所以我想要第 1-4 行,而不是第 5 行。我建议在我的“SELECT *”中添加一列" 包含此子字符串的视图,然后基于该子字符串进行索引。这更有意义吗?
【问题讨论】:
-
要使
JOIN使用索引,您应该转换列,使其以您正在搜索的条件开头。至于现在,你的算法太模糊了。 “前导零并不总是前导零”很难向 SQL Server 解释。FULLTEXT索引可用于搜索单词中的前缀(而不是整列),但您仍然应该将数据拆分为单词。您能否更清楚地定义您的搜索算法? -
如果您正在寻找索引SEEK,那么您还需要知道您的数据是否具有足够的选择性。也就是说,数据库中的总值与不同值的数量之比是多少。 “交叉点”实际上非常低(取决于桌子的宽度)。此外,如果您的索引不包括您从中选择的列,那么您从书签查找中执行的读取次数将使 SQL Server 忽略您的全新索引。您能否提供选择性/选择列表的详细信息?
标签: sql-server sql-server-2008 indexing calculated-columns