我有以下psql表。它总共约有20亿行。
id word lemma pos textid source
1 Stuffing stuff vvg 190568 AN
2 her her appge 190568 AN
3 key key nn1 190568 AN
4 into into ii 190568 AN
5 the the at 190568 AN
6 lock lock nn1 190568 AN
7 she she appge 190568 AN
8 pushed push vvd 190568 AN
9 her her appge 190568 AN
10 way way nn1 190568 AN
11 into into ii 190568 AN
12 the the appge 190568 AN
13 house house nn1 190568 AN
14 . . 190568 AN
15 She she appge 190568 AN
16 had have vhd 190568 AN
17 also also rr 190568 AN
18 cajoled cajole vvd 190568 AN
19 her her appge 190568 AN
20 way way nn1 190568 AN
21 into into ii 190568 AN
22 the the at 190568 AN
23 home home nn1 190568 AN
24 . . 190568 AN
.. ... ... .. ... ..
我想创建一个下表,该表并排显示所有“ way”结构以及“ source”,“ lemma”和“ pos”列中的一些数据。
source word word word lemma pos word word word word word lemma pos word word
AN lock she pushed push vvd her way into the house house nn1 . she
AN had also cajoled cajole vvd her way into the home home nn1 . A
AN tried to force force vvi her way into the palace palace nn1 , officials
在这里,您可以看到我使用的代码:
copy(
SELECT c1.source, c1.word, c2.word, c3.word, c4.word, c4.lemma, c4.pos, c5.word, c6.word, c7.word, c8.word, c9.word, c9.lemma, c9.pos, c10.word, c11.word
FROM
orderedflatcorpus AS c1, orderedflatcorpus AS c2, orderedflatcorpus AS c3, orderedflatcorpus AS c4, orderedflatcorpus AS c5, orderedflatcorpus AS c6, orderedflatcorpus AS c7, orderedflatcorpus AS c8, orderedflatcorpus AS c9, orderedflatcorpus AS c10, orderedflatcorpus AS c11
WHERE
c1.word LIKE '%' AND
c2.word LIKE '%' AND
c3.word LIKE '%' AND
c4.pos LIKE 'v%' AND
c5.pos = 'appge' AND
c6.lemma = 'way' AND
c7.pos LIKE 'i%' AND
c8.word = 'the' AND
c9.pos LIKE 'n%' AND
c10.word LIKE '%' AND
c11.word LIKE '%'
AND
c1.id + 1 = c2.id AND c1.id + 2 = c3.id AND c1.id + 3 = c4.id AND c1.id + 4 = c5.id AND c1.id + 5 = c6.id AND c1.id + 6 = c7.id AND c1.id + 7 = c8.id AND c1.id + 8 = c9.id AND c1.id + 9 = c10.id AND c1.id + 10 = c11.id
ORDER BY c1.id
)
TO
'/home/postgres/Results/OUTPUT.csv'
DELIMITER E'\t'
csv header;
该查询需要花费近9个小时来执行20亿行(结果大约有19,000行)。
我该怎么做才能提高性能?
word,pos和lemma列已经具有btree索引。
我应该坚持我的代码,仅使用功能更强大的服务器,使用更多内核/更快的CPU和更多RAM(我的RAM只有8 GB,只有2个内核和2.8
GHz)吗?还是您会建议使用其他更有效的SQL查询?
谢谢!
我建议使用现代的连接语法,它可以很好地解决此问题:
SELECT
c1.source, c1.word, c2.word, c3.word, c4.word, c4.lemma, c4.pos, c5.word, c6.word, c7.word, c8.word, c9.word, c9.lemma, c9.pos, c10.word, c11.word
FROM orderedflatcorpus AS c1
JOIN orderedflatcorpus AS c2 ON c1.id + 1 = c2.id
JOIN orderedflatcorpus AS c3 ON c1.id + 2 = c3.id
JOIN orderedflatcorpus AS c4 ON c1.id + 3 = c4.id
JOIN orderedflatcorpus AS c5 ON c1.id + 4 = c5.id
JOIN orderedflatcorpus AS c6 ON c1.id + 5 = c6.id
JOIN orderedflatcorpus AS c7 ON c1.id + 6 = c7.id
JOIN orderedflatcorpus AS c8 ON c1.id + 7 = c8.id
JOIN orderedflatcorpus AS c9 ON c1.id + 8 = c9.id
JOIN orderedflatcorpus AS c10 ON c1.id + 9 = c10.id
JOIN orderedflatcorpus AS c11 ON c1.id + 10 = c11.id
WHERE c4.pos LIKE 'v%'
AND c5.pos = 'appge'
AND c6.lemma = 'way'
AND c7.pos LIKE 'i%'
AND c8.word = 'the'
AND c9.pos LIKE 'n%'
笔记:
LIKE
的已删除ORDER BY
删除,因为它非常昂贵。CSV(如表格行)不需要排序即可生效。如果绝对需要排序,请在执行查询后使用命令行工具对其进行排序。问题内容: 我正在尝试执行这样的查询: 问题是我要过滤的ID列表不是恒定的,并且每次执行时都必须不同。我还需要转义这些id,因为它们可能来自不受信任的来源,尽管我实际上将转义查询中的所有内容,而不管该来源的可信度如何。 节点的Postgres似乎与绑定参数专门工作:; 如果我具有已知数量的值(),这将起作用,但不能直接用于数组:,因为似乎对数组参数没有任何特殊处理。 根据数组中的项目数动态构建查询
我为每个日期创建了多个表来存储每个日期的一些信息。例如历史3108、历史0109..所有这些表共享相同的模式。有时候,我需要查询多个表,获取记录的行数和计数。在oracle和SQL Server中,最快的方法是什么? 目前我正在这样做。。。 当我需要多个表的计数时:为每个表选择计数(*),然后添加 当我需要多个表的记录时:从表1中选择*,从表2中选择*(基本上为每个表选择*) 如果我们在一个事务中
问题内容: 我正在尝试调整SQL查询以检查服务器上每个数据库中存在的特定字段中存在的值。 有100个单独的数据库,我想检查每个数据库的特定记录。 答案可能是使用下面的命令,但是我很难适应它。 我在下面的链接上获得了更大的成功; https://stackoverflow.com/a/18462734/3461845 我需要能够执行以下查询: 并且还为返回的每一行拉回数据库的名称; 任何帮助是极大的
问题内容: 我有以下只需1秒即可执行的sql查询: 但是我需要一个结果集来获取比率大于0的结果。因此,当我将查询更改为此时,需要7分钟的时间来执行: 为什么这会使查询时间从1秒增加到7分钟?由于b表很大,因此我什至尝试使用CTE,但这也没有提高性能。我认为使用CTE可以从中筛选出较小的一组值,因此应该更快一些,但这无济于事: 我不能包括执行计划,因为除了查询之外,我没有对数据库的权限。 问题答案:
我使用此函数运行SQL查询: 但是我得到了这个错误 2017-08-05 18:54:18,421 INFOsqlalchemy.engine.base.Engine(4L,)2017-08-05 18:54:18,424 INFOsqlalchemy.engine.base.Engine COMMIT127.0.0.1--[05/Aug/2017 18:54:18]"GET/HTTP/1.1"2
问题内容: 我有一个表,其中有一个索引(A列,B列)。我正在运行一个查询,如下所示: 这个查询很慢!该计划如下所示: Postgres似乎没有一次对5000个值进行一次索引扫描,而是一次对5000个值进行了一次索引扫描,这解释了为什么查询如此缓慢。 实际上,这样做是更快的方法: 获取结果,然后在应用程序内的B列上进行过滤(python)。 我真的更希望结果已经由Postgres在合理的运行时间下进