Which one of the following queries is faster (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
or
SELECT * FROM table WHERE Contains(Column, "test");
Which one of the following queries is faster (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
or
SELECT * FROM table WHERE Contains(Column, "test");
The second (assuming you means CONTAINS
, and actually put it in a valid query) should be faster, because it can use some form of index (in this case, a full text index). Of course, this form of query is only available if the column is in a full text index. If it isn't, then only the first form is available.
The first query, using LIKE, will be unable to use an index, since it starts with a wildcard, so will always require a full table scan.
The CONTAINS
query should be:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? What of it? The original form of the question had Column CONTAIN("%test%",Column)>0
which was no-where close to valid. It's still not completely right. –
Chenopod Having run both queries on a SQL Server 2012 instance, I can confirm the first query was fastest in my case.
The query with the LIKE
keyword showed a clustered index scan.
The CONTAINS
also had a clustered index scan with additional operators for the full text match and a merge join.
LIKE
query with a leading wildcard won't be able to use the index part efficiently. It will need to just scan the whole thing. Whilst doubtless there might be some circumstances in which the full CI scan performs better than a query using the full text index (perhaps if a very high proportion of rows match for example) this will largely be the exception not some general rule you "can confirm". –
Patronage LIKE
. –
Patronage Also try changing from this:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
To this:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
The former will find records with values like "this is a test" and "a test-case is the plan".
The latter will also find records with values like "i am testing this" and "this is the greatest".
CONTAINS
, it only mentions using prefix terms like 'test*', not suffix terms like 'test' and not full substring searching like '*test'. I have not tried it, though. –
Fastback I think that CONTAINS
took longer and used Merge
because you had a dash("-") in your query adventure-works.com
.
The dash is a break word so the CONTAINS
searched the full-text index for adventure
and than it searched for works.com
and merged the results.
I didn't understand actually what is going on with "Contains" keyword. I set a full text index on a column. I run some queries on the table. Like returns 450.518 rows but contains not and like's result is correct
SELECT COL FROM TBL WHERE COL LIKE '%41%' --450.518 rows
SELECT COL FROM TBL WHERE CONTAINS(COL,N'41') ---40 rows
SELECT COL FROM TBL WHERE CONTAINS(COL,N'"*41*"') -- 220.364 rows
© 2022 - 2024 — McMap. All rights reserved.
LIKE
andCONTAINS
do different things - and (in many cases) return different results.LIKE
is an exact match, whereasCONTAINS
may use fuzzy-logic to equate "test" to "exam" - When you only want "test"! Even if they (with the current data you have) both return the same expected results; they may not in the future. It all comes down to intent: "What is it you intend to accomplish with the query?" Speed does not factor in this case. – Slippy