从很大的表中读取行

时间:2019-04-25 14:13:03

标签: sql postgresql

我想从一个很大的表中读取所有行。但是执行SELECT *无效,可能是因为表从row=1 1到rows=117051923很大,所以当我执行时,它一直没有结果运行(最终连接到postgres休息)。

supplier=> SELECT * FROM my_table;
Killed
$Akil

我不想使用LIMIT / OFFSET,因为我必须保留要读取的行范围设置(图像超过1.17亿行)。有没有一种方法可以让查询运行一些行(比如查克)。纯sql,未使用语言实现。

2 个答案:

答案 0 :(得分:1)

如果在psql中,则可以通过调整FETCH_COUNT来调整一次返回多少行。这样可以防止内存不足。

\set FETCH_COUNT 10000

或者,使用\ copy将数据复制到文件中,然后使用您喜欢的寻呼机(更少或更多)进行浏览。

\copy my_table TO 'my_table.txt'

答案 1 :(得分:0)

在postgres中,最好的方法是使用游标:https://www.postgresql.org/docs/current/plpgsql-cursors.html

示例:

CREATE OR REPLACE FUNCTION get_film_titles(p_year INTEGER)
   RETURNS text AS $$
DECLARE 
 titles TEXT DEFAULT '';
 rec_film   RECORD;
 cur_films CURSOR(p_year INTEGER) 
 FOR SELECT title, release_year
 FROM film
 WHERE release_year = p_year;
BEGIN
   -- Open the cursor
   OPEN cur_films(p_year);

   LOOP
    -- fetch row into the film
      FETCH cur_films INTO rec_film;
    -- exit when no more row to fetch
      EXIT WHEN NOT FOUND;

    -- build the output
      IF rec_film.title LIKE '%ful%' THEN 
         titles := titles || ',' || rec_film.title || ':' || rec_film.release_year;
      END IF;
   END LOOP;

   -- Close the cursor
   CLOSE cur_films;

   RETURN titles;
END; $$

LANGUAGE plpgsql;