我想从一个很大的表中读取所有行。但是执行SELECT *
无效,可能是因为表从row=1
1到rows=117051923
很大,所以当我执行时,它一直没有结果运行(最终连接到postgres
休息)。
supplier=> SELECT * FROM my_table;
Killed
$Akil
我不想使用LIMIT / OFFSET,因为我必须保留要读取的行范围设置(图像超过1.17亿行)。有没有一种方法可以让查询运行一些行(比如查克)。纯sql,未使用语言实现。
答案 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;