SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
© 2013 EDB All rights reserved. 1
I know greater-than-or-equal-to when I see it!
Noah Misch | 2014-05-22
>= <>&&
<@
© 2014 EDB All rights reserved. 2
■ Index access methods (pg_am)
− Type-independent; specific to certain index layout
− btree, hash, gist, gin, spgist
■ Operator classes (pg_opclass)
− Specific to a data type + index access method
− Tightly related: operator families (pg_opfamily)
− int4_ops, text_ops
Layers of Index Support
© 2014 EDB All rights reserved. 3
■ In general: ties a data type to an access method
■ The case of btree: comparison function and operators
What is an operator class?
CREATE TABLE t (c date PRIMARY KEY);
INSERT INTO t VALUES ('2014-01-01');
INSERT INTO t VALUES ('2015-01-01');
...
-- <(date,date) operator
SELECT * FROM t WHERE c < current_date;
© 2014 EDB All rights reserved. 4
■ Extends operator support to multiple data types
■ Relevant for btree and hash only
What is an operator family?
CREATE TABLE t (c date PRIMARY KEY);
INSERT INTO t VALUES ('2014-01-01');
INSERT INTO t VALUES ('2015-01-01');
...
-- <(date,timestamptz) operator
SELECT * FROM t WHERE c < now();
© 2014 EDB All rights reserved. 5
■ FUNCTION entries maintain the index
■ List of OPERATOR qualified to exploit the index
■ “equal-sign operator” vs. “equality operator”
btree int4_ops walk-through
CREATE OPERATOR FAMILY integer_ops USING btree;
CREATE OPERATOR CLASS int4_ops
DEFAULT FOR TYPE integer
USING btree FAMILY integer_ops AS
FUNCTION 1 btint4cmp(integer, integer),
OPERATOR 1 <,
OPERATOR 2 <=,
OPERATOR 3 =,
OPERATOR 4 >=,
OPERATOR 5 >;
© 2014 EDB All rights reserved. 6
System Catalog Representation
pg_am
btree
pg_opclass
int4_ops
pg_opfamily
integer_ops
pg_opclass
int2_ops
pg_amproc
btint4cmp
pg_amproc
btint24cmp
pg_amproc
btint2cmp
pg_amop
<(int4,int4)
pg_amop
<(int2,int4)
pg_amop
<(int2,int2)
© 2014 EDB All rights reserved. 7
■ btree: other sort orders
− text_pattern_ops
■ hash: not done in practice
■ gin, gist, spgist:
fruitful opportunities
Multiple Operator Classes
© 2014 EDB All rights reserved. 8
ORDER BY
-- uses btree text_ops
ORDER BY textcol;
-- uses btree text_pattern_ops
ORDER BY textcol USING ~<~;
-- can use e.g. gist_trgm_ops
ORDER BY textcol <-> 'search condition';
© 2014 EDB All rights reserved. 9
■ UNION
■ GROUP BY, DISTINCT
■ array, composite type comparisons
■ Choice of default equality semantics is important
Equality
[local] test=# SELECT DISTINCT x
FROM unnest(array[1.00, 1.1, 1.0]) t(x);
x
──────
1.1
1.00
(2 rows)
© 2014 EDB All rights reserved. 10
■ Operator names like “=” and “<” are not special ...
■ … excepting CASE, IN, IS DISTINCT FROM, etc
Equality Surprises
[local] test=# SELECT DISTINCT x
FROM unnest(array['(1,1),(0,0)',
'(2,2),(1,1)']::box[]) t(x);
ERROR: could not identify an equality
operator for type box
[local] test=# SELECT '(1,1),(0,0)'::box IN
('(2,2),(1,1)'::box);
?column?
──────────
t
© 2014 EDB All rights reserved. 11
Merge Join
[local] test=# SET enable_hashjoin = off;
SET
[local] test=# EXPLAIN (costs off)
SELECT opfmethod, opfname, array_agg(amopopr)
FROM pg_amop ao JOIN pg_opfamily f
ON amopfamily = f.oid GROUP BY 1,2;
QUERY PLAN
─────────────────────────────────────────────
HashAggregate
Group Key: f.opfmethod, f.opfname
-> Merge Join
Merge Cond: (f.oid = ao.amopfamily)
-> Sort
Sort Key: f.oid
-> Seq Scan on pg_opfamily f
-> Sort
Sort Key: ao.amopfamily
-> Seq Scan on pg_amop ao
© 2014 EDB All rights reserved. 12
Hash Join
[local] test=# EXPLAIN (costs off)
SELECT opfmethod, opfname, array_agg(amopopr)
FROM pg_amop ao JOIN pg_opfamily f
ON amopfamily = f.oid GROUP BY 1,2;
QUERY PLAN
─────────────────────────────────────────────
HashAggregate
Group Key: f.opfmethod, f.opfname
-> Hash Join
Hash Cond: (ao.amopfamily = f.oid)
-> Seq Scan on pg_amop ao
-> Hash
-> Seq Scan on pg_opfamily f
© 2014 EDB All rights reserved. 13
■ Don't hard-code “=”
■ Which equality semantics?
− btree/hash default equality
− exact match (output comparison; record_image_ops)
■ Do look up equality by operator class
− backend: TYPECACHE_EQ_OPR
− frontend: copy its algorithm
■ Not all types have these operations
Writing Generic Data Type Consumers
© 2014 EDB All rights reserved. 14
■ Choice of default equality semantics is important
− Option to omit them entirely (xml, json, box)
■ Try to include a default btree operator class
■ Default hash operator class is then easy
■ Other access methods are situation-specific
− gin for container-like types
− gist often starts with the search strategy, not the type
Implementing Data Types
© 2014 EDB All rights reserved. 15
Questions?
© 2014 EDB All rights reserved. 16
■ http://www.postgresql.org/docs/current/static/xindex.html
■ contrib/btree_gist, contrib/btree_gin
■ Other built-in and contrib operator classes
■ ATAddForeignKeyConstraint()
Further Reading
© 2014 EDB All rights reserved. 17
hash int4_ops
CREATE OPERATOR CLASS int4_ops
DEFAULT FOR TYPE integer
USING hash FAMILY integer_ops AS
FUNCTION 1 hashint4(integer),
OPERATOR 1 =;
© 2014 EDB All rights reserved. 18
Array Element Searches: gin _int4_ops
CREATE OPERATOR CLASS _int4_ops
DEFAULT FOR TYPE integer[]
USING gin FAMILY array_ops AS
STORAGE integer,
FUNCTION 1 btint4cmp(integer,integer),
FUNCTION 2 ginarrayextract(...),
FUNCTION 3 ginqueryarrayextract(...),
FUNCTION 4 ginarrayconsistent(...),
OPERATOR 1 &&(anyarray,anyarray),
OPERATOR 2 @>(anyarray,anyarray),
OPERATOR 3 <@(anyarray,anyarray),
OPERATOR 4 =(anyarray,anyarray);

Más contenido relacionado

Similar a I know greater-than-or-equal-to when I see it! (PGCon 2014)

Oracle Release 12 E-Business Suite Patching Best Practices
Oracle Release 12 E-Business Suite Patching Best PracticesOracle Release 12 E-Business Suite Patching Best Practices
Oracle Release 12 E-Business Suite Patching Best Practices
Scott Jenner
 
download presentation
download presentationdownload presentation
download presentation
webhostingguy
 
power point presentation on pig -hadoop framework
power point presentation on pig -hadoop frameworkpower point presentation on pig -hadoop framework
power point presentation on pig -hadoop framework
bhargavi804095
 
Week05
Week05Week05
Week05
hccit
 

Similar a I know greater-than-or-equal-to when I see it! (PGCon 2014) (20)

Perl 6 command line scripting
Perl 6 command line scriptingPerl 6 command line scripting
Perl 6 command line scripting
 
Server Independent Programming
Server Independent ProgrammingServer Independent Programming
Server Independent Programming
 
Reading The Source Code of Presto
Reading The Source Code of PrestoReading The Source Code of Presto
Reading The Source Code of Presto
 
Oracle Release 12 E-Business Suite Patching Best Practices
Oracle Release 12 E-Business Suite Patching Best PracticesOracle Release 12 E-Business Suite Patching Best Practices
Oracle Release 12 E-Business Suite Patching Best Practices
 
Php training in chandigarh
Php  training in chandigarhPhp  training in chandigarh
Php training in chandigarh
 
2010 07-28-testing-zf-apps
2010 07-28-testing-zf-apps2010 07-28-testing-zf-apps
2010 07-28-testing-zf-apps
 
Getting started with php
Getting started with phpGetting started with php
Getting started with php
 
Zend Framework 2 Patterns
Zend Framework 2 PatternsZend Framework 2 Patterns
Zend Framework 2 Patterns
 
download presentation
download presentationdownload presentation
download presentation
 
Postgres.foreign.data.wrappers.2015
Postgres.foreign.data.wrappers.2015Postgres.foreign.data.wrappers.2015
Postgres.foreign.data.wrappers.2015
 
power point presentation on pig -hadoop framework
power point presentation on pig -hadoop frameworkpower point presentation on pig -hadoop framework
power point presentation on pig -hadoop framework
 
Gruter_TECHDAY_2014_03_ApacheTajo (in Korean)
Gruter_TECHDAY_2014_03_ApacheTajo (in Korean)Gruter_TECHDAY_2014_03_ApacheTajo (in Korean)
Gruter_TECHDAY_2014_03_ApacheTajo (in Korean)
 
Na pomezi php a vue.js
Na pomezi php a vue.jsNa pomezi php a vue.js
Na pomezi php a vue.js
 
8.4 Upcoming Features
8.4 Upcoming Features 8.4 Upcoming Features
8.4 Upcoming Features
 
メタプログラミングRuby輪読会 1-4章(復習), 5.1~5.3章
メタプログラミングRuby輪読会 1-4章(復習), 5.1~5.3章メタプログラミングRuby輪読会 1-4章(復習), 5.1~5.3章
メタプログラミングRuby輪読会 1-4章(復習), 5.1~5.3章
 
Week05
Week05Week05
Week05
 
Как мы сделали PHP 7 в два раза быстрее PHP 5 / Дмитрий Стогов (Zend Technolo...
Как мы сделали PHP 7 в два раза быстрее PHP 5 / Дмитрий Стогов (Zend Technolo...Как мы сделали PHP 7 в два раза быстрее PHP 5 / Дмитрий Стогов (Zend Technolo...
Как мы сделали PHP 7 в два раза быстрее PHP 5 / Дмитрий Стогов (Zend Technolo...
 
Bug Bounty Hunter Methodology - Nullcon 2016
Bug Bounty Hunter Methodology - Nullcon 2016Bug Bounty Hunter Methodology - Nullcon 2016
Bug Bounty Hunter Methodology - Nullcon 2016
 
PigHive.pptx
PigHive.pptxPigHive.pptx
PigHive.pptx
 
2021.laravelconf.tw.slides2
2021.laravelconf.tw.slides22021.laravelconf.tw.slides2
2021.laravelconf.tw.slides2
 

Más de EDB

EFM Office Hours - APJ - July 29, 2021
EFM Office Hours - APJ - July 29, 2021EFM Office Hours - APJ - July 29, 2021
EFM Office Hours - APJ - July 29, 2021
EDB
 
Is There Anything PgBouncer Can’t Do?
Is There Anything PgBouncer Can’t Do?Is There Anything PgBouncer Can’t Do?
Is There Anything PgBouncer Can’t Do?
EDB
 
A Deeper Dive into EXPLAIN
A Deeper Dive into EXPLAINA Deeper Dive into EXPLAIN
A Deeper Dive into EXPLAIN
EDB
 

Más de EDB (20)

Cloud Migration Paths: Kubernetes, IaaS, or DBaaS
Cloud Migration Paths: Kubernetes, IaaS, or DBaaSCloud Migration Paths: Kubernetes, IaaS, or DBaaS
Cloud Migration Paths: Kubernetes, IaaS, or DBaaS
 
Die 10 besten PostgreSQL-Replikationsstrategien für Ihr Unternehmen
Die 10 besten PostgreSQL-Replikationsstrategien für Ihr UnternehmenDie 10 besten PostgreSQL-Replikationsstrategien für Ihr Unternehmen
Die 10 besten PostgreSQL-Replikationsstrategien für Ihr Unternehmen
 
Migre sus bases de datos Oracle a la nube
Migre sus bases de datos Oracle a la nube Migre sus bases de datos Oracle a la nube
Migre sus bases de datos Oracle a la nube
 
EFM Office Hours - APJ - July 29, 2021
EFM Office Hours - APJ - July 29, 2021EFM Office Hours - APJ - July 29, 2021
EFM Office Hours - APJ - July 29, 2021
 
Benchmarking Cloud Native PostgreSQL
Benchmarking Cloud Native PostgreSQLBenchmarking Cloud Native PostgreSQL
Benchmarking Cloud Native PostgreSQL
 
Las Variaciones de la Replicación de PostgreSQL
Las Variaciones de la Replicación de PostgreSQLLas Variaciones de la Replicación de PostgreSQL
Las Variaciones de la Replicación de PostgreSQL
 
NoSQL and Spatial Database Capabilities using PostgreSQL
NoSQL and Spatial Database Capabilities using PostgreSQLNoSQL and Spatial Database Capabilities using PostgreSQL
NoSQL and Spatial Database Capabilities using PostgreSQL
 
Is There Anything PgBouncer Can’t Do?
Is There Anything PgBouncer Can’t Do?Is There Anything PgBouncer Can’t Do?
Is There Anything PgBouncer Can’t Do?
 
Data Analysis with TensorFlow in PostgreSQL
Data Analysis with TensorFlow in PostgreSQLData Analysis with TensorFlow in PostgreSQL
Data Analysis with TensorFlow in PostgreSQL
 
Practical Partitioning in Production with Postgres
Practical Partitioning in Production with PostgresPractical Partitioning in Production with Postgres
Practical Partitioning in Production with Postgres
 
A Deeper Dive into EXPLAIN
A Deeper Dive into EXPLAINA Deeper Dive into EXPLAIN
A Deeper Dive into EXPLAIN
 
IOT with PostgreSQL
IOT with PostgreSQLIOT with PostgreSQL
IOT with PostgreSQL
 
A Journey from Oracle to PostgreSQL
A Journey from Oracle to PostgreSQLA Journey from Oracle to PostgreSQL
A Journey from Oracle to PostgreSQL
 
Psql is awesome!
Psql is awesome!Psql is awesome!
Psql is awesome!
 
EDB 13 - New Enhancements for Security and Usability - APJ
EDB 13 - New Enhancements for Security and Usability - APJEDB 13 - New Enhancements for Security and Usability - APJ
EDB 13 - New Enhancements for Security and Usability - APJ
 
Comment sauvegarder correctement vos données
Comment sauvegarder correctement vos donnéesComment sauvegarder correctement vos données
Comment sauvegarder correctement vos données
 
Cloud Native PostgreSQL - Italiano
Cloud Native PostgreSQL - ItalianoCloud Native PostgreSQL - Italiano
Cloud Native PostgreSQL - Italiano
 
New enhancements for security and usability in EDB 13
New enhancements for security and usability in EDB 13New enhancements for security and usability in EDB 13
New enhancements for security and usability in EDB 13
 
Best Practices in Security with PostgreSQL
Best Practices in Security with PostgreSQLBest Practices in Security with PostgreSQL
Best Practices in Security with PostgreSQL
 
Cloud Native PostgreSQL - APJ
Cloud Native PostgreSQL - APJCloud Native PostgreSQL - APJ
Cloud Native PostgreSQL - APJ
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 

I know greater-than-or-equal-to when I see it! (PGCon 2014)

  • 1. © 2013 EDB All rights reserved. 1 I know greater-than-or-equal-to when I see it! Noah Misch | 2014-05-22 >= <>&& <@
  • 2. © 2014 EDB All rights reserved. 2 ■ Index access methods (pg_am) − Type-independent; specific to certain index layout − btree, hash, gist, gin, spgist ■ Operator classes (pg_opclass) − Specific to a data type + index access method − Tightly related: operator families (pg_opfamily) − int4_ops, text_ops Layers of Index Support
  • 3. © 2014 EDB All rights reserved. 3 ■ In general: ties a data type to an access method ■ The case of btree: comparison function and operators What is an operator class? CREATE TABLE t (c date PRIMARY KEY); INSERT INTO t VALUES ('2014-01-01'); INSERT INTO t VALUES ('2015-01-01'); ... -- <(date,date) operator SELECT * FROM t WHERE c < current_date;
  • 4. © 2014 EDB All rights reserved. 4 ■ Extends operator support to multiple data types ■ Relevant for btree and hash only What is an operator family? CREATE TABLE t (c date PRIMARY KEY); INSERT INTO t VALUES ('2014-01-01'); INSERT INTO t VALUES ('2015-01-01'); ... -- <(date,timestamptz) operator SELECT * FROM t WHERE c < now();
  • 5. © 2014 EDB All rights reserved. 5 ■ FUNCTION entries maintain the index ■ List of OPERATOR qualified to exploit the index ■ “equal-sign operator” vs. “equality operator” btree int4_ops walk-through CREATE OPERATOR FAMILY integer_ops USING btree; CREATE OPERATOR CLASS int4_ops DEFAULT FOR TYPE integer USING btree FAMILY integer_ops AS FUNCTION 1 btint4cmp(integer, integer), OPERATOR 1 <, OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, OPERATOR 5 >;
  • 6. © 2014 EDB All rights reserved. 6 System Catalog Representation pg_am btree pg_opclass int4_ops pg_opfamily integer_ops pg_opclass int2_ops pg_amproc btint4cmp pg_amproc btint24cmp pg_amproc btint2cmp pg_amop <(int4,int4) pg_amop <(int2,int4) pg_amop <(int2,int2)
  • 7. © 2014 EDB All rights reserved. 7 ■ btree: other sort orders − text_pattern_ops ■ hash: not done in practice ■ gin, gist, spgist: fruitful opportunities Multiple Operator Classes
  • 8. © 2014 EDB All rights reserved. 8 ORDER BY -- uses btree text_ops ORDER BY textcol; -- uses btree text_pattern_ops ORDER BY textcol USING ~<~; -- can use e.g. gist_trgm_ops ORDER BY textcol <-> 'search condition';
  • 9. © 2014 EDB All rights reserved. 9 ■ UNION ■ GROUP BY, DISTINCT ■ array, composite type comparisons ■ Choice of default equality semantics is important Equality [local] test=# SELECT DISTINCT x FROM unnest(array[1.00, 1.1, 1.0]) t(x); x ────── 1.1 1.00 (2 rows)
  • 10. © 2014 EDB All rights reserved. 10 ■ Operator names like “=” and “<” are not special ... ■ … excepting CASE, IN, IS DISTINCT FROM, etc Equality Surprises [local] test=# SELECT DISTINCT x FROM unnest(array['(1,1),(0,0)', '(2,2),(1,1)']::box[]) t(x); ERROR: could not identify an equality operator for type box [local] test=# SELECT '(1,1),(0,0)'::box IN ('(2,2),(1,1)'::box); ?column? ────────── t
  • 11. © 2014 EDB All rights reserved. 11 Merge Join [local] test=# SET enable_hashjoin = off; SET [local] test=# EXPLAIN (costs off) SELECT opfmethod, opfname, array_agg(amopopr) FROM pg_amop ao JOIN pg_opfamily f ON amopfamily = f.oid GROUP BY 1,2; QUERY PLAN ───────────────────────────────────────────── HashAggregate Group Key: f.opfmethod, f.opfname -> Merge Join Merge Cond: (f.oid = ao.amopfamily) -> Sort Sort Key: f.oid -> Seq Scan on pg_opfamily f -> Sort Sort Key: ao.amopfamily -> Seq Scan on pg_amop ao
  • 12. © 2014 EDB All rights reserved. 12 Hash Join [local] test=# EXPLAIN (costs off) SELECT opfmethod, opfname, array_agg(amopopr) FROM pg_amop ao JOIN pg_opfamily f ON amopfamily = f.oid GROUP BY 1,2; QUERY PLAN ───────────────────────────────────────────── HashAggregate Group Key: f.opfmethod, f.opfname -> Hash Join Hash Cond: (ao.amopfamily = f.oid) -> Seq Scan on pg_amop ao -> Hash -> Seq Scan on pg_opfamily f
  • 13. © 2014 EDB All rights reserved. 13 ■ Don't hard-code “=” ■ Which equality semantics? − btree/hash default equality − exact match (output comparison; record_image_ops) ■ Do look up equality by operator class − backend: TYPECACHE_EQ_OPR − frontend: copy its algorithm ■ Not all types have these operations Writing Generic Data Type Consumers
  • 14. © 2014 EDB All rights reserved. 14 ■ Choice of default equality semantics is important − Option to omit them entirely (xml, json, box) ■ Try to include a default btree operator class ■ Default hash operator class is then easy ■ Other access methods are situation-specific − gin for container-like types − gist often starts with the search strategy, not the type Implementing Data Types
  • 15. © 2014 EDB All rights reserved. 15 Questions?
  • 16. © 2014 EDB All rights reserved. 16 ■ http://www.postgresql.org/docs/current/static/xindex.html ■ contrib/btree_gist, contrib/btree_gin ■ Other built-in and contrib operator classes ■ ATAddForeignKeyConstraint() Further Reading
  • 17. © 2014 EDB All rights reserved. 17 hash int4_ops CREATE OPERATOR CLASS int4_ops DEFAULT FOR TYPE integer USING hash FAMILY integer_ops AS FUNCTION 1 hashint4(integer), OPERATOR 1 =;
  • 18. © 2014 EDB All rights reserved. 18 Array Element Searches: gin _int4_ops CREATE OPERATOR CLASS _int4_ops DEFAULT FOR TYPE integer[] USING gin FAMILY array_ops AS STORAGE integer, FUNCTION 1 btint4cmp(integer,integer), FUNCTION 2 ginarrayextract(...), FUNCTION 3 ginqueryarrayextract(...), FUNCTION 4 ginarrayconsistent(...), OPERATOR 1 &&(anyarray,anyarray), OPERATOR 2 @>(anyarray,anyarray), OPERATOR 3 <@(anyarray,anyarray), OPERATOR 4 =(anyarray,anyarray);