SlideShare a Scribd company logo
© 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);

More Related Content

DOCX
Comparing Numbers
PPTX
Server side scripting language
PDF
Flexible Indexing with Postgres
 
ODP
Clean code and refactoring
PDF
"Развитие ветки PHP-7"
PDF
Advfs system calls & kernel interfaces
PPTX
Unit 4-6 sem 7 Web Technologies.pptx
PDF
ch2_EN_BK.pdf
Comparing Numbers
Server side scripting language
Flexible Indexing with Postgres
 
Clean code and refactoring
"Развитие ветки PHP-7"
Advfs system calls & kernel interfaces
Unit 4-6 sem 7 Web Technologies.pptx
ch2_EN_BK.pdf

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

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

More from EDB (20)

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

Recently uploaded (20)

PPTX
Spectroscopy.pptx food analysis technology
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
Spectral efficient network and resource selection model in 5G networks
PPT
Teaching material agriculture food technology
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
A Presentation on Artificial Intelligence
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Approach and Philosophy of On baking technology
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Empathic Computing: Creating Shared Understanding
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Getting Started with Data Integration: FME Form 101
Spectroscopy.pptx food analysis technology
NewMind AI Weekly Chronicles - August'25-Week II
SOPHOS-XG Firewall Administrator PPT.pptx
Spectral efficient network and resource selection model in 5G networks
Teaching material agriculture food technology
A comparative analysis of optical character recognition models for extracting...
Accuracy of neural networks in brain wave diagnosis of schizophrenia
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
gpt5_lecture_notes_comprehensive_20250812015547.pdf
A Presentation on Artificial Intelligence
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Unlocking AI with Model Context Protocol (MCP)
Heart disease approach using modified random forest and particle swarm optimi...
Diabetes mellitus diagnosis method based random forest with bat algorithm
Approach and Philosophy of On baking technology
Assigned Numbers - 2025 - Bluetooth® Document
Empathic Computing: Creating Shared Understanding
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Programs and apps: productivity, graphics, security and other tools
Getting Started with Data Integration: FME Form 101

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);