Equals(=) vs. LIKE

后端 未结 15 2066
情书的邮戳
情书的邮戳 2020-11-22 15:19

When using SQL, are there any benefits of using = in a WHERE clause instead of LIKE?

Without any special operators, LIKE

15条回答
  •  名媛妹妹
    2020-11-22 15:45

    To address the original question regarding performance, it comes down to index utilization. When a simple table scan occurs, "LIKE" and "=" are identical. When indexes are involved, it depends on how the LIKE clause is formed. More specifically, what is the location of the wildcard(s)?


    Consider the following:

    CREATE TABLE test(
        txt_col  varchar(10) NOT NULL
    )
    go
    
    insert test (txt_col)
    select CONVERT(varchar(10), row_number() over (order by (select 1))) r
      from master..spt_values a, master..spt_values b
    go
    
    CREATE INDEX IX_test_data 
        ON test (txt_col);
    go 
    
    --Turn on Show Execution Plan
    set statistics io on
    
    --A LIKE Clause with a wildcard at the beginning
    DBCC DROPCLEANBUFFERS
    SELECT txt_Col from test where txt_col like '%10000'
    --Results in
    --Table 'test'. Scan count 3, logical reads 15404, physical reads 2, read-ahead reads 15416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    --Index SCAN is 85% of Query Cost
    
    --A LIKE Clause with a wildcard in the middle
    DBCC DROPCLEANBUFFERS
    SELECT txt_Col from test where txt_col like '1%99'
    --Results in
    --Table 'test'. Scan count 1, logical reads 3023, physical reads 3, read-ahead reads 3018, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    --Index Seek is 100% of Query Cost for test data, but it may result in a Table Scan depending on table size/structure
    
    --A LIKE Clause with no wildcards
    DBCC DROPCLEANBUFFERS
    SELECT txt_Col from test where txt_col like '10000'
    --Results in
    --Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    --Index Seek is 100% of Query Cost
    GO
    
    --an "=" clause = does Index Seek same as above
    DBCC DROPCLEANBUFFERS
    SELECT txt_Col from test where txt_col = '10000'
    --Results in
    --Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    --Index Seek is 100% of Query Cost
    GO
    
    
    DROP TABLE test
    

    There may be also negligible difference in the creation of the query plan when using "=" vs "LIKE".

提交回复
热议问题