The problem has returned back, and here's the results, as you've said it's faster now:
SET enable_seqscan=off; EXPLAIN ANALYZE SELECT "v"."id", "v"."title" FROM "video" AS "v" WHERE (v.active) AND (v.fts @@ 'dexter:A|season:A|seri:A|декстер:A|качество:A|сезон:A|серия:A'::tsquery and v.id <> 500563 ) ORDER BY COALESCE(ts_rank_cd( '{0.1, 0.2, 0.7, 1.0}', v.fts, 'dexter:A|season:A|seri:A|декстер:A|качество:A|сезон:A|серия:A'::tsquery), 1) DESC, v.views DESC LIMIT 6 Limit (cost=219631.83..219631.85 rows=6 width=287) (actual time=1850.567..1850.570 rows=6 loops=1) -> Sort (cost=219631.83..220059.05 rows=170886 width=287) (actual time=1850.565..1850.566 rows=6 loops=1) Sort Key: (COALESCE(ts_rank_cd('{0.1,0.2,0.7,1}'::real[], fts, '( ( ( ( ( ''dexter'':A | ''season'':A ) | ''seri'':A ) | ''декстер'':A ) | ''качество'':A ) | ''сезон'':A ) | ''серия'':A'::tsquery), 1::real)), views Sort Method: top-N heapsort Memory: 26kB -> Bitmap Heap Scan on video v (cost=41180.92..216568.73 rows=170886 width=287) (actual time=214.842..1778.830 rows=103087 loops=1) Recheck Cond: (fts @@ '( ( ( ( ( ''dexter'':A | ''season'':A ) | ''seri'':A ) | ''декстер'':A ) | ''качество'':A ) | ''сезон'':A ) | ''серия'':A'::tsquery) Filter: (active AND (id <> 500563)) -> Bitmap Index Scan on idx_video_fts (cost=0.00..41138.20 rows=218543 width=0) (actual time=170.206..170.206 rows=171945 loops=1) Index Cond: (fts @@ '( ( ( ( ( ''dexter'':A | ''season'':A ) | ''seri'':A ) | ''декстер'':A ) | ''качество'':A ) | ''сезон'':A ) | ''серия'':A'::tsquery) Total runtime: 1850.632 ms Should I use this instead? 2011/1/15 Robert Haas <robertmh...@gmail.com> > On Tue, Jan 11, 2011 at 3:16 AM, Rauan Maemirov <ra...@maemirov.com> > wrote: > > Hi, Kevin. > > Sorry for long delay. > > EXPLAIN ANALYZE SELECT "v"."id", "v"."title" FROM "video" AS "v" > > WHERE (v.active) AND (v.fts @@ > > 'dexter:A|season:A|seri:A|декстер:A|качество:A|сезон:A|серия:A'::tsquery > and > > v.id <> 500563 ) > > ORDER BY COALESCE(ts_rank_cd( '{0.1, 0.2, 0.7, 1.0}', v.fts, > > > 'dexter:A|season:A|seri:A|декстер:A|качество:A|сезон:A|серия:A'::tsquery), > > 1) DESC, v.views DESC > > LIMIT 6 > > "Limit (cost=103975.50..103975.52 rows=6 width=280) (actual > > time=2893.193..2893.199 rows=6 loops=1)" > > " -> Sort (cost=103975.50..104206.07 rows=92228 width=280) (actual > > time=2893.189..2893.193 rows=6 loops=1)" > > " Sort Key: (COALESCE(ts_rank_cd('{0.1,0.2,0.7,1}'::real[], fts, > '( ( > > ( ( ( ''dexter'':A | ''season'':A ) | ''seri'':A ) | ''декстер'':A ) | > > ''качество'':A ) | ''сезон'':A ) | ''серия'':A'::tsquery), 1::real)), > views" > > " Sort Method: top-N heapsort Memory: 25kB" > > " -> Seq Scan on video v (cost=0.00..102322.34 rows=92228 > > width=280) (actual time=0.100..2846.639 rows=54509 loops=1)" > > " Filter: (active AND (fts @@ '( ( ( ( ( ''dexter'':A | > > ''season'':A ) | ''seri'':A ) | ''декстер'':A ) | ''качество'':A ) | > > ''сезон'':A ) | ''серия'':A'::tsquery) AND (id <> 500563))" > > "Total runtime: 2893.264 ms" > > Table scheme: > > CREATE TABLE video > > ( > > id bigserial NOT NULL, > > hash character varying(12), > > account_id bigint NOT NULL, > > category_id smallint NOT NULL, > > converted boolean NOT NULL DEFAULT false, > > active boolean NOT NULL DEFAULT true, > > title character varying(255), > > description text, > > tags character varying(1000), > > authorized boolean NOT NULL DEFAULT false, > > adult boolean NOT NULL DEFAULT false, > > views bigint DEFAULT 0, > > rating real NOT NULL DEFAULT 0, > > screen smallint DEFAULT 2, > > duration smallint, > > "type" smallint DEFAULT 0, > > mp4 smallint NOT NULL DEFAULT 0, > > size bigint, > > size_high bigint DEFAULT 0, > > source character varying(255), > > storage_id smallint NOT NULL DEFAULT 1, > > rule_watching smallint, > > rule_commenting smallint, > > count_comments integer NOT NULL DEFAULT 0, > > count_likes integer NOT NULL DEFAULT 0, > > count_faves integer NOT NULL DEFAULT 0, > > fts tsvector, > > modified timestamp without time zone NOT NULL DEFAULT now(), > > created timestamp without time zone DEFAULT now(), > > CONSTRAINT video_pkey PRIMARY KEY (id), > > CONSTRAINT video_hash_key UNIQUE (hash) > > ) > > WITH ( > > OIDS=FALSE > > ); > > Indexes: > > CREATE INDEX idx_video_account_id ON video USING btree (account_id); > > CREATE INDEX idx_video_created ON video USING btree (created); > > CREATE INDEX idx_video_fts ON video USING gin (fts); > > CREATE INDEX idx_video_hash ON video USING hash (hash); > > (here I tried both gist and gin indexes) > > I have 32Gb ram and 2 core quad E5520, 2.27GHz (8Mb cache). > > Pgsql conf: > > max_connections = 200 > > shared_buffers = 7680MB > > work_mem = 128MB > > maintenance_work_mem = 1GB > > effective_cache_size = 22GB > > default_statistics_target = 100 > > Anything else? > > For returning that many rows, an index scan might actually be slower. > Maybe it's worth testing. Try: > > SET enable_seqscan=off; > EXPLAIN ANALYZE ... > > and see what you get. If it's slower, well, then be happy it didn't > use the index (maybe the question is... what index should you have > instead?). If it's faster, post the results... > > -- > Robert Haas > EnterpriseDB: http://www.enterprisedb.com > The Enterprise PostgreSQL Company >