Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vaTJD-0090M4-1L for pgsql-general@arkaria.postgresql.org; Tue, 30 Dec 2025 06:34:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vaTJB-0039HS-1k for pgsql-general@arkaria.postgresql.org; Tue, 30 Dec 2025 06:34:18 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vaTFu-0034Gs-1x for pgsql-general@lists.postgresql.org; Tue, 30 Dec 2025 06:30:55 +0000 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vaTFs-003WR2-30 for pgsql-general@lists.postgresql.org; Tue, 30 Dec 2025 06:30:55 +0000 Received: by mail-ej1-x62d.google.com with SMTP id a640c23a62f3a-b7636c96b9aso1756479766b.2 for ; Mon, 29 Dec 2025 22:30:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767076252; x=1767681052; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=yyu7XmFkPHUPEChl2JYm4JAG0yVFuiPjDUh1+NnmPgU=; b=g7dBpEzbKgJi16y8wNGen2CUydg7vfFLv7lWofJyO0XnETUugayAA+3bU2sXgyIi33 7Q//YobbOUiAZLoatGee7mxcHPvrGTicZJm17ddfAhZyMBQmV0nFocNMHp2B0n+Qy16Y P6AE5EFFvgAm3PPbu5HrGqtP8i/M5bNNwvwVysCC86zMmpTLOjCKG9h/AXtG3x2TtM73 ZwHYMdssnlAyy3PEHBxVJn33ZK6Kl8/tc6bFl2E8DHGAyJB4CG+hY/sZ7dJUXBAmq/DR QWaTxBoKrTwt3t/eQhRmeUywQjmPDWzGTuGX3JAdnLOgqqTqa4PTuSPkekghtkGLXaCc LSIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767076252; x=1767681052; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=yyu7XmFkPHUPEChl2JYm4JAG0yVFuiPjDUh1+NnmPgU=; b=P+YSH/staEYBwTT0Kys1/4CEsSKQgefJtpPBBF8CV45vg8QPRE4yGNWq9cQL6L9b65 n3goS88qz31ZYKDWyIprLByyoVjAu0S4bOh0OQzgKEBuWLjK2eEWNppwfbUVdsviIP6U D7+eAF4FfKynIYChIJnHO66A0sDySKnPIrxjf8JQAhUo91Jnr4CDENZNSWjlvnrzr5pE m5ZSvheKlushgi3D+4tO4U34PPn25i94bjw3jjDa8owWvhfXcjobtI9oWAQf4UpqVXc0 dWkIH+DbJfGGkPs3nDbL0p7RZDZB2Oqin1FdJuO4eA/Z154FV63nOfOFFmdKb44yR2B/ Vsbw== X-Gm-Message-State: AOJu0YwlC9r/k56rnMRaP9+2BkoSdcT5EMK4OjMn+vOlUE8VPmSMsny2 mhmCGLC86PVXtxdy4GUM8avzrOR7fSewqBiZ5Lj+Yod5yG9oodXzjp4B3hQh1/31JSGKbS7ENZi PEdRYLUtQ9WCxwYdPer8d1Ukpa1izvgPVLT/b X-Gm-Gg: AY/fxX5TaMx1Zet0tQYlYc4GYw0F9+RwDREJZy2c+afRdYcggTmMeH5L9xnv8geNJMv Evaf5WWHHPOOzuk6WcXXN05PmpzjcLLTICRlFeYc+Af7cNwT4li8n2WztPWQZ4Ao1jVyMaoIZUi ZcvZGDvxpxn1liiXRXdL4b1Ed1uu9SmQjR3JBG6X2XwbAFvtCdu9O1rZKckhR/bfIHECNYqm74e o0vrz6rPClvIrl49rwPKKKFTFihoWFFVnBabqYfbIKNI8+Zg8vMccu8M9C+IPFaqEFLPQk= X-Google-Smtp-Source: AGHT+IHq2OP01zYIf9GQZkmtn7jCNyhh+pwyIjpWZoq6EnP8f9wc2fUQ41+PLUq/em8RsPXVkEOFGkuCDyjCIyOpcLE= X-Received: by 2002:a17:906:fd86:b0:b7a:615:75aa with SMTP id a640c23a62f3a-b80371a3a86mr3349815066b.42.1767076251887; Mon, 29 Dec 2025 22:30:51 -0800 (PST) MIME-Version: 1.0 From: Rahman Duran Date: Tue, 30 Dec 2025 09:30:27 +0300 X-Gm-Features: AQt7F2q1AVZayf4IY5Hc9ssZP-vCN53uA2ehieHt6CEgClQDPbd2kJuIP8kVu0Q Message-ID: Subject: PostgreSQL 18.1 non deterministic collation "LIKE %abc%" performance To: pgsql-general@lists.postgresql.org Content-Type: multipart/alternative; boundary="00000000000048eb96064725809a" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000048eb96064725809a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, After the release of the PostgreSQL 18 version, I am trying non determisinstic collation with LIKE pattern matching support. I am mostly searching with "LIKE %search_term%" on about 10 text columns. As I use wildcard prefix and suffix, I can't use btree index anyways. So I decided to try non deterministic collation support so I can simplify application code. I am testing this on a table with ~60K rows. With this row count and search pattern, non deterministic collation seems at least 10 times slower than LOWER LIKE and ILIKE. Tested collations are the same ICU tr-TR collation with standard and custom based on same ICU tr-TR: 40960 | test3e | 2200 | 10 | i | f | -1 | | | tr-TR-u-ks-level2 | | 153.128.46 Version: etukimlik_admin=3D# select version(); version ---------------------------------------------------------------------------= ----------------------------------------- PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit (1 row) Table structure with ICU deterministic collation: etukimlik_admin=3D# \d "AccountActivityLogEntries" Table "public.AccountActivityLogEntries" Column | Type | Collation | Nullable | Default --------------------------+--------------------------+-------------+-------= ---+-----------------------------------------------------------------------= --- Id | integer | | not null | generated by default as identity Email | character varying(128) | tr-TR-x-icu | not null | LdapUid | character varying(512) | tr-TR-x-icu | | Identity | character varying(24) | tr-TR-x-icu | | StudentId | text[] | | | EmployeeId | character varying(24) | tr-TR-x-icu | | Name | character varying(1024) | tr-TR-x-icu | | Surname | character varying(1024) | tr-TR-x-icu | | AccountType | text[] | | not null | Description | character varying(4096) | tr-TR-x-icu | not null | ActivityId | character varying(128) | tr-TR-x-icu | not null | LogTypeCode | character varying(10) | tr-TR-x-icu | not null | LogType | character varying(64) | tr-TR-x-icu | not null | LogSubType | character varying(64) | tr-TR-x-icu | not null | ActivityTime | timestamp with time zone | | | ActivitySource | character varying(128) | tr-TR-x-icu | not null | ChangedAttribute | character varying(128) | tr-TR-x-icu | | ChangedAttributeOldValue | character varying(4096) | tr-TR-x-icu | | ChangedAttributeNewValue | character varying(4096) | tr-TR-x-icu | | DisplayName | character varying(2049) | tr-TR-x-icu | | generated always as (((("Name"::text || ' '::text) || "Surname"::text))) Indexes: "PK_AccountActivityLogEntries" PRIMARY KEY, btree ("Id") LOWER LIKE query test: etukimlik_admin=3D# explain analyze select * FROM "AccountActivityLogEntrie= s" where lower("Email") like '%duran%' or lower("LdapUid") like '%duran%' or lower("Identity") like '%duran%' or lower("Name") like '%duran%' or lower("Surname") like '%duran%' or lower("DisplayName") like '%duran%' or lower("Description") like '%duran%' or lower("EmployeeId") like '%duran%' or exists ( select from unnest("StudentId") AS value WHERE lower(value) LIKE '%duran%') or lower("ActivityId") like '%duran%'; QUERY PLAN ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ----------------------------------------------------------------------- Seq Scan on "AccountActivityLogEntries" (cost=3D0.00..16387.18 rows=3D312= 10 width=3D5251) (actual time=3D1.952..282.090 rows=3D102.00 loops=3D1) Filter: ((lower(("Email")::text) ~~ '%duran%'::text) OR (lower(("LdapUid")::text) ~~ '%duran%'::text) OR (lower(("Identity")::text) ~~ '%duran%'::text) OR (lower(("Name")::text) ~~ '%duran%'::text) OR (lower(("Surname")::text) ~~ '%duran%'::text) OR (lower((((("Name")::text || ' '::text) || ("Surname")::text))::text) ~~ '%duran%'::text) OR (lower(("Description")::text) ~~ '%duran%'::text) OR (lower(("EmployeeId")::text) ~~ '%duran%'::text) OR EXISTS(SubPlan 1) OR (lower(("ActivityId")::text) ~~ '%duran%'::text)) Rows Removed by Filter: 61438 Buffers: shared hit=3D2922 SubPlan 1 -> Function Scan on unnest value (cost=3D0.00..0.15 rows=3D1 width= =3D0) (actual time=3D0.001..0.001 rows=3D0.00 loops=3D61438) Filter: (lower(value) ~~ '%duran%'::text) Rows Removed by Filter: 1 Planning Time: 0.165 ms Execution Time: 282.143 ms (10 rows) ILIKE query test: explain analyze select * FROM "AccountActivityLogEntries" where "Email" ilike '%duran%' or "LdapUid" ilike '%duran%' or "Identity" ilike '%duran%' or "Name" ilike '%duran%' or "Surname" ilike '%duran%' or "DisplayName" ilike '%duran%' or "Description" ilike '%duran%' or "EmployeeId" ilike '%duran%' or exists ( select from unnest("StudentId") AS value WHERE value iLIKE '%duran%') or "ActivityId" ilike '%duran%'; QUERY PLAN ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ----------------- Seq Scan on "AccountActivityLogEntries" (cost=3D0.00..13464.03 rows=3D312= 10 width=3D5251) (actual time=3D3.782..417.573 rows=3D102.00 loops=3D1) Filter: ((("Email")::text ~~* '%duran%'::text) OR (("LdapUid")::text ~~* '%duran%'::text) OR (("Identity")::text ~~* '%duran%'::text) OR (("Name")::text ~~* '%duran%'::text) OR (("Surname")::text ~~* '%duran%'::text) OR ((((("Name")::text || ' '::text) || ("Surname")::text))::text ~~* '%duran%'::text) OR (("Description")::text ~~* '%duran%'::text) OR (("EmployeeId")::text ~~* '%duran%'::text) OR EXISTS(SubPlan 1) OR (("ActivityId")::text ~~* '%duran%'::text)) Rows Removed by Filter: 61438 Buffers: shared hit=3D2922 SubPlan 1 -> Function Scan on unnest value (cost=3D0.00..0.13 rows=3D1 width= =3D0) (actual time=3D0.001..0.001 rows=3D0.00 loops=3D61438) Filter: (value ~~* '%duran%'::text) Rows Removed by Filter: 1 Planning Time: 0.160 ms Execution Time: 417.652 ms Table structure with ICU non deterministic collation: etukimlik_admin=3D# \d "AccountActivityLogEntries" Table "public.AccountActivityLogEntries" Column | Type | Collation | Nullable | Default --------------------------+--------------------------+-----------+---------= -+-------------------------------------------------------------------------= - Id | integer | | not null | generated by default as identity Email | character varying(128) | test3e | not null | LdapUid | character varying(512) | test3e | | Identity | character varying(24) | test3e | | StudentId | text[] | | | EmployeeId | character varying(24) | test3e | | Name | character varying(1024) | test3e | | Surname | character varying(1024) | test3e | | AccountType | text[] | | not null | Description | character varying(4096) | test3e | not null | ActivityId | character varying(128) | test3e | not null | LogTypeCode | character varying(10) | test3e | not null | LogType | character varying(64) | test3e | not null | LogSubType | character varying(64) | test3e | not null | ActivityTime | timestamp with time zone | | | ActivitySource | character varying(128) | test3e | not null | ChangedAttribute | character varying(128) | test3e | | ChangedAttributeOldValue | character varying(4096) | test3e | | ChangedAttributeNewValue | character varying(4096) | test3e | | DisplayName | character varying(2049) | test3e | | generated always as (((("Name"::text || ' '::text) || "Surname"::text))) Indexes: "PK_AccountActivityLogEntries" PRIMARY KEY, btree ("Id") LIKE query test: etukimlik_admin=3D# explain analyze select * FROM "AccountActivityLogEntrie= s" where "Email" like '%duran%' or "LdapUid" like '%duran%' or "Identity" like '%duran%' or "Name" like '%duran%' or "Surname" like '%duran%' or "DisplayName" like '%duran%' or "Description" like '%duran%' or "EmployeeId" like '%duran%' or exists ( select from unnest("StudentId") AS value WHERE value LIKE '%duran%') or "ActivityId" like '%duran%'; QUERY PLAN ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= -------- Seq Scan on "AccountActivityLogEntries" (cost=3D0.00..13464.03 rows=3D312= 10 width=3D5251) (actual time=3D18.466..2338.605 rows=3D102.00 loops=3D1) Filter: ((("Email")::text ~~ '%duran%'::text) OR (("LdapUid")::text ~~ '%duran%'::text) OR (("Identity")::text ~~ '%duran%'::text) OR (("Name")::text ~~ '%duran%'::text) OR (("Surname")::text ~~ '%duran%'::text) OR ((((("Name")::text || ' '::text) || ("Surname")::text))::text ~~ '%duran%'::text) OR (("Description")::text ~~ '%duran%'::text) OR (("EmployeeId")::text ~~ '%duran%'::text) OR EXISTS(SubPlan 1) OR (("ActivityId")::text ~~ '%duran%'::text)) Rows Removed by Filter: 61438 Buffers: shared hit=3D2922 SubPlan 1 -> Function Scan on unnest value (cost=3D0.00..0.13 rows=3D1 width= =3D0) (actual time=3D0.001..0.001 rows=3D0.00 loops=3D61438) Filter: (value ~~ '%duran%'::text) Rows Removed by Filter: 1 Planning: Buffers: shared hit=3D4 Planning Time: 0.176 ms Execution Time: 2338.670 ms As you can see, setting deterministic false to the same ICU collation and querying with "LIKE %search_term%" is way slower than using lower() function. So why is it this slow? Is there any technical documentation that explains this behaviour? Regards, Rahman Duran --00000000000048eb96064725809a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

After the release=C2=A0o= f the PostgreSQL 18 version, I am trying non determisinstic=C2=A0collation = with LIKE pattern matching support. I am mostly searching with "LIKE %= search_term%" on about 10 text columns. As I use wildcard prefix and s= uffix, I can't use btree index anyways. So I decided to try non determi= nistic collation support so I can simplify application code. I am testing t= his on a table with ~60K rows. With this row count and search pattern, non = deterministic collation seems at least 10 times slower than LOWER LIKE and = ILIKE. Tested collations are the same ICU tr-TR collation with standard and= custom based on same ICU tr-TR:
40960 | test3e =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= 2200 | =C2=A0 =C2=A0 =C2=A0 =C2=A010 | i =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0| f =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -1 | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| tr-TR-u-ks-level2 | = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| 153.128.46

=
Version:
etukimlik_admin=3D# select version();
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 version =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0
--------------------------------------------------= ------------------------------------------------------------------
=C2= =A0PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compile= d by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
(1 row)

<= div>Table=C2=A0 structure with ICU deterministic collation:
etuki= mlik_admin=3D# \d "AccountActivityLogEntries"
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Table "public.AccountActivityLogEnt= ries"
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Column =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Type =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 | =C2=A0Collation =C2=A0| Nullable | =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 Default =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0--------------------------+--------------------------+-------------+-----= -----+---------------------------------------------------------------------= -----
=C2=A0Id =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 | integer =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | not null = | generated by default as identity
=C2=A0Email =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(128) =C2= =A0 | tr-TR-x-icu | not null |
=C2=A0LdapUid =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(512) =C2=A0 | tr-= TR-x-icu | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0Identity =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | character varying(24) = =C2=A0 =C2=A0| tr-TR-x-icu | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0= StudentId =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| text[] = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
= =C2=A0EmployeeId =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | charact= er varying(24) =C2=A0 =C2=A0| tr-TR-x-icu | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0|
=C2=A0Name =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 | character varying(1024) =C2=A0| tr-TR-x-icu | =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0Surname =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(1024) =C2=A0| tr-TR-x-ic= u | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0AccountType =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| text[] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= | not null |
=C2=A0Description =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0| character varying(4096) =C2=A0| tr-TR-x-icu | not null |
= =C2=A0ActivityId =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | charact= er varying(128) =C2=A0 | tr-TR-x-icu | not null |
=C2=A0LogTypeCode =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(10) =C2=A0= =C2=A0| tr-TR-x-icu | not null |
=C2=A0LogType =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(64) =C2=A0 =C2= =A0| tr-TR-x-icu | not null |
=C2=A0LogSubType =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 | character varying(64) =C2=A0 =C2=A0| tr-TR-x-icu= | not null |
=C2=A0ActivityTime =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 | timestamp with time zone | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0ActivitySource =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 | character varying(128) =C2=A0 | tr-TR-x-icu | no= t null |
=C2=A0ChangedAttribute =C2=A0 =C2=A0 =C2=A0 =C2=A0 | character= varying(128) =C2=A0 | tr-TR-x-icu | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| =C2=A0ChangedAttributeOldValue | character varying(4096) =C2=A0| tr-TR-x-= icu | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0ChangedAttributeNewValu= e | character varying(4096) =C2=A0| tr-TR-x-icu | =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0|
=C2=A0DisplayName =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0| character varying(2049) =C2=A0| tr-TR-x-icu | =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0| generated always as (((("Name"::text || ' = 9;::text) || "Surname"::text)))
Indexes:
=C2=A0 =C2=A0 &quo= t;PK_AccountActivityLogEntries" PRIMARY KEY, btree ("Id")

LOWER LIKE query test:
etukimlik_admin=3D#= explain analyze select * FROM "AccountActivityLogEntries" where = lower("Email") like '%duran%' or lower("LdapUid"= ;) like '%duran%' or lower("Identity") like '%duran%&= #39; or lower("Name") like '%duran%' or lower("Surna= me") like '%duran%' or lower("DisplayName") like = 9;%duran%' or lower("Description") like '%duran%' or = lower("EmployeeId") like '%duran%' or exists ( select fro= m unnest("StudentId") AS value =C2=A0WHERE lower(value) LIKE '= ;%duran%') or =C2=A0lower("ActivityId") like '%duran%'= ;;
QUERY PLAN =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
----------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= -------------------------------------------------------
=C2=A0Seq Scan o= n "AccountActivityLogEntries" =C2=A0(cost=3D0.00..16387.18 rows= =3D31210 width=3D5251) (actual time=3D1.952..282.090 rows=3D102.00 loops=3D= 1)
=C2=A0 =C2=A0Filter: ((lower(("Email")::text) ~~ '%dura= n%'::text) OR (lower(("LdapUid")::text) ~~ '%duran%':= :text) OR (lower(("Identity")::text) ~~ '%duran%'::text) = OR (lower(("Name")::text) ~~ '%duran%'::text) OR (lower((= "Surname")::text) ~~ '%duran%'::text) OR (lower((((("= ;Name")::text || ' '::text) || ("Surname")::text))::= text) ~~ '%duran%'::text) OR (lower(("Description")::text= ) ~~ '%duran%'::text) OR (lower(("EmployeeId")::text) ~~ = '%duran%'::text) OR EXISTS(SubPlan 1) OR (lower(("ActivityId&q= uot;)::text) ~~ '%duran%'::text))
=C2=A0 =C2=A0Rows Removed by F= ilter: 61438
=C2=A0 =C2=A0Buffers: shared hit=3D2922
=C2=A0 =C2=A0Sub= Plan 1
=C2=A0 =C2=A0 =C2=A0-> =C2=A0Function Scan on unnest value =C2= =A0(cost=3D0.00..0.15 rows=3D1 width=3D0) (actual time=3D0.001..0.001 rows= =3D0.00 loops=3D61438)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Filter: = (lower(value) ~~ '%duran%'::text)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0Rows Removed by Filter: 1
=C2=A0Planning Time: 0.165 ms
= =C2=A0Execution Time: 282.143 ms
(10 rows)

ILIKE query test:
explain analyze select * FROM "Acc= ountActivityLogEntries" where "Email" ilike '%duran%'= ; or "LdapUid" ilike '%duran%' or "Identity" il= ike '%duran%' or "Name" ilike '%duran%' or "= Surname" ilike '%duran%' or "DisplayName" ilike '= ;%duran%' or "Description" ilike '%duran%' or "E= mployeeId" ilike '%duran%' or exists ( select from unnest(&quo= t;StudentId") AS value =C2=A0WHERE value iLIKE '%duran%') or = =C2=A0"ActivityId" ilike '%duran%';
QUERY PLAN = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
--------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------
=C2=A0Seq Scan on "AccountActivityLogEntries" =C2=A0= (cost=3D0.00..13464.03 rows=3D31210 width=3D5251) (actual time=3D3.782..417= .573 rows=3D102.00 loops=3D1)
=C2=A0 =C2=A0Filter: ((("Email")= ::text ~~* '%duran%'::text) OR (("LdapUid")::text ~~* = 9;%duran%'::text) OR (("Identity")::text ~~* '%duran%'= ;::text) OR (("Name")::text ~~* '%duran%'::text) OR ((&qu= ot;Surname")::text ~~* '%duran%'::text) OR ((((("Name&quo= t;)::text || ' '::text) || ("Surname")::text))::text ~~* = '%duran%'::text) OR (("Description")::text ~~* '%dura= n%'::text) OR (("EmployeeId")::text ~~* '%duran%'::te= xt) OR EXISTS(SubPlan 1) OR (("ActivityId")::text ~~* '%duran= %'::text))
=C2=A0 =C2=A0Rows Removed by Filter: 61438
=C2=A0 =C2= =A0Buffers: shared hit=3D2922
=C2=A0 =C2=A0SubPlan 1
=C2=A0 =C2=A0 = =C2=A0-> =C2=A0Function Scan on unnest value =C2=A0(cost=3D0.00..0.13 ro= ws=3D1 width=3D0) (actual time=3D0.001..0.001 rows=3D0.00 loops=3D61438)=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Filter: (value ~~* '%duran%&#= 39;::text)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Rows Removed by Filt= er: 1
=C2=A0Planning Time: 0.160 ms
=C2=A0Execution Time: 417.652 ms<= /div>

Table =C2=A0structure with ICU non deterministic c= ollation:
etukimlik_admin=3D# \d "AccountActivityLogEntries&= quot;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Table "publ= ic.AccountActivityLogEntries"
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Co= lumn =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= Type =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | Collation | Nullable | =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Default =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0
--------------------------+--------------------------+-------= ----+----------+-----------------------------------------------------------= ---------------
=C2=A0Id =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | integer =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | not n= ull | generated by default as identity
=C2=A0Email =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(128) = =C2=A0 | test3e =C2=A0 =C2=A0| not null |
=C2=A0LdapUid =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(512) = =C2=A0 | test3e =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2= =A0Identity =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | chara= cter varying(24) =C2=A0 =C2=A0| test3e =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|
=C2=A0StudentId =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0| text[] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0|
=C2=A0EmployeeId =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 | character varying(24) =C2=A0 =C2=A0| test3e =C2=A0 =C2=A0| =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0Name =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | character varying(1024) =C2=A0= | test3e =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0Surna= me =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| characte= r varying(1024) =C2=A0| test3e =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0|
=C2=A0AccountType =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0| text[] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | not null |
=C2=A0Description =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(4096) =C2= =A0| test3e =C2=A0 =C2=A0| not null |
=C2=A0ActivityId =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | character varying(128) =C2=A0 | test3e= =C2=A0 =C2=A0| not null |
=C2=A0LogTypeCode =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0| character varying(10) =C2=A0 =C2=A0| test3e =C2= =A0 =C2=A0| not null |
=C2=A0LogType =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(64) =C2=A0 =C2=A0| test3e = =C2=A0 =C2=A0| not null |
=C2=A0LogSubType =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 | character varying(64) =C2=A0 =C2=A0| test3e =C2=A0 = =C2=A0| not null |
=C2=A0ActivityTime =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 | timestamp with time zone | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0ActivitySource =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 | character varying(128) =C2=A0 | test3e =C2=A0 = =C2=A0| not null |
=C2=A0ChangedAttribute =C2=A0 =C2=A0 =C2=A0 =C2=A0 |= character varying(128) =C2=A0 | test3e =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0|
=C2=A0ChangedAttributeOldValue | character varying(4096= ) =C2=A0| test3e =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2= =A0ChangedAttributeNewValue | character varying(4096) =C2=A0| test3e =C2=A0= =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|
=C2=A0DisplayName =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| character varying(2049) =C2=A0| = test3e =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| generated always = as (((("Name"::text || ' '::text) || "Surname":= :text)))
Indexes:
=C2=A0 =C2=A0 "PK_AccountActivityLogEntries&qu= ot; PRIMARY KEY, btree ("Id")

LIKE query= test:
etukimlik_admin=3D# explain analyze select * FROM "Ac= countActivityLogEntries" where "Email" like '%duran%'= ; or "LdapUid" like '%duran%' or "Identity" lik= e '%duran%' or "Name" like '%duran%' or "Sur= name" like '%duran%' or "DisplayName" like '%dur= an%' or "Description" like '%duran%' or "Employe= eId" like '%duran%' or exists ( select from unnest("Stude= ntId") AS value =C2=A0WHERE value LIKE '%duran%') or =C2=A0&qu= ot;ActivityId" like '%duran%';
QUERY PLA= N =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
-----------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------------------------------= ------------------------------------------------------------
=C2=A0Seq S= can on "AccountActivityLogEntries" =C2=A0(cost=3D0.00..13464.03 r= ows=3D31210 width=3D5251) (actual time=3D18.466..2338.605 rows=3D102.00 loo= ps=3D1)
=C2=A0 =C2=A0Filter: ((("Email")::text ~~ '%duran%= '::text) OR (("LdapUid")::text ~~ '%duran%'::text) OR= (("Identity")::text ~~ '%duran%'::text) OR (("Name&= quot;)::text ~~ '%duran%'::text) OR (("Surname")::text ~~= '%duran%'::text) OR ((((("Name")::text || ' '::t= ext) || ("Surname")::text))::text ~~ '%duran%'::text) OR = (("Description")::text ~~ '%duran%'::text) OR (("Emp= loyeeId")::text ~~ '%duran%'::text) OR EXISTS(SubPlan 1) OR ((= "ActivityId")::text ~~ '%duran%'::text))
=C2=A0 =C2=A0= Rows Removed by Filter: 61438
=C2=A0 =C2=A0Buffers: shared hit=3D2922=C2=A0 =C2=A0SubPlan 1
=C2=A0 =C2=A0 =C2=A0-> =C2=A0Function Scan on= unnest value =C2=A0(cost=3D0.00..0.13 rows=3D1 width=3D0) (actual time=3D0= .001..0.001 rows=3D0.00 loops=3D61438)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0Filter: (value ~~ '%duran%'::text)
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0Rows Removed by Filter: 1
=C2=A0Planning:
=C2= =A0 =C2=A0Buffers: shared hit=3D4
=C2=A0Planning Time: 0.176 ms
=C2= =A0Execution Time: 2338.670 ms

As you = can see, setting deterministic false to the same ICU collation and querying= with "LIKE %search_term%" is way slower than using lower() funct= ion. So why is it this slow? Is there any technical documentation that expl= ains this behaviour?

Regards,
Rahman Duran

--00000000000048eb96064725809a--