如何合并以下SQL查询以提高性能?

时间:2018-02-24 14:21:43

标签: sql postgresql

我有两个SQL查询:

  1. 以下查询以千位(13000)的形式返回记录并继续增长。

    SELECT distinct city FROM users;
    
  2. 上述查询的结果将成为下一个SQL查询的参数:

    SELECT CAST(users.lat as VARCHAR) AS latitude, 
           CAST(users.lng as VARCHAR) AS longitude,
            users.city as city,
            users.state as state 
    FROM users users 
    WHERE users .city='';
    
  3. 我通过使用IN子句将第一个查询作为子查询来合并这两个查询,如下所示:

    SELECT CAST(users.lat as VARCHAR) AS latitude, 
           CAST(users.lng as VARCHAR) AS longitude,
           users.city as city, 
           users.state as state 
    FROM users users 
    WHERE users.city IN (SELECT distinct us.city FROM users us);
    

    需要知道这是否可以进一步优化。

    DDL:

    CREATE TABLE users
    (
      id uuid NOT NULL,
      language_id integer NOT NULL,
      lat numeric NOT NULL,
      lng numeric NOT NULL,
      state character varying,
      city character varying,
      CONSTRAINT users_pkey PRIMARY KEY (id)
    );
    

1 个答案:

答案 0 :(得分:3)

第一条评论。使用distinct时,您不需要in。所以这个where子句就足够了:

WHERE users.city IN (SELECT us.city FROM users us);

其次,使用不同的表名作为另一个表的别名是非常误导的。代替:

SELECT CAST(fru.lat as VARCHAR) AS latitude, 
       CAST(fru.lng as VARCHAR) AS longitude,
       fru.city as city, 
       fru.state as state 
FROM farmrise.users fru 
WHERE fru.city IN (SELECT u.city FROM users u);

大多数数据库都会为此生成一个好的查询计划。就个人而言,我倾向于将其写成;

FROM farmrise.users fru 
WHERE EXISTS (SELECT 1 FROM users u WHERE u.city = fru.city);

这肯定会利用users(city)上的索引。

最后,在大多数数据库中,您需要VARCHARCAST()的长度。实际上,除了MySQL和衍生数据库之外,你应该在任何数据库中都有一个长度。

相关问题