gpt4 book ai didi

sql - 提高 PostgreSQL 中的查询速度

转载 作者:行者123 更新时间:2023-11-29 14:08:01 28 4
gpt4 key购买 nike

我的数据库查询时间很慢(目前所有测试都是在本地进行的)并且不确定如何处理。数据库本身有 44 个表,其中一些表有超过 100 万条记录(主要是电影、女 Actor 和类型转换)。

该表是通过 JMDB 使用 IMDB 上的平面文件制作的。另外,我将要展示的 SQL 查询来自上述程序(搜索时间也非常慢)。我已尝试包含尽可能多的信息,例如查询计划等。

"QUERY PLAN"<br /> 
"HashAggregate (cost=46492.52..46493.50 rows=98 width=46)"<br />
" Output: public.movies.title, public.movies.movieid, public.movies.year"<br />
" -> Append (cost=39094.17..46491.79 rows=98 width=46)"<br />
" -> HashAggregate (cost=39094.17..39094.87 rows=70 width=46)"<br />
" Output: public.movies.title, public.movies.movieid, public.movies.year"<br />
" -> Seq Scan on movies (cost=0.00..39093.65 rows=70 width=46)"<br />
" Output: public.movies.title, public.movies.movieid, public.movies.year"<br />
" Filter: (((title)::text ~~* '%Babe%'::text) AND ((title)::text !~~* '""%}'::text))"<br />
" -> Nested Loop (cost=0.00..7395.94 rows=28 width=46)"<br />
" Output: public.movies.title, public.movies.movieid, public.movies.year"<br />
" -> Seq Scan on akatitles (cost=0.00..7159.24 rows=28 width=4)"<br />
" Output: akatitles.movieid, akatitles.language, akatitles.title, <akatitles.addition"<br />
" Filter: (((title)::text ~~* '%Babe%'::text) AND ((title)::text !~~* '""%}'::text))"<br />
" -> Index Scan using movies_pkey on movies (cost=0.00..8.44 rows=1 width=46)"<br />
" Output: public.movies.movieid, public.movies.title, public.movies.year, public.movies.imdbid"
" Index Cond: (public.movies.movieid = akatitles.movieid)"<br />

SELECT * FROM (
(SELECT DISTINCT title, movieid, year
FROM movies
WHERE title ILIKE '%Babe%' AND NOT (title ILIKE '"%}'))
UNION
(SELECT movies.title, movies.movieid, movies.year
FROM movies
INNER JOIN akatitles ON movies.movieid=akatitles.movieid
WHERE akatitles.title ILIKE '%Babe%' AND NOT (akatitles.title ILIKE '"%}'))
) AS union_tmp2;

Returns 612 Rows in 9078ms<br />
Database backup (plain text) is 1.61GB

这是一个非常复杂的查询,我并不完全了解它,就像我说它是由 JMDB 吐出来的一样。

您对我如何提高速度有什么建议吗?

最佳答案

这是你的问题:

" -> Seq Scan on movies (cost=0.00..39093.65 rows=70 width=46)"
" Output: public.movies.title, public.movies.movieid, public.movies.year"
" Filter: (((title)::text ~~* '%Babe%'::text) AND ((title)::text !~~* '""%}'::text))"

顺序扫描和巨大的成本,因为数据库不能在 '%Babe%' 上使用任何索引。查看全文搜索,然后您可以创建适当的索引并让查询计划器使用它。

关于sql - 提高 PostgreSQL 中的查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2490098/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com