CHARINDEX vs LIKE search gives very different performance, why?

前端 未结 2 1728
日久生厌
日久生厌 2020-12-31 06:19

We use Entity Frameworks for DB access and when we \"think\" LIKE statement - it actually generates CHARINDEX stuff. So, here is 2 simple queries, after I simplified them to

相关标签:
2条回答
  • 2020-12-31 06:44

    I will answer my own question since it was hard to find correct answer and I was pointed to the problem by SQL Server 2012 Execution Plan output. As you see in original question - everything looks OK on surface. This is SQL Server 2008.

    When I run same query on 2012 I got warning on CHARINDEX query. Problem is - SQL Server had to do type conversion. Address1 is VarChar and query has N'1124' which is Unicode or NVarChar. If I change this query as so:

    SELECT * 
    FROM LOCAddress 
    WHERE (CAST(CHARINDEX(LOWER('1124'), LOWER([Address1])) AS int)) 
    

    It then runs same as LIKE query. So, type conversion that was caused by Entity Framework generator was causing this horrible hit in performance.

    0 讨论(0)
  • 2020-12-31 06:51

    First, as you can see both queries are identical and neither can use index. CHARINDEX and LIKE perform same with wildcard. Ex: %YourValue%. However, there performance varies when you use wildcard like 'YourValue%'. Here, LIKE operator will likely to perform faster than CHARINDEX because it may allow partial scan of the index. Now, in your case, both queries are same but there performance is difference because of following possible reason:

    Statistics: SQL Server maintains statistics for sub string in string columns which are use by LIKE operator but not fully usable for CHARINDEX. In that case, LIKE operator will work faster than CHARINDEX. You can force SQL Server to use index for CHARINDEX with proper table hints

    Ex: FROM LOCAddress WITH (INDEX (index_name))

    Read more Here, which in section "string summary stastics" says:

    SQL Server 2008 includes patented technology for estimating the selectivity of LIKE conditions. It builds a statistical summary of substring frequency distribution for character columns (a string summary). This includes columns of type text, ntext, char, varchar, and nvarchar. Using the string summary, SQL Server can accurately estimate the selectivity of LIKE conditions where the pattern may have any number of wildcards in any combination.

    0 讨论(0)
提交回复
热议问题