2014-05-06 46 views
1
  1. 连接是越多越好(主要性能明智)做的事:PostgreSQL的:内对特定值

    SELECT u.email, s.id 
    FROM users s, sessions s 
    WHERE u.id = s.user_id 
    AND u.id = 1 
    

    或:

    SELECT u.email, s.id 
    FROM users s, sessions s 
    WHERE u.id = 1 
    AND s.user_id = 1 
    
  2. 什么:

    DELETE FROM users u 
    USING sessions s 
    WHERE u.id = s.user_id 
    AND u.id = 1 
    AND s.id = 2 
    RETURNING TRUE; 
    

    或者:

    DELETE FROM users u 
    USING sessions s 
    WHERE u.id = 1 
    AND s.user_id = 1 
    AND s.id = 2 
    RETURNING TRUE; 
    

表模式:

CREATE EXTENSION "uuid-ossp"; 

CREATE TABLE users (
    id bigserial PRIMARY KEY, 
    email varchar(254) NOT NULL, 
    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
); 
CREATE UNIQUE INDEX on users (lower(email)); 

CREATE TABLE sessions (
    user_id bigint PRIMARY KEY REFERENCES users ON DELETE CASCADE, 
    id uuid NOT NULL DEFAULT uuid_generate_v4(), 
    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
); 

回答

2

每当你指定值的潜在范围内的特定值代替,具有恒定的值应该是与索引更快(虽然它可能查询不是那么巨大)。

您可以通过EXPLAIN ANALYZE查看估计值与实际值。

我相信,由于查询的第一部分是查看两列是否相等,因此需要将它们全部进行比较,然后再通过查询的第二部分进行过滤。

如果您事先都知道这两个值,我认为它不仅可能表现更好,而且它在代码中的读取更好,以便明确指定。

编辑: 注:对于数据量小,查询计划看起来几乎是相同的:

嵌套循环(成本= 0.30..16.34行= 1米的宽度为532 ) - >在用户u上使用users_pkey进行索引扫描(成本= 0.14..8.16行= 1宽度= 524)索引条件:(id = 1) - >使用会话s上的sessions_pkey索引扫描(成本= 0.15..8.17行= 1宽度= 24)索引条件:(user_id = 1)

嵌套循环(成本= 0.30..16.34行= 1宽度= 532) - >使用用户u上的users_pkey进行索引扫描(成本= 0.14..8.16行= 1宽度= 516)索引条目:(id = 1) - >使用会话s上的sessions_pkey索引扫描(成本= 0.15..8.17行= 1米的宽度为16)指标电导率:(USER_ID = 1)

SQL小提琴:http://sqlfiddle.com/#!15/c9ac7/4

然而,你应该用你的数据集的尝试,以确认查询规划器选择了相同的计划在这两种情况下与你的数据。