- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经创建了一个表来标记搜索
CREATE TABLE tsvector_business_objects (
id int4 NULL,
"type" varchar NULL,
value varchar NULL,
label varchar NULL,
synonyms _text NULL,
label_tsvector tsvector NULL
);
CREATE INDEX label_tsvector_idx ON tsvector_business_objects USING gin (label_tsvector);
CREATE INDEX lower_case_synonym_tsvector_business_objects ON tsvector_business_objects USING gin (synonyms);
CREATE INDEX txt_label_tsvector_business_objects ON tsvector_business_objects USING gin (to_tsvector('english'::regconfig, lower((label)::text)));
CREATE INDEX txt_value_tsvector_business_objects ON tsvector_business_objects USING gin (to_tsvector('english'::regconfig, lower((value)::text)));
CREATE INDEX type_tsvector_business_objects ON tsvector_business_objects USING btree (type);
CREATE INDEX type_value_label_lower_case_tsvector_business_objects ON tsvector_business_objects USING btree (lower((type)::text), lower((value)::text), lower((label)::text));
我在数据中有一些像 OID-0127820 这样的文本,当我使用 ts_vector 搜索 token OID 时,Postgres 总是使用序列扫描而不是使用 GIN 索引。
有 500k strip OID 文本的记录。但是当我禁用序列扫描时,正在使用索引
SET enable_seqscan = ON;
explain (analyze,verbose,buffers,timing,costs)
SELECT TYPE, value, label, synonyms, ((to_tsvector('english', lower(value)) @@ plainto_tsquery('english', 'OID') AND numnode(plainto_tsquery('english', 'OID')) > 0) OR (lower(value) LIKE '% OID %' AND numnode(plainto_tsquery('english', 'OID')) = 0) OR ((to_tsvector('english', lower(label))) @@ plainto_tsquery('english', 'OID') AND numnode(plainto_tsquery('english', 'OID')) > 0) OR (lower(label) LIKE '% OID %' AND numnode(plainto_tsquery('english', 'OID')) = 0)) as partial_value_label_match, (lower(value) ='OID' OR lower(label) ='OID') as exact_value_label_match, (synonyms @> '{OID}') is true as synonym_match FROM tsvector_business_objects AS business_objects_alias
WHERE synonyms @> '{OID}'
OR (to_tsvector('english', lower(value)) @@ plainto_tsquery('english', 'OID') AND numnode(plainto_tsquery('english', 'OID')) > 0)
OR (lower(value) LIKE '% OID %' AND numnode(plainto_tsquery('english', 'OID')) = 0)
OR ((to_tsvector('english', lower(label))) @@ plainto_tsquery('english', 'OID') AND numnode(plainto_tsquery('english', 'OID')) > 0)
OR (lower(label) LIKE '% OID %' AND numnode(plainto_tsquery('english', 'OID')) = 0) OR (lower(value) ='OID' OR lower(label) ='OID')
limit 30
QUERY PLAN |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Limit (cost=0.00..41.91 rows=30 width=82) (actual time=3804.998..3805.163 rows=30 loops=1) |
Output: type, value, label, synonyms, (((to_tsvector('english'::regconfig, lower((value)::text)) @@ '''oid'''::tsquery) OR (to_tsvector('english'::regconfig, lower((label)::text)) @@ '''oid'''::tsquery))), (((lower((value)::text) = 'OID'::text) OR (lowe|
Buffers: shared hit=21217 |
-> Seq Scan on mdlz_performancebenchmarking.tsvector_business_objects business_objects_alias (cost=0.00..717278.98 rows=513425 width=82) (actual time=3804.997..3805.159 rows=30 loops=1) |
Output: type, value, label, synonyms, ((to_tsvector('english'::regconfig, lower((value)::text)) @@ '''oid'''::tsquery) OR (to_tsvector('english'::regconfig, lower((label)::text)) @@ '''oid'''::tsquery)), ((lower((value)::text) = 'OID'::text) OR (l|
Filter: ((business_objects_alias.synonyms @> '{OID}'::text[]) OR (to_tsvector('english'::regconfig, lower((business_objects_alias.value)::text)) @@ '''oid'''::tsquery) OR (to_tsvector('english'::regconfig, lower((business_objects_alias.label)::tex|
Rows Removed by Filter: 575042 |
Buffers: shared hit=21217 |
Planning time: 0.226 ms |
Execution time: 3805.210 ms
SET enable_seqscan = OFF;
explain (analyze,verbose,buffers,timing,costs)
SELECT TYPE, value, label, synonyms, ((to_tsvector('english', lower(value)) @@ plainto_tsquery('english', 'OID') AND numnode(plainto_tsquery('english', 'OID')) > 0) OR (lower(value) LIKE '% OID %' AND numnode(plainto_tsquery('english', 'OID')) = 0) OR ((to_tsvector('english', lower(label))) @@ plainto_tsquery('english', 'OID') AND numnode(plainto_tsquery('english', 'OID')) > 0) OR (lower(label) LIKE '% OID %' AND numnode(plainto_tsquery('english', 'OID')) = 0)) as partial_value_label_match, (lower(value) ='OID' OR lower(label) ='OID') as exact_value_label_match, (synonyms @> '{OID}') is true as synonym_match FROM tsvector_business_objects AS business_objects_alias
WHERE synonyms @> '{OID}'
OR (to_tsvector('english', lower(value)) @@ plainto_tsquery('english', 'OID') AND numnode(plainto_tsquery('english', 'OID')) > 0)
OR (lower(value) LIKE '% OID %' AND numnode(plainto_tsquery('english', 'OID')) = 0)
OR ((to_tsvector('english', lower(label))) @@ plainto_tsquery('english', 'OID') AND numnode(plainto_tsquery('english', 'OID')) > 0)
OR (lower(label) LIKE '% OID %' AND numnode(plainto_tsquery('english', 'OID')) = 0) OR (lower(value) ='OID' OR lower(label) ='OID')
limit 30
QUERY PLAN |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Limit (cost=66996.67..67036.72 rows=30 width=82) (actual time=312.131..312.251 rows=30 loops=1) |
Output: type, value, label, synonyms, (((to_tsvector('english'::regconfig, lower((value)::text)) @@ '''oid'''::tsquery) OR (to_tsvector('english'::regconfig, lower((label)::text)) @@ '''oid'''::tsquery))), (((lower((value)::text) = 'OID'::text) OR (lowe|
Buffers: shared hit=45103 |
-> Bitmap Heap Scan on mdlz_performancebenchmarking.tsvector_business_objects business_objects_alias (cost=66996.67..752444.39 rows=513425 width=82) (actual time=312.130..312.247 rows=30 loops=1) |
Output: type, value, label, synonyms, ((to_tsvector('english'::regconfig, lower((value)::text)) @@ '''oid'''::tsquery) OR (to_tsvector('english'::regconfig, lower((label)::text)) @@ '''oid'''::tsquery)), ((lower((value)::text) = 'OID'::text) OR (l|
Recheck Cond: ((business_objects_alias.synonyms @> '{OID}'::text[]) OR (to_tsvector('english'::regconfig, lower((business_objects_alias.value)::text)) @@ '''oid'''::tsquery) OR (to_tsvector('english'::regconfig, lower((business_objects_alias.label|
Heap Blocks: exact=1 |
Buffers: shared hit=45103 |
-> BitmapOr (cost=66996.67..66996.67 rows=666282 width=0) (actual time=310.732..310.732 rows=0 loops=1) |
Buffers: shared hit=45102 |
-> Bitmap Index Scan on lower_case_synonym_tsvector_business_objects (cost=0.00..189.20 rows=1 width=0) (actual time=0.008..0.008 rows=0 loops=1) |
Index Cond: (business_objects_alias.synonyms @> '{OID}'::text[]) |
Buffers: shared hit=2 |
-> Bitmap Index Scan on txt_value_tsvector_business_objects (cost=0.00..2638.25 rows=333140 width=0) (actual time=49.131..49.131 rows=575000 loops=1) |
Index Cond: (to_tsvector('english'::regconfig, lower((business_objects_alias.value)::text)) @@ '''oid'''::tsquery) |
Buffers: shared hit=86 |
-> Bitmap Index Scan on txt_label_tsvector_business_objects (cost=0.00..2638.25 rows=333140 width=0) (actual time=49.956..49.956 rows=575000 loops=1) |
Index Cond: (to_tsvector('english'::regconfig, lower((business_objects_alias.label)::text)) @@ '''oid'''::tsquery) |
Buffers: shared hit=86 |
-> Bitmap Index Scan on type_value_label_lower_case_tsvector_business_objects (cost=0.00..30444.59 rows=1 width=0) (actual time=93.168..93.169 rows=0 loops=1) |
Index Cond: (lower((business_objects_alias.value)::text) = 'OID'::text) |
Buffers: shared hit=22464 |
-> Bitmap Index Scan on type_value_label_lower_case_tsvector_business_objects (cost=0.00..30444.59 rows=1 width=0) (actual time=118.465..118.465 rows=0 loops=1) |
Index Cond: (lower((business_objects_alias.label)::text) = 'OID'::text) |
Buffers: shared hit=22464 |
Planning time: 0.249 ms |
Execution time: 312.579 ms
输出数据
type |value |label |synonyms|label_tsvector |partial_value_label_match|exact_value_label_match|synonym_match|
---------------------|-----------|-----------|--------|--------------------|-------------------------|-----------------------|-------------|
orderid_1621409737948|OID-0127820|OID-0127820|NULL |'-0127820':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0355880|OID-0355880|NULL |'-0355880':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0041048|OID-0041048|NULL |'-0041048':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0499716|OID-0499716|NULL |'-0499716':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0219268|OID-0219268|NULL |'-0219268':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0000560|OID-0000560|NULL |'-0000560':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0355656|OID-0355656|NULL |'-0355656':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0355628|OID-0355628|NULL |'-0355628':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0219380|OID-0219380|NULL |'-0219380':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0063896|OID-0063896|NULL |'-0063896':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0054740|OID-0054740|NULL |'-0054740':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0447020|OID-0447020|NULL |'-0447020':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0040964|OID-0040964|NULL |'-0040964':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0499744|OID-0499744|NULL |'-0499744':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0219800|OID-0219800|NULL |'-0219800':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0355180|OID-0355180|NULL |'-0355180':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0530348|OID-0530348|NULL |'-0530348':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0219996|OID-0219996|NULL |'-0219996':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0220024|OID-0220024|NULL |'-0220024':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0446936|OID-0446936|NULL |'-0446936':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0220108|OID-0220108|NULL |'-0220108':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0020692|OID-0020692|NULL |'-0020692':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0354872|OID-0354872|NULL |'-0354872':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0097496|OID-0097496|NULL |'-0097496':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0354648|OID-0354648|NULL |'-0354648':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0128268|OID-0128268|NULL |'-0128268':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0354536|OID-0354536|NULL |'-0354536':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0530432|OID-0530432|NULL |'-0530432':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0128324|OID-0128324|NULL |'-0128324':2 'oid':1|true |false |false |
orderid_1621409737948|OID-0354256|OID-0354256|NULL |'-0354256':2 'oid':1|true |false |false |
random_page_cost 为 1.1。
我认为 Postgres 查询规划器认为使用序列扫描会更快,但事实似乎并非如此。
最佳答案
一个根本问题是规划器认为它会在 seq 扫描的早期找到 30 行,因此可以很早停止。这是错误的,显然是因为与您的条件相匹配的行很少出现在表的早期部分。这可能很难仅通过改进选择性估计来解决,因为即使行估计准确无误,但行并未均匀分布在表中,也可能会犯此错误。
关于postgresql - 未使用 Postgres GIN 索引,始终进行 SEQ 扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67698646/
当我使用路径文件上的快捷方式在文件之间移动时,似乎我不仅仅是在文件之间移动。 我使用>转到一个文件,在该文件中我更改光标的位置并执行某些操作,然后按 gf noremap 关于vim 通过快捷方式直
我正在尝试使用 Pong P. Chu 的书来学习 Verilog。我有一个关于如何评估和实现始终 block 的问题。作者代码中的风格让我感到困惑。 在此示例中,他编写了一个具有两个输出寄存器“y1
我正在尝试制作一个聊天应用程序,因此我需要它始终接收服务器信息。因此,当请求完成时,在: http.onreadystatechange=function(){ 我再次调用该函数,因此: reques
当您在 always block 敏感度列表中使用通配符 @* 时,我对什么被视为输入有点困惑。例如,在下面的示例中,哪些信号被解释为导致 always block 被重新评估的输入? 据我了解,cl
我有一个充当调试器的程序。我为线程设置了一个 hw bp,将 dr0 设置为我希望 bp 所在的地址,将 dr7 设置为 1,因为我希望 bp 在每次执行该地址时生成一个事件。 它有效,但现在的问题是
如何每次都以管理员身份在 Windows 上运行 git bash。 操作系统 - Windows 10 家庭版 64 位 最佳答案 我在 Google 上找到了这个结果: 将 Git Bash 设置
使用 accept() 时或 getpeername() , sockaddr_storage总是有 ss_family=AF_INET6 : struct sockaddr_storage addr
我在 Cordova 方面还有另一个问题。我想在 Cordova 7.1.0 中使用插件“cordova.custom.plugins.exitapp”和“cordova-plugins-printe
我试图让模块通过 ISE 12.4 中的语法检查,但它给了我一个我不明白的错误。首先是代码片段: parameter ROWBITS = 4; reg [ROWBITS-1:0] temp; genv
我正在使用Cordova开发适用于iOS的应用程序,其中包括地理位置功能(我使用官方插件https://github.com/apache/cordova-plugin-geolocation)。我在
我想知道是否有可能只在敏感列表中的多个信号一起变化时才执行 always block 。 例如,假设我有一个信号“in”和另一个“posedge clk”。我希望在两个信号都发生变化时执行 alway
我需要实现一种算法来访问数据库来检查最后一个元素,以便计算新的元素。当然,第一次这是不可能的,因为数据库是空的,我得到 IndexOutOfBoundsException) index 0 reque
我正在利用我在网上找到的画廊系统,根据鼠标图像的接近程度,它会按比例增长。 链接:Gallery 好吧,我调整了代码以响应(如您所见正在 build 中)并且没有明显的问题。我的问题在更改分辨率时开始
我正在创建一个 kiosk 应用程序,我想确保它无论如何始终位于其他 Windows 应用程序和 Windows 任务栏之上。 我已经阻止了 Windows 键盘命令(alt-tab 等),但仍有可能
我即将开始一个新的 React 项目,并尝试利用我以前的知识来创建一些关于我如何构建应用程序的规则。 有些事情我认为是真的: Redux 保存整个应用程序的“主要”数据 如果需要跨应用程序共享,Red
当你打开 VS Code 时,终端默认是在底部打开的。您可以单击该图标将其向右移动。我想知道是否有办法将右侧打开设置为默认值。 谢谢。 最佳答案 是的 - 在 v1.20 中引入了设置 workb
我有一个Events表,其中包含各种类型的事件。我只关心其中一种类型。因此,我编写的每个查询都以开头 Events.objects.filter(event_type="the_type").\
我在单例中创建了一个Timer,并且我一直在努力解决为什么Timer没有触发。我查看了这里的帖子,但没有找到我认为可以直接回答我的问题的帖子。 class ConnectionStateMonitor
我在 TableViewController 中显示了一组项目。它们在 TVC 中正确显示。下面的代码会继续,但它只会继续到我的 MKMapItem 数组的 indexPath 0,而不是被单击的单元
我的 VC 是这样的: var coins = 50 // coins override func viewDidLoad() { super.viewDidLoad() if(SKP
我是一名优秀的程序员,十分优秀!