postgresql 在where条件中使用两个boolean列时的速度变慢

kmynzznz  于 12个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(224)

CREATE TABLE IF NOT EXISTS schema1.table1(ID bigint NOT NULL,eid bigint NOT NULL,sID bigint,oname character varying COLLATE pg_catalog."default" NOT NULL,obtype integer NOT NULL,parentid bigint,pageorder integer,obsubtype integer NOT NULL DEFAULT 0,pstate integer NOT NULL DEFAULT 1,lastmodifieddate timestamp without time zone,lastmodifiedbyid bigint,vstype integer,opath character varying COLLATE pg_catalog."default",arc boolean,folder boolean,fcategory bigint NOT NULL DEFAULT 915,imotype boolean,iostype boolean,isemailmsg boolean NOT NULL DEFAULT false,iher character varying COLLATE pg_catalog."default",realpathoffset integer,carvers0 bigint,carvers1 bigint,arctype boolean,icont boolean,email boolean,emailattach boolean,etype boolean,hofamilyid bigint,indstate integer NOT NULL DEFAULT 0,logicalsize bigint,addescription character varying COLLATE pg_catalog."default",ouid uuid DEFAULT uuid_generate_v1(),hperror boolean,pdescrip character varying COLLATE pg_catalog."default",CONSTRAINT pk_table1 PRIMARY KEY (ID),CONSTRAINT omp_o_omp_e FOREIGN KEY (eid)REFERENCES schema1.table2 (eid) MATCH SIMPLEON UPDATE NO ACTIONON DELETE CASCADE)

```WITH (```
```    FILLFACTOR = 30,```
```    autovacuum_analyze_scale_factor = 0,```
```    autovacuum_analyze_threshold = 10000,```
```    autovacuum_vacuum_scale_factor = 0,```
```    autovacuum_vacuum_threshold = 10000```
```)```
```TABLESPACE schema1_ts;```

ALTER TABLE IF EXISTS schema1.table1OWNER to schema1;

```ALTER TABLE IF EXISTS schema1.table1```
```    ALTER COLUMN fcategory SET STATISTICS 10000;```
7xllpg7q

7xllpg7q1#

是的,您可以为这种情况创建复合索引或位图索引,甚至是覆盖索引。
1.综合指数:
CREATE INDEX IF NOT EXISTS composite_index ON schema1.table1(folder,email);
1.位图索引:
CREATE BITMAP INDEX IF NOT EXISTS bitmap_index ON schema1.table1(folder,email);
在这种情况下,使用复合索引比使用位图索引有几个优点:
1.性能:对于多列查询,复合索引通常比位图索引更有效。这是因为复合索引可用于查找满足索引中所有列的条件的行。另一方面,位图索引只能用于查找与单个列的条件匹配的行。
1.空间:复合索引比位图索引占用更少的空间。这是因为复合索引只存储索引中列的值,而位图索引存储表中所有列的值。
1.易用性:复合索引比位图索引更易于使用。这是因为复合索引可以与标准SQL查询一起使用,而位图索引需要特殊查询。
1.在您的例子中,由于您有一个包含1000万条记录的大表,并且两个布尔列具有50%的true和50%的false值,因此我建议使用复合索引。这将提高查询的性能并使数据库更高效。
但是,使用综合指数也有一些缺点:
1.复杂度:复合索引的创建和维护可能比单列索引更复杂。
1.空间:复合索引比单列索引占用更多的空间。

ecr0jaav

ecr0jaav2#

创建复合索引后,我可以看到查询性能的差异。谢谢你的帮助。

相关问题