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)
您的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子句.