Sql 在申报时

Sql 在申报时,sql,postgresql,plpgsql,syntactic-sugar,Sql,Postgresql,Plpgsql,Syntactic Sugar,短类型名称 删除了多余的括号 我在查询中添加了表别名和表限定,这在本例中不是必需的,但这是避免plpgsql函数中命名冲突的良好实践 在last\u post\u at字段上有一个索引,我希望查询编译器在索引上有正确的统计信息,以快速确定索引的哪个子集符合where子句。如果查询编译器和执行引擎不能做到这一点,我会非常惊讶。我也在SQLServer中完成了这种分页,它的工作方式与我前面描述的一样。一旦有了足够的数据,我将查看查询计划并发回:DAlso,这有点离题了。我还希望查询的行为是无状态的,

短类型名称

  • 删除了多余的括号

  • 我在查询中添加了表别名和表限定,这在本例中不是必需的,但这是避免plpgsql函数中命名冲突的良好实践


  • last\u post\u at
    字段上有一个索引,我希望查询编译器在索引上有正确的统计信息,以快速确定索引的哪个子集符合
    where
    子句。如果查询编译器和执行引擎不能做到这一点,我会非常惊讶。我也在SQLServer中完成了这种分页,它的工作方式与我前面描述的一样。一旦有了足够的数据,我将查看查询计划并发回:DAlso,这有点离题了。我还希望查询的行为是无状态的,谁在乎在分页之间是否有新主题进入论坛。这是一个基于网络的论坛的工作原理。(参见编辑)嗯,在执行子查询时,它没有考虑外部查询中的where子句。如果可能的话,我必须考虑重写查询。我可以在批处理模式下进行行编号,因为我没有实时浏览论坛。在
    last\u post\u at
    字段上有一个索引,我希望查询编译器在索引上有正确的统计信息,以快速确定索引的哪个子集符合
    where
    子句。如果查询编译器和执行引擎不能做到这一点,我会非常惊讶。我也在SQLServer中完成了这种分页,它的工作方式与我前面描述的一样。一旦有了足够的数据,我将查看查询计划并发回:DAlso,这有点离题了。我还希望查询的行为是无状态的,谁在乎在分页之间是否有新主题进入论坛。这是一个基于网络的论坛的工作原理。(参见编辑)嗯,在执行子查询时,它没有考虑外部查询中的where子句。如果可能的话,我必须考虑重写查询。我可以在批处理模式下进行行编号,因为我不是实时对论坛进行排序。+1,但因为这是一个离题的问题,关于我所说的语法糖的想法?如果你能回答Q1和Q2,我会接受:DOh-wow,limit和offset比我写的问题快5-10倍:D+1,但因为这是一个离题的问题,关于我所说的语法糖的想法?如果你能回答Q1和Q2,我会接受:DOh-wow,limit和offset比我写的查询快5-10倍:谢谢,我想这是最接近的了——也就是说,通过使用
    从存储的_函数中选择新的形状字段(…)。我甚至没有考虑过这种方法。谢谢,我想这是接近的,也就是说,通过使用<代码>来调整表格>从StuteDyStof(…)选择新的形状字段;<代码>。我甚至没有考虑这种方法。
    
    DROP TYPE IF EXISTS topic_result_entry CASCADE;
    CREATE TYPE topic_result_entry AS
    (
        id            INTEGER,  
        last_post_at  TIMESTAMP WITHOUT TIME ZONE,
        is_sticky     BOOLEAN,
        is_poll       BOOLEAN,
        has_prefix    BOOLEAN,
        prefix        CHARACTER VARYING,
        title         CHARACTER VARYING,
        post_count    INTEGER,
        started_by    INTEGER,
        started_at    TIMESTAMP WITHOUT TIME ZONE
    );
    
    CREATE OR REPLACE FUNCTION get_paginated_topics(
        forum_id_ INTEGER, category_id_ INTEGER, page_number_ INTEGER, topics_per_page_ INTEGER)
    RETURNS SETOF topic_result_entry as $$
    DECLARE
        zero_based_index INTEGER;
        lower_offset INTEGER;
        upper_offset INTEGER;
    
    BEGIN                    
        zero_based_index := page_number_ -1;
        lower_offset := zero_based_index * topics_per_page_;
        upper_offset := ( (topics_per_page_ * page_number_) + 1 );               
    
        RETURN query
        select id,last_post_at, is_sticky, is_poll, 
               has_prefix, prefix, title,post_count, 
               started_by, started_at 
        from (
            select row_number() OVER(ORDER by last_post_at desc) as rn, * 
            from forum_topics where category_id = category_id_ and forum_id= forum_id_
        ) as foo
        where rn > lower_offset and rn < upper_offset;
    END;
    $$ LANGUAGE plpgsql;
    
    select id,last_post_at, is_sticky, is_poll, 
           has_prefix, prefix, title,post_count, 
           started_by, started_at 
    from (
        select row_number() OVER(ORDER by last_post_at desc) as rn, * 
        from forum_topics where category_id = 72
    ) as foo
    where rn>0 and rn<22
    
    QUERY PLAN  
    Subquery Scan on foo  (cost=0.00..492.20 rows=28 width=60)  
      Filter: ((foo.rn > 0) AND (foo.rn < 22))  
      ->  WindowAgg  (cost=0.00..409.42 rows=5519 width=156)    
            ->  Index Scan using forum_topics_last_post_at_idx1 on forum_topics  (cost=0.00..326.63 rows=5519 width=156)    
                  Filter: (category_id = 72)
    
    select id, last_post_at, is_sticky, is_poll, 
           has_prefix, prefix, title, post_count, 
           started_by, started_at 
      from forum_topics
     where category_id = category_id_ and forum_id = forum_id_
     order by id
     limit topics_per_page_
    offset (page_number_ - 1) * topics_per_page_
    ;
    
    
    CREATE OR REPLACE FUNCTION get_paginated_topics(
        _forum_id int, _category_id int, _page_number int, _topics_per_page int)
    RETURNS SETOF forum_topics AS
    $BODY$
    DECLARE
       _lower_offset  int := (_page_number - 1) * _topics_per_page;
       _upper_offset  int := _topics_per_page * _page_number + 1;
    BEGIN
    
       RETURN QUERY
       SELECT *
       FROM   forum_topics f
       WHERE  f.category_id = category_id_
       AND    f.forum_id = forum_id_
       ORDER  BY f.last_post_at DESC
       LIMIT  _lower_offset
       OFFSET _upper_offset;
    
    END;
    $BODY$ LANGUAGE plpgsql;