Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres 9.5如何支持布尔gin索引_Postgresql_Postgresql 9.5 - Fatal编程技术网

Postgresql Postgres 9.5如何支持布尔gin索引

Postgresql Postgres 9.5如何支持布尔gin索引,postgresql,postgresql-9.5,Postgresql,Postgresql 9.5,由于9.5中的btree\u gin不支持布尔数据类型,如何将布尔列用作多列gin索引的一部分?从技术上讲,这是可能的,但您需要索引(is\u read::int::bit)表达式(而不是直接索引列)但是:您需要在WHERE子句中使用此表达式来使用此索引;i、 e: WHERE is_read::int::bit = '1' -- or WHERE is_read::int::bit = '0' -- or even WHERE is_read::int::bit < '1' -- whi

由于9.5中的
btree\u gin
不支持布尔数据类型,如何将布尔列用作多列gin索引的一部分?

从技术上讲,这是可能的,但您需要索引
(is\u read::int::bit)
表达式(而不是直接索引列)但是:您需要在
WHERE
子句中使用此表达式来使用此索引;i、 e:

WHERE is_read::int::bit = '1'
-- or
WHERE is_read::int::bit = '0'
-- or even
WHERE is_read::int::bit < '1' -- which is just an obfuscated version of "= '0'"
其中是_read::int::bit='1'
--或
其中是_read::int::bit='0'
--甚至
其中是_read::int::bit<'1'——它只是“='0'的一个模糊版本
但是,这会降低查询的可读性。甚至可能更慢(见下文)

如果您曾经查询过一个值(即
WHERE is_read
WHERE NOT is_read
,但不能同时查询这两个值),则a将更适合

但是,从索引中删除列可以使它(在某种程度上)更加紧凑,在某些情况下甚至可以加快查询速度

我建议您在实际数据上测试这些方法中的每一种,或者(在另一个后续问题中)向我们展示您关心的查询

以下是上述情况与一些相当人为的数据的比较:

从技术上讲,这是可能的,但您需要索引
(is_read::int::bit)
表达式(而不是直接索引列)但是:您需要在
WHERE
子句中使用此表达式来使用此索引;i、 e:

WHERE is_read::int::bit = '1'
-- or
WHERE is_read::int::bit = '0'
-- or even
WHERE is_read::int::bit < '1' -- which is just an obfuscated version of "= '0'"
其中是_read::int::bit='1'
--或
其中是_read::int::bit='0'
--甚至
其中是_read::int::bit<'1'——它只是“='0'的一个模糊版本
但是,这会降低查询的可读性。甚至可能更慢(见下文)

如果您曾经查询过一个值(即
WHERE is_read
WHERE NOT is_read
,但不能同时查询这两个值),则a将更适合

但是,从索引中删除列可以使它(在某种程度上)更加紧凑,在某些情况下甚至可以加快查询速度

我建议您在实际数据上测试这些方法中的每一种,或者(在另一个后续问题中)向我们展示您关心的查询

以下是上述情况与一些相当人为的数据的比较:

为什么您认为需要在索引中包含布尔列?通常,布尔列上的条件不会减少足够的行数以使优化器使用索引。如果您有高度扭曲的值(许多
true
值,而只有少数
false
-或相反),则使用部分索引更有意义。@a_horse__没有名称,我实际上正在从另一个数据库迁移,该数据库具有布尔列索引,我希望在这里保留相同的索引。但正如您所指出的,部分索引似乎是一个更好的解决方案。当在不同的DBMS产品之间迁移时,盲目地应用从“源”到“目标”的所有内容很少是一个好主意。数据库产品非常不同,表现也非常不同。此外:我不知道还有其他数据库管理系统有“GIN”索引,那你为什么要在Postgres中创建一个呢?@a_horse_和_no_name实际上我有一个名为
is_read
的字段,它表示一个项目被读取或未被读取,所以有很多正确和错误的行。我从一个非常不活跃的数据库迁移而来,这个数据库名为
referencedb
“布尔列上的条件通常不会减少足够多的行数,使优化器使用索引。”你会感到惊讶,@a_horse_,没有名称。你认为为什么需要在索引中包含布尔列?通常,布尔列上的条件不会减少足够的行数以使优化器使用索引。如果您有高度扭曲的值(许多
true
值,而只有少数
false
-或相反),则使用部分索引更有意义。@a_horse__没有名称,我实际上正在从另一个数据库迁移,该数据库具有布尔列索引,我希望在这里保留相同的索引。但正如您所指出的,部分索引似乎是一个更好的解决方案。当在不同的DBMS产品之间迁移时,盲目地应用从“源”到“目标”的所有内容很少是一个好主意。数据库产品非常不同,表现也非常不同。此外:我不知道还有其他数据库管理系统有“GIN”索引,那你为什么要在Postgres中创建一个呢?@a_horse_和_no_name实际上我有一个名为
is_read
的字段,它表示一个项目被读取或未被读取,所以有很多正确和错误的行。我从一个非常不活跃的数据库迁移过来,这个数据库名为
referencedb
“布尔列上的条件通常不会减少足够的行数,使优化器使用索引。”你会惊讶的,@a_horse_,没有名字。非常幸运,目前我只需要过滤
未读的
行,所以部分索引对我来说很好。非常幸运,目前我只需要过滤
未读的
行,所以部分索引对我来说很好。