子串的SQL Server最佳索引?

时间:2011-09-17 20:56:31

标签: sql sql-server-2008 select indexing

运行SQL Server 2008,我有一个表,其中包含来自应用程序的几百万行日志信息转储。我想弄清楚如何编写最佳索引来获取相关信息。

表格如下。只是一个示例,实际的消息数据很长。

CREATE TABLE #Info(
    [infoID] [int] IDENTITY(1,1) NOT NULL,
    [ActionHappened] [datetime] NOT NULL,
    [PartialMessage] [nvarchar](1500) NULL,
    [FullMessage] [nvarchar](max) NULL,
 CONSTRAINT [pk_info] PRIMARY KEY CLUSTERED([infoID] ASC)
      WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
            ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

Insert Into #Info Values ( GETDATE() , 'Thread:05;D:Start;Msg:Activity A' , 'Thread:05;D:Start;Msg:Activity A abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv' )
Insert Into #Info Values ( dateadd( minute , 3 , GETDATE() ) , 'Thread:05;D:Start;Msg:Activity B' , 'Thread:05;D:Start;Msg:Activity B abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv' )
Insert Into #Info Values ( dateadd( minute , 6 , GETDATE() )  , 'Thread:05;D:Start;Msg:Activity C' , 'Thread:05;D:Start;Msg:Activity D abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv' )
Insert Into #Info Values ( dateadd( minute , 9 , GETDATE() )  , 'Thread:05;D:Start;Msg:Activity D' , 'Thread:05;D:Start;Msg:Activity E abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv' )
Insert Into #Info Values ( dateadd( minute , 15 , GETDATE() )  , 'Thread:05;D:Start;Msg:Activity E' , 'Thread:05;D:Start;Msg:Activity F abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv' )

我需要从PartialMessage中选择,忽略第二个分号之前的所有内容,然后返回ActionHappenedFullMessage。例如,我想

select ActionHappened, FullMessage 
from #Info 
where PartialMessage Like '%Activity D%'

但当然不是每列内的表扫描和软搜索。

所有想法都受到赞赏。

感谢。

1 个答案:

答案 0 :(得分:1)

你可以像马丁建议的那样创建一个索引视图来分割字段吗?以下可能有效,但是根据字段的大小,它可能没有用处。

  • 创建一个名为 ReversePartialMessage
  • 的字段
  • 使用触发器使用 REVERSE(partialMessage)
  • 填充此字段
  • PartialMessage ReversePartialMessage 字段
  • 上添加索引
  • 制作WHERE子句

    PartialMessage喜欢'Activity D%'和ReversePartialMessage喜欢'D ytivitcA%'

但是,由于PartialMessage的大小,我不确定这些索引的努力是否会获得更多。如果可以缩短字段,则这些索引可能是实用的。如果您确实创建了索引,请务必访问执行计划以查看它们是否实际使用。优化器可能会决定表扫描比索引更有效。合并两个索引的输出,特别是如此大的键值,可能不会产生任何显着的收益...