LOWER LIKE vs iLIKE

后端 未结 3 1395
名媛妹妹
名媛妹妹 2020-12-04 12:34

How does the performance of the following two query components compare?

LOWER LIKE

... LOWER(description) LIKE \'%abcde%\' ...
         


        
3条回答
  •  暖寄归人
    2020-12-04 13:02

    According to my tests (ten of each query), LOWER LIKE is about 17% faster than iLIKE.

    Explanation

    I created a million rows contain some random mixed text data:

    require 'securerandom'
    inserts = []
    1000000.times do |i|
            inserts << "(1, 'fake', '#{SecureRandom.urlsafe_base64(64)}')"
    end
    sql = "insert into books (user_id, title, description) values #{inserts.join(', ')}"
    ActiveRecord::Base.connection.execute(sql)
    

    Verify the number of rows:

    my_test_db=# select count(id) from books ;
      count  
    ---------
     1000009
    

    (Yes, I have nine extra rows from other tests - not a problem.)

    Example query and results:

    my_test_db=# SELECT "books".* FROM "books" WHERE "books"."published" = 'f'
    my_test_db=# and (LOWER(description) LIKE '%abcde%') ;
       id    | user_id | title |                                      description                                       | published 
    ---------+---------+-------+----------------------------------------------------------------------------------------+------
     1232322 |       1 | fake  | 5WRGr7oCKABcdehqPKsUqV8ji61rsNGS1TX6pW5LJKrspOI_ttLNbaSyRz1BwTGQxp3OaxW7Xl6fzVpCu9y3fA | f
     1487103 |       1 | fake  | J6q0VkZ8-UlxIMZ_MFU_wsz_8MP3ZBQvkUo8-2INiDIp7yCZYoXqRyp1Lg7JyOwfsIVdpPIKNt1uLeaBCdelPQ | f
     1817819 |       1 | fake  | YubxlSkJOvmQo1hkk5pA1q2mMK6T7cOdcU3ADUKZO8s3otEAbCdEcmm72IOxiBdaXSrw20Nq2Lb383lq230wYg | f
    

    Results for LOWER LIKE

    my_test_db=# EXPLAIN ANALYZE SELECT "books".* FROM "books" WHERE "books"."published" = 'f' and (LOWER(description) LIKE '%abcde%') ;
                                                       QUERY PLAN                                                   
    ----------------------------------------------------------------------------------------------------------------
     Seq Scan on books  (cost=0.00..32420.14 rows=1600 width=117) (actual time=938.627..4114.038 rows=3 loops=1)
       Filter: ((NOT published) AND (lower(description) ~~ '%abcde%'::text))
       Rows Removed by Filter: 1000006
     Total runtime: 4114.098 ms
    

    Results for iLIKE

    my_test_db=# EXPLAIN ANALYZE SELECT "books".* FROM "books" WHERE "books"."published" = 'f' and (description iLIKE '%abcde%') ;
                                                       QUERY PLAN                                                   
    ----------------------------------------------------------------------------------------------------------------
     Seq Scan on books  (cost=0.00..29920.11 rows=100 width=117) (actual time=1147.612..4986.771 rows=3 loops=1)
       Filter: ((NOT published) AND (description ~~* '%abcde%'::text))
       Rows Removed by Filter: 1000006
     Total runtime: 4986.831 ms
    

    Database info disclosure

    Postgres version:

    my_test_db=# select version();
                                                                                     version
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     PostgreSQL 9.2.4 on x86_64-apple-darwin12.4.0, compiled by i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00), 64-bit
    

    Collation setting:

    my_test_db=# select datcollate from pg_database where datname = 'my_test_db';
     datcollate  
    -------------
     en_CA.UTF-8
    

    Table definition:

    my_test_db=# \d books 
                                          Table "public.books"
       Column    |            Type             |                       Modifiers
    -------------+-----------------------------+-------------------------------------------------------
     id          | integer                     | not null default nextval('books_id_seq'::regclass)
     user_id     | integer                     | not null
     title       | character varying(255)      | not null
     description | text                        | not null default ''::text
     published   | boolean                     | not null default false
    Indexes:
        "books_pkey" PRIMARY KEY, btree (id)
    

提交回复
热议问题