{"id":10645,"date":"2017-11-19T16:54:13","date_gmt":"2017-11-19T15:54:13","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/"},"modified":"2017-11-19T16:54:13","modified_gmt":"2017-11-19T15:54:13","slug":"is-it-an-index-a-table-or-what","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/","title":{"rendered":"Is it an index, a table or what?"},"content":{"rendered":"<p>A <a href=\"https:\/\/twitter.com\/kevinclosson\/status\/931617428701822976\" target=\"_blank\" rel=\"noopener\">recent tweet from Kevin Closson<\/a> outlined that in PostgreSQL it might be confusing if something is an index or table. Why is it like that? Lets have a look and start be re-building the example from Kevin:<\/p>\n<p><!--more--><\/p>\n<p>For getting into the same situation Kevin described we need something like this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create table base4(custid int, custname varchar(50));\nCREATE TABLE\npostgres=# create index base4_idx on base4(custid);\nCREATE INDEX\n<\/pre>\n<p>Assuming that we forgot that we created such an index and come back later and try to create it again we have exactly the same behavior:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create index base4_idx on base4(custid);\nERROR:  relation \"base4_idx\" already exists\npostgres=# drop table base4_idx;\nERROR:  \"base4_idx\" is not a table\nHINT:  Use DROP INDEX to remove an index.\npostgres=# \n<\/pre>\n<p>They keyword here is &#8220;relation&#8221;. In PostgreSQL a &#8220;relation&#8221; does not necessarily mean a table. What you need to know is that PostgreSQL stores everything that looks like a table\/relation (e.g. has columns) in the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/catalog-pg-class.html\" target=\"_blank\" rel=\"noopener\">pg_class catalog table<\/a>. When we check our relations there:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select relname from pg_class where relname in ('base4','base4_idx');\n  relname  \n-----------\n base4\n base4_idx\n(2 rows)\n<\/pre>\n<p>&#8230; we can see that both, the table and the index, are somehow treated as a relation. The difference is here:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# ! cat a.sql\nselect a.relname \n     , b.typname\n  from pg_class a\n     , pg_type b \n where a.relname in ('base4','base4_idx')\n   and a.reltype = b.oid;\npostgres=# i a.sql\n relname | typname \n---------+---------\n base4   | base4\n(1 row)\n<\/pre>\n<p>Indexes do not have an entry in <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/catalog-pg-type.html\" target=\"_blank\" rel=\"noopener\">pg_type<\/a>, tables have. What is even more interesting is, that the &#8220;base4&#8221; table is a type itself. This means for every table you create a composite type is created as well that describes the structure of the table. You can even link back to pg_class:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select typname,typrelid from pg_type where typname = 'base4';\n typname | typrelid \n---------+----------\n base4   |    32901\n(1 row)\n\npostgres=# select relname from pg_class where oid = 32901;\n relname \n---------\n base4\n(1 row)\n<\/pre>\n<p>When you want to know what type a relation is of the easiest way is to ask like this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select relname,relkind from pg_class where relname in ('base4','base4_idx');\n  relname  | relkind \n-----------+---------\n base4     | r\n base4_idx | i\n(2 rows)\n<\/pre>\n<p>&#8230; where:<\/p>\n<ul>\n<li>r = ordinary table<\/li>\n<li>i = index<\/li>\n<li>S = sequence<\/li>\n<li>t = TOAST table<\/li>\n<li>m = materialized view<\/li>\n<li>c = composite type<\/li>\n<li>f = foreign table<\/li>\n<li>p = partitioned table<\/li>\n<\/ul>\n<p>Of course there are also catalog tables for <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/view-pg-tables.html\" target=\"_blank\" rel=\"noopener\">tables<\/a> and <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/view-pg-indexes.html\" target=\"_blank\" rel=\"noopener\">indexes<\/a>, so you can also double check there. Knowing all this the message is pretty clear:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create index base4_idx on base4(custid);\nERROR:  relation \"base4_idx\" already exists\npostgres=# drop relation base4_idx;\nERROR:  syntax error at or near \"relation\"\nLINE 1: drop relation base4_idx;\n             ^\npostgres=# drop table base4_idx;\nERROR:  \"base4_idx\" is not a table\nHINT:  Use DROP INDEX to remove an index.\npostgres=# \n<\/pre>\n<p>PostgreSQL finally is telling you that &#8220;base4_idx&#8221; is an index and not a table which is fine. Of course you could think that PostgreSQL should to that on its own but it is also true: When you want to drop something, you should be sure on what you really want to drop.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A recent tweet from Kevin Closson outlined that in PostgreSQL it might be confusing if something is an index or table. Why is it like that? Lets have a look and start be re-building the example from Kevin:<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-10645","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Is it an index, a table or what? - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Is it an index, a table or what?\" \/>\n<meta property=\"og:description\" content=\"A recent tweet from Kevin Closson outlined that in PostgreSQL it might be confusing if something is an index or table. Why is it like that? Lets have a look and start be re-building the example from Kevin:\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-19T15:54:13+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Is it an index, a table or what?\",\"datePublished\":\"2017-11-19T15:54:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/\"},\"wordCount\":327,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/\",\"name\":\"Is it an index, a table or what? - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2017-11-19T15:54:13+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Is it an index, a table or what?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Is it an index, a table or what? - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/","og_locale":"en_US","og_type":"article","og_title":"Is it an index, a table or what?","og_description":"A recent tweet from Kevin Closson outlined that in PostgreSQL it might be confusing if something is an index or table. Why is it like that? Lets have a look and start be re-building the example from Kevin:","og_url":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/","og_site_name":"dbi Blog","article_published_time":"2017-11-19T15:54:13+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Is it an index, a table or what?","datePublished":"2017-11-19T15:54:13+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/"},"wordCount":327,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/","url":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/","name":"Is it an index, a table or what? - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2017-11-19T15:54:13+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/is-it-an-index-a-table-or-what\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Is it an index, a table or what?"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/10645","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=10645"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/10645\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=10645"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=10645"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=10645"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=10645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}