从大表中选择LIKE时,SQL Server 2012性能不佳

use*_*042 2 t-sql sqlperformance sql-server-2012

我有一个包含〜1M行的表,并对它运行以下SQL:

select * from E where sys like '%,141,%'
Run Code Online (Sandbox Code Playgroud)

执行需要2-5秒(返回~10行),我需要它至少快10倍,是否可以通过SQL Server 2012实现?

样本sys值(sys值长度范围为5到1000个字符):

1,2,3,7,9,10,11,12,14,17,28,29,30,33,35,37,40,41,42,43,44,45,46,47,48,50,51,53,55,63,69,
72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,97,109,110,111,113,117,
119,121,122,123,124,130,131,132,133,134,135,139,141,146
Run Code Online (Sandbox Code Playgroud)

表的DDL:

CREATE TABLE [dbo].[E](
    [o] [int] NOT NULL,
    [sys] [varchar](8000) NULL,
    [s] [varchar](8000) NULL,
    [eys] [varchar](8000) NULL,
    [e] [varchar](8000) NULL,
 CONSTRAINT [PK_E] PRIMARY KEY CLUSTERED 
(
    [o] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

Rob*_*vey 6

您的like子句正在进行全表扫描.

如果您希望此查询具有即时性能,则需要一个包含以下字段的一对多表:

E_Key  <-- Foreign Key, points to primary key of E table
sys    <-- Each record contains one number, not multiple numbers 
           separated by commas
Run Code Online (Sandbox Code Playgroud)

然后sys,您可以索引并使用普通的WHERE子句.

  • @ user1514042你在这个答案中设置它时的性能是什么?在聚集索引中是'E_Key`吗? (2认同)
  • 我假设您尝试首先填充表*而不使用*索引,因为更新每个INSERT上的索引会减慢进程.初始表群只需要出现一次. (2认同)