Потоковая запись одна за другой против соответствующего запроса в PostgreSQL - PullRequest
0 голосов
/ 06 июля 2018

Привет всем. Надеюсь, у вас все хорошо, я работаю над поисковой системой, критичной ко времени, и хочу знать, есть ли способ получать поток записей по очереди по марширующему запросу.
Как и в моем случае, у меня есть таблица из 40 миллионов записей, и я хочу выполнить поиск по строке поиска, но если строка поиска уникальна (содержит редкие записи) или занимает много времени, потребовалось время, чтобы просмотреть все записи, а затем вернуть результат, который время дорого.
Я уже использую индексирование (ts_vector, GIN), но без помощи.

Поисковый запрос:

explain analyze 
Select  "SNR_SKU",
        "SNR_Title",
        "SNR_ModelNo",
        "SNR_Brand",
        "SNR_UPC",
        "SNR_Available",
        "SNR_ProductURL",
        "SNR_ImageURL",
        "SNR_Description",
        "SNR_isShow",
        "SNR_Date",
        "SNR_Category",
        "SNR_Condition",
        "SNR_SubCategory",
        "SNR_PriceBefore",
        "SNR_CustomerReviews",
        "SNR_Price"
from (
  Select *,
         similarity('apple iphone 5s 16gb',"SNR_Title") as rank
  from products_allproducts 
  Where "SNR_Title" ~ 'apple' 
    AND "SNR_Title" ~ 'iphone' 
    AND "SNR_Title" ~ '5s' 
    AND "SNR_Title" ~ '16gb' 
  ORDER BY rank DESC LIMIT 36 OFFSET 0
) AS rankTable;
 QUERY PLAN                                                                                             
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Subquery Scan on ranktable  (cost=1974848.30..1974848.32 rows=1 width=450) (actual time=16316.394..16316.395 rows=1 loops=1)
   ->  Limit  (cost=1974848.30..1974848.31 rows=1 width=490) (actual time=16316.392..16316.393 rows=1 loops=1)
         ->  Sort  (cost=1974848.30..1974848.31 rows=1 width=490) (actual time=16316.391..16316.391 rows=1 loops=1)
               Sort Key: (similarity('apple iphone 5s 16gb'::text, (products_allproducts."SNR_Title")::text)) DESC
               Sort Method: quicksort  Memory: 25kB
               ->  Gather  (cost=1000.00..1974848.29 rows=1 width=490) (actual time=16302.006..16316.383 rows=1 loops=1)
                     Workers Planned: 2
                     Workers Launched: 2
                     ->  Parallel Seq Scan on products_allproducts  (cost=0.00..1973848.19 rows=1 width=490) (actual time=11275.609..16294.657 rows=0 loops=3)
                           Filter: ((("SNR_Title")::text ~ 'apple'::text) AND (("SNR_Title")::text ~ 'iphone'::text) AND (("SNR_Title")::text ~ '5s'::text) AND (("SNR_Title")::text ~ '16gb'::text))
                           Rows Removed by Filter: 6722677
Planning time: 0.902 ms
Execution time: 16462.318 ms
(13 rows)

Спасибо.

Вот мой план запроса: enter image description here

...