Обсуждение: Seq scan vs index scan

Поиск
Список
Период
Сортировка

Seq scan vs index scan

От
arun chirappurath
Дата:
Hi All,

I have a table named  users with index on user name.

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    age INT
);

CREATE INDEX idx_username ON users (username);

When I try to do below select query it's taking seq scan and query returns in 5ms.

SELECT * FROM users WHERE username = 'example_username';

I am trying to force query to use indexes  using query hints.

Set enable indexscan to ON,
Same for bitmap and index only scan

and ran the query. 

However it still uses seq scan instead of index scan.

1. Is there a way to force query to use an index? With out changing default settings of postgres rds

 2. Modifying random page cost is desired the way or hint extension? In which case do we use this?will it affect selecting index for all queries

3.i have done analyze on the table and tried recreating index..why is it still taking seq scan?

In Sql server we can force query just by proving it directly in query.

USE AdventureWorks
GO
SELECT c.ContactID
FROM Person.Contact c
WITH (INDEX(AK_Contact_rowguid))
INNER JOIN Person.Contact pc
WITH (INDEX(PK_Contact_ContactID))
ON c.ContactID = pc.ContactID
GO


Thanks,
Arun

Re: Seq scan vs index scan

От
Christophe Pettus
Дата:

> On Mar 22, 2024, at 20:55, arun chirappurath <arunsnmimt@gmail.com> wrote:
> I am trying to force query to use indexes  using query hints.

PostgreSQL does not have query hints.  Enabling index scans using parameters doesn't *disable* other types of query
nodes.

You can disable sequential scans using:

    SET enable_seqscan = off;

... but more importantly, why do you want to force an index scan?  Generally, PostgreSQL will pick a sequential scan
overan index scan if the table is small, or the number of rows that come back from the query are a significant
percentageof the rows of the table. 

If you would like a more detailed answer, it would be a good idea to post an execution plan of the query with:

    EXPLAIN ANALYZE SELECT * FROM users WHERE username = 'example_username';


Re: Seq scan vs index scan

От
"David G. Johnston"
Дата:
On Fri, Mar 22, 2024 at 8:55 PM arun chirappurath <arunsnmimt@gmail.com> wrote:

I am trying to force query to use indexes  using query hints.

Set enable indexscan to ON,
Same for bitmap and index only scan

Everything is on by default in the planner.  You need to think in terms of what you don't want to happen and disabled those things.

David J.

Re: Seq scan vs index scan

От
Tom Lane
Дата:
arun chirappurath <arunsnmimt@gmail.com> writes:
> I have a table named  users with index on user name.
> ...
> When I try to do below select query it's taking seq scan and query returns
> in 5ms.

5ms is an okay runtime, I would think.  Is the table empty?

> I am trying to force query to use indexes  using query hints.

The way to force it would be enable_seqscan = off.  I would not
be surprised to hear that that makes it slower, though.  The
planner will prefer not to use an index if it thinks that will
be slower, and in this case it sounds like that could be right.
(Don't ever assume that what the planner does with a small table
is what it will do with a large table.)

            regards, tom lane



Re: Seq scan vs index scan

От
arun chirappurath
Дата:
Thanks Tom,David and Chris for detailed opinions

Regards,
Arun

On Sat, 23 Mar 2024 at 09:25, arun chirappurath <arunsnmimt@gmail.com> wrote:
Hi All,

I have a table named  users with index on user name.

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    age INT
);

CREATE INDEX idx_username ON users (username);

When I try to do below select query it's taking seq scan and query returns in 5ms.

SELECT * FROM users WHERE username = 'example_username';

I am trying to force query to use indexes  using query hints.

Set enable indexscan to ON,
Same for bitmap and index only scan

and ran the query. 

However it still uses seq scan instead of index scan.

1. Is there a way to force query to use an index? With out changing default settings of postgres rds

 2. Modifying random page cost is desired the way or hint extension? In which case do we use this?will it affect selecting index for all queries

3.i have done analyze on the table and tried recreating index..why is it still taking seq scan?

In Sql server we can force query just by proving it directly in query.

USE AdventureWorks
GO
SELECT c.ContactID
FROM Person.Contact c
WITH (INDEX(AK_Contact_rowguid))
INNER JOIN Person.Contact pc
WITH (INDEX(PK_Contact_ContactID))
ON c.ContactID = pc.ContactID
GO


Thanks,
Arun