这是一个可衡量的差异。
运行以下代码:
Create Table #TempTester (id int, col1 varchar(20), value varchar(20))
go
INSERT INTO #TempTester (id, col1, value)
VALUES
(1, 'this is #1', 'abcdefghij')
GO
INSERT INTO #TempTester (id, col1, value)
VALUES
(2, 'this is #2', 'foob'),
(3, 'this is #3', 'abdefghic'),
(4, 'this is #4', 'other'),
(5, 'this is #5', 'zyx'),
(6, 'this is #6', 'zyx'),
(7, 'this is #7', 'zyx'),
(8, 'this is #8', 'klm'),
(9, 'this is #9', 'klm'),
(10, 'this is #10', 'zyx')
GO 10000
CREATE CLUSTERED INDEX ixId ON #TempTester(id)CREATE CLUSTERED INDEX ixId ON #TempTester(id)
CREATE NONCLUSTERED INDEX ixTesting ON #TempTester(value)
接下来:
SET SHOWPLAN_XML ON
然后:
SELECT * FROM #TempTester WHERE value LIKE 'abc%'
SELECT * FROM #TempTester WHERE value = 'abcdefghij'
生成的执行计划显示第一个操作——LIKE
比较的成本约为第二个操作——=
比较的成本的10倍。
如果可以使用=
比较,请尽量使用它。
value
是否有索引。如果有索引,那么=
就是一个简单的查找,不需要进行全表扫描,并且将击败你使用任何LIKE
语句。请注意,不改变原意。 - Daniel DiPaoloLIKE
语句末尾使用通配符是可搜索参数(SARGable),因此会在索引上执行范围查找,没有表扫描。该范围查找可以与=
语句相竞争,并且在许多情况下(例如,如果所有满足条件的行都在一个页面上,这是一个不太可能的情况),性能可能完全相同,涉及相同数量的读取。 - ErikE