diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 1232297db1bb5b40db456594c51bc0c0f63dc91a..d1885b5ae08c70c75730a6fa440f27932bce932b 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -334,8 +334,7 @@ def by_search(items)
     return items if items.is_a?(ActiveRecord::NullRelation)
 
     if use_cte_for_search?
-      cte = Gitlab::SQL::RecursiveCTE.new(klass.table_name)
-      cte << items
+      cte = Gitlab::SQL::CTE.new(klass.table_name, items)
 
       items = klass.with(cte.to_arel).from(klass.table_name)
     end
diff --git a/changelogs/unreleased/331089-issue-search-materialized-cte.yml b/changelogs/unreleased/331089-issue-search-materialized-cte.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0b9a1a3490b747bf3defcf56bb81cb9a29708c54
--- /dev/null
+++ b/changelogs/unreleased/331089-issue-search-materialized-cte.yml
@@ -0,0 +1,5 @@
+---
+title: Fix issuable search optimization in PG12
+merge_request: 61880
+author:
+type: fixed
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index a2aac857bf5f0cf7b56b6a16b53eedce00ca05ba..27466ab563f596524a283b9257b77126ab4efc5c 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -1178,6 +1178,7 @@
 
         it 'returns true' do
           expect(finder.use_cte_for_search?).to be_truthy
+          expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/)
         end
       end
 
@@ -1186,6 +1187,7 @@
 
         it 'returns true' do
           expect(finder.use_cte_for_search?).to be_truthy
+          expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/)
         end
       end
     end