{"id":1132,"date":"2007-11-09T22:31:10","date_gmt":"2007-11-09T22:31:10","guid":{"rendered":"\/blogs\/paul\/post\/How-can-data-type-choice-affect-performance.aspx"},"modified":"2017-04-13T09:52:05","modified_gmt":"2017-04-13T16:52:05","slug":"how-can-data-type-choice-affect-performance","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/","title":{"rendered":"How can data-type choice affect performance?"},"content":{"rendered":"<p><FONT face=Verdana><FONT size=2><br \/>\n<P>In one of the sessions Kimberly and I taught this week at SQL Connections, we discussed how to choose efficient data-types &#8211; I&#8217;d like to share the discussion here with an example.<\/P><br \/>\n<P>The crux of the matter is in the amount of space required to store the data-types in the schema, and ensuring that the data-type choice matches the data being stored without incurring any unnecessary overhead. Here are a couple of examples:<\/P><br \/>\n<UL><br \/>\n<LI>A field that stores a person&#8217;s age will usually be able to use a <FONT face=\"Courier New\">TINYINT<\/FONT> type that can store a maximum value of 256 &#8211; unless its an archeological or historical database, for instance. Without putting a lot of thought into it, however, someone may choose to use an <FONT face=\"Courier New\">INTEGER<\/FONT> type. What&#8217;s the difference?&nbsp;A <FONT face=\"Courier New\">TINYINT<\/FONT> take a single byte to store, whereas an <FONT face=\"Courier New\">INTEGER<\/FONT> takes *4* bytes to store &#8211; wasting 3 bytes per record.<br \/>\n<LI>A field that stores a person&#8217;s city of residence in the USA needs to be able to hold 24 characters (see my <a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/just-how-long-should-you-make-character-fields-whats-the-longest-word\/\">previous post<\/a> on how long fields have to be) &#8211; so what data-type should you use? A <FONT face=\"Courier New\">CHAR (24)<\/FONT> will be able to store all the possible values, but will *always* take up 24 bytes in the record as it&#8217;s a fixed-length column. A <FONT face=\"Courier New\">VARCHAR (24)<\/FONT>, on the other hand will only store the number of bytes equal to the number of characters in the city name, so using the fixed-length type will waste a varying number of bytes per record.<br \/>\n<LI>In the USA, the names of the various States are commonly abbeviated to two characters &#8211; for instance, Washington = WA and California = CA. So is the best type to use <FONT face=\"Courier New\">CHAR (2)<\/FONT> or <FONT face=\"Courier New\">VARCHAR (2)<\/FONT>? Given that the abbreviations are always 2 characters, they&#8217;ll both store 2 bytes all the time. BUT, a variable length column has a two-byte overhead (the two-byte pointer for the column that&#8217;s stored in the variable-length column offset array in the record) &#8211; so in this case the best data-type to use is <FONT face=\"Courier New\">CHAR (2)<\/FONT>.<\/LI><\/UL><br \/>\n<P>You can see how choosing data-types without considering whether it&#8217;s the best type can lead to wasted space. Let&#8217;s look at an example schema to support a population census of the USA.<\/P><FONT color=#0000ff size=5><br \/>\n<BLOCKQUOTE dir=ltr style=\"MARGIN-RIGHT: 0px\"><br \/>\n<P><FONT face=\"Courier New\" size=2>CREATE<\/FONT><\/FONT><FONT face=\"Courier New\"><FONT color=#000000> <\/FONT><FONT color=#0000ff>TABLE<\/FONT><FONT color=#000000> CensusSchema1 <\/FONT><FONT color=#808080>(<\/P><\/FONT><\/FONT><br \/>\n<BLOCKQUOTE dir=ltr style=\"MARGIN-RIGHT: 0px\"><br \/>\n<P><FONT face=\"Courier New\">SSN <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>CHAR<\/FONT> <FONT color=#808080>(<\/FONT>256<FONT color=#808080>),<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">StateName <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>CHAR<\/FONT> <FONT color=#808080>(<\/FONT>256<FONT color=#808080>),<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">Sex <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">Employed <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">SelfEmployed <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">EthnicOrigin <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">MaritalStatus <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">NumberOfDependents <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">Age <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">CountryOfBirth <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">HouseholdIncomeGroup <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">ZipCode5 <\/FONT><FONT face=\"Courier New\"><FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>);<\/P><\/BLOCKQUOTE><\/FONT><\/FONT><FONT face=\"Courier New\" size=2><br \/>\n<P>GO<\/P><\/BLOCKQUOTE><\/FONT><FONT size=2><br \/>\n<P dir=ltr>At first glance this may look reasonable, but digging in you&#8217;ll see that many of the columns are over-sized. Here&#8217;s a cleaned-up schema to compare against, with notes on the per-column savings:<\/P><FONT color=#0000ff size=5><br \/>\n<BLOCKQUOTE dir=ltr style=\"MARGIN-RIGHT: 0px\"><br \/>\n<P><FONT face=\"Courier New\" size=2>CREATE<\/FONT><\/FONT><FONT face=\"Courier New\"><FONT color=#000000> <\/FONT><FONT color=#0000ff>TABLE<\/FONT><FONT color=#000000> CensusSchema2 <\/FONT><FONT color=#808080>(<\/P><\/FONT><\/FONT><br \/>\n<BLOCKQUOTE dir=ltr style=\"MARGIN-RIGHT: 0px\"><br \/>\n<P><FONT face=\"Courier New\">SSN <FONT color=#0000ff>CHAR<\/FONT> <FONT color=#808080>(<\/FONT>9<FONT color=#808080>),<\/FONT> <FONT color=#008000>&#8212; saving 244 bytes<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">StateName <FONT color=#0000ff>VARCHAR<\/FONT> <FONT color=#808080>(<\/FONT>256<FONT color=#808080>),<\/FONT> <FONT color=#008000>&#8212; saving at least 240 bytes (longest state name is 14 + 2-byte varchar overhead)<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">Sex <FONT color=#0000ff>BIT<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">Employed <FONT color=#0000ff>BIT<\/FONT><FONT color=#808080>,<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">SelfEmployed <FONT color=#0000ff>BIT<\/FONT><FONT color=#808080>,<\/FONT> <FONT color=#008000>&#8212; saving 11 bytes altogether over these three fields<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">EthnicOrigin <FONT color=#0000ff>TINYINT<\/FONT><FONT color=#808080>,<\/FONT> <FONT color=#008000>&#8212; saving 3 bytes<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">MaritalStatus <FONT color=#0000ff>TINYINT<\/FONT><FONT color=#808080>,<\/FONT> <FONT color=#008000>&#8212; saving 3 bytes<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">NumberOfDependents <FONT color=#0000ff>TINYINT<\/FONT><FONT color=#808080>,<\/FONT> <FONT color=#008000>&#8212; saving 3 bytes<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">Age <FONT color=#0000ff>TINYINT<\/FONT><FONT color=#808080>,<\/FONT> <FONT color=#008000>&#8212; saving 3 bytes<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">CountryOfBirth <FONT color=#0000ff>TINYINT<\/FONT><FONT color=#808080>,<\/FONT> <FONT color=#008000>&#8212; saving 3 bytes<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">HouseholdIncomeGroup <FONT color=#0000ff>TINYINT<\/FONT><FONT color=#808080>,<\/FONT> <FONT color=#008000>&#8212; saving 3 bytes<\/P><\/FONT><\/FONT><br \/>\n<P><FONT face=\"Courier New\">ZipCode5 <FONT color=#0000ff>INTEGER<\/FONT><FONT color=#808080>);<\/FONT> <FONT color=#008000>&#8212; no saving<\/P><\/BLOCKQUOTE><\/FONT><\/FONT><FONT face=\"Courier New\" size=2><br \/>\n<P>GO<\/P><\/BLOCKQUOTE><\/FONT><br \/>\n<P dir=ltr>The bad schema gives a per-row size of 574 bytes and the cleaned-up schema is no more than 48 bytes per-row. I designed these two schemas to support a US census. The population of the USA is approx. 300 million. This means the bad schema would take around 190GB to store all the info, and the cleaned-up schema only takes around 15GB &#8211; more than 12 times more efficient! Now we&#8217;re starting to see how poor data-type choice can lead to poor performance.<\/P><br \/>\n<P dir=ltr>Wider rows means:<\/P><br \/>\n<UL dir=ltr><br \/>\n<LI><br \/>\n<DIV>Fewer rows can fit on an 8k page.<\/DIV><br \/>\n<LI><br \/>\n<DIV>More CPU is necessary to crack open a record due to the number of CPU data cache line invalidations necessary to read the record into the CPU&#8217;s various caches (every time a cache line is invalidated it takes a bunch of CPU cycles &#8211; see <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_line\">here<\/a> for an explanation of CPUs and cache lines).<\/DIV><\/LI><\/UL><br \/>\n<P>Less rows per page means:<\/P><br \/>\n<UL><br \/>\n<LI><br \/>\n<DIV>More pages are needed to store the data<\/DIV><br \/>\n<LI><br \/>\n<DIV>Indexes could have a smaller fan-out (if the index keys are wider than then need to be), leading to more levels in the index and less efficient index navigation from the index root page to the index leaf-level.<\/DIV><\/LI><\/UL><br \/>\n<P>More pages means:<\/P><br \/>\n<UL><br \/>\n<LI><br \/>\n<DIV>More IOs are necessary to read the same amount of actual data<\/DIV><br \/>\n<LI><br \/>\n<DIV>More buffer pool memory is necessary to hold the same amount of actual data<\/DIV><br \/>\n<LI><br \/>\n<DIV>More disk space is necessary to hold the same amount of actual data<\/DIV><\/LI><\/UL><br \/>\n<P>Clearly there&#8217;s a link between various aspects of workload performance and badly chosen data-types.<\/P><\/FONT><\/FONT><\/FONT><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In one of the sessions Kimberly and I taught this week at SQL Connections, we discussed how to choose efficient data-types &#8211; I&#8217;d like to share the discussion here with an example. The crux of the matter is in the amount of space required to store the data-types in the schema, and ensuring that the [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62,66],"tags":[],"class_list":["post-1132","post","type-post","status-publish","format-standard","hentry","category-on-disk-structures","category-performance-tuning"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How can data-type choice affect performance? - Paul S. Randal<\/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.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How can data-type choice affect performance? - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"In one of the sessions Kimberly and I taught this week at SQL Connections, we discussed how to choose efficient data-types &#8211; I&#8217;d like to share the discussion here with an example. The crux of the matter is in the amount of space required to store the data-types in the schema, and ensuring that the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2007-11-09T22:31:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-04-13T16:52:05+00:00\" \/>\n<meta name=\"author\" content=\"Paul Randal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paul Randal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/\",\"name\":\"How can data-type choice affect performance? - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"datePublished\":\"2007-11-09T22:31:10+00:00\",\"dateModified\":\"2017-04-13T16:52:05+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How can data-type choice affect performance?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\",\"name\":\"Paul S. Randal\",\"description\":\"In Recovery...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\",\"name\":\"Paul Randal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"caption\":\"Paul Randal\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/paul\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How can data-type choice affect performance? - Paul S. Randal","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.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/","og_locale":"en_US","og_type":"article","og_title":"How can data-type choice affect performance? - Paul S. Randal","og_description":"In one of the sessions Kimberly and I taught this week at SQL Connections, we discussed how to choose efficient data-types &#8211; I&#8217;d like to share the discussion here with an example. The crux of the matter is in the amount of space required to store the data-types in the schema, and ensuring that the [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/","og_site_name":"Paul S. Randal","article_published_time":"2007-11-09T22:31:10+00:00","article_modified_time":"2017-04-13T16:52:05+00:00","author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/","name":"How can data-type choice affect performance? - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"datePublished":"2007-11-09T22:31:10+00:00","dateModified":"2017-04-13T16:52:05+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/how-can-data-type-choice-affect-performance\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"How can data-type choice affect performance?"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/","name":"Paul S. Randal","description":"In Recovery...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce","name":"Paul Randal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","caption":"Paul Randal"},"sameAs":["http:\/\/3.209.169.194\/blogs\/paul"],"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/1132","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/comments?post=1132"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/1132\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=1132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=1132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=1132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}