I'm not very experienced with database query optimization. I've been reading through similar questions here and Postgres tuning articles online, but unfortunately I haven't had any luck. Here's what I have (DB version, table information, number of rows, `EXPLAIN ANALYZE` of the two queries I would like to optimize):

    foodb=# SELECT version();
                                                        version
    ---------------------------------------------------------------------------------------------------------------
     PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52), 64-bit
    (1 row)
    
    foodb=# \d+ datapoints
                                    Table "public.datapoints"
     Column |            Type             | Modifiers | Storage  | Stats target | Description
    --------+-----------------------------+-----------+----------+--------------+-------------
     tag    | character varying(200)      | not null  | extended |              |
     time   | timestamp without time zone | not null  | plain    |              |
     value  | double precision            |           | plain    |              |
    Indexes:
        "ix_datapoints_tag" btree (tag)
        "ix_datapoints_tag_time_value" btree (tag, "time", value)
    Has OIDs: no
    
    foodb=# SELECT COUNT(*) FROM datapoints;
       count
    -----------
     162727709
    (1 row)
    
    foodb=# EXPLAIN ANALYZE SELECT DISTINCT tag FROM datapoints;
                                                                  QUERY PLAN
    --------------------------------------------------------------------------------------------------------------------------------------
     HashAggregate  (cost=5035440.60..5035691.99 rows=25139 width=106) (actual time=74304.278..74357.708 rows=218367 loops=1)
       ->  Seq Scan on datapoints  (cost=0.00..4641784.68 rows=157462368 width=106) (actual time=0.019..24484.872 rows=162727709 loops=1)
     Total runtime: 74371.153 ms
    (3 rows)
    
    foodb=# EXPLAIN ANALYZE SELECT tag, min(time) as minTime, max(time) as maxTime FROM datapoints GROUP BY tag;
                                                                  QUERY PLAN
    --------------------------------------------------------------------------------------------------------------------------------------
     HashAggregate  (cost=5822752.44..5823003.83 rows=25139 width=114) (actual time=86848.009..86908.264 rows=218367 loops=1)
       ->  Seq Scan on datapoints  (cost=0.00..4641784.68 rows=157462368 width=114) (actual time=0.010..19226.031 rows=162727709 loops=1)
     Total runtime: 86922.564 ms
    (3 rows)

I tried to make the following configuration changes in `postgresql.conf`, but couldn't see much performance improvement:

    max_connections = 128 // was 300
    work_mem = 64m // was 8m
    shared_buffers = 4096m // was 128m
    effective_cache_size = 4096m // was 128m

What do you suggest so that I can improve the performance of these two queries?

    SELECT DISTINCT tag FROM datapoints;
    SELECT tag, min(time) as minTime, max(time) as maxTime FROM datapoints GROUP BY tag;

**Update 1:**

Turning off sequential scan doesn't seem to help much.

    foodb=# set enable_seqscan = off;
    SET
    foodb=# EXPLAIN ANALYZE SELECT DISTINCT tag FROM datapoints;
                                                                                  QUERY PLAN
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
     Unique  (cost=0.82..591769146.07 rows=25139 width=106) (actual time=0.037..81086.671 rows=218367 loops=1)
       ->  Index Only Scan using ix_datapoints_tag on datapoints  (cost=0.82..591375490.15 rows=157462368 width=106) (actual time=0.033..54393.956 rows=162727709 loops=1)
             Heap Fetches: 162727709
     Total runtime: 81104.455 ms
    (4 rows)