Warning: Constant WP_TEMP_DIR already defined in /var/www/html/blogs/joe/wp-config.php on line 93

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/blogs/joe/wp-config.php:93) in /var/www/html/blogs/joe/wp-includes/rest-api/class-wp-rest-server.php on line 1902

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/blogs/joe/wp-config.php:93) in /var/www/html/blogs/joe/wp-includes/rest-api/class-wp-rest-server.php on line 1902

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/blogs/joe/wp-config.php:93) in /var/www/html/blogs/joe/wp-includes/rest-api/class-wp-rest-server.php on line 1902

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/blogs/joe/wp-config.php:93) in /var/www/html/blogs/joe/wp-includes/rest-api/class-wp-rest-server.php on line 1902

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/blogs/joe/wp-config.php:93) in /var/www/html/blogs/joe/wp-includes/rest-api/class-wp-rest-server.php on line 1902

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/blogs/joe/wp-config.php:93) in /var/www/html/blogs/joe/wp-includes/rest-api/class-wp-rest-server.php on line 1902

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/blogs/joe/wp-config.php:93) in /var/www/html/blogs/joe/wp-includes/rest-api/class-wp-rest-server.php on line 1902

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/blogs/joe/wp-config.php:93) in /var/www/html/blogs/joe/wp-includes/rest-api/class-wp-rest-server.php on line 1902
{"id":511,"date":"2012-01-25T04:44:00","date_gmt":"2012-01-25T04:44:00","guid":{"rendered":"\/blogs\/joe\/post\/Hash-Partitioning-with-SQL-Server-2012e28099s-SEQUENCE-object-and-CYCLE-argument.aspx"},"modified":"2013-01-20T10:03:34","modified_gmt":"2013-01-20T18:03:34","slug":"hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/","title":{"rendered":"Hash Partitioning with SQL Server 2012\u2019s SEQUENCE object and CYCLE argument"},"content":{"rendered":"

When I first heard about SQL Server 2012\u2019s SEQUENCE object \u2013 I thought it was an interesting feature to be added and one that I have been asked about by customers in the past (from those who had worked on different database platforms).\u00a0 <\/span>But when I looked at the CYCLE argument of SEQUENCE, that\u2019s when I really<\/em> got interested.<\/span><\/span><\/p>\n

I wondered if it could be used in the service of implementing hash partitioning (of sorts) \u2013 allowing me to evenly distribute rows across a set number of partitions based on a hash key.\u00a0 <\/span>In this scenario I want the distribution to be evenly spread out, but NOT partition based on other business keys (like a datetime column or other attribute that has business or application meaning).<\/span><\/span><\/p>\n

So will a column with a sequence default also work as a partition key?<\/span>\u00a0 <\/span><\/span><\/span><\/p>\n

I started off by creating a new table based on AdventureWorkDWDenali\u2019s FactInternetSales table:<\/span><\/span><\/p>\n

— Create demonstration Fact table, no constraints, indexes, keys
\n— Tested on version 11.0.1750 (SQL Server 2012 RC0)
\nUSE [SequenceDemo];
\nGO
\nCREATE TABLE [dbo].[FactInternetSales](
\n[ProductKey] [int] NOT NULL,
\n[OrderDateKey] [int] NOT NULL,
\n[DueDateKey] [int] NOT NULL,
\n[ShipDateKey] [int] NOT NULL,
\n[CustomerKey] [int] NOT NULL,
\n[PromotionKey] [int] NOT NULL,
\n[CurrencyKey] [int] NOT NULL,
\n[SalesTerritoryKey] [int] NOT NULL,
\n[SalesOrderNumber] [nvarchar](20) NOT NULL,
\n[SalesOrderLineNumber] [tinyint] NOT NULL,
\n[RevisionNumber] [tinyint] NOT NULL,
\n[OrderQuantity] [smallint] NOT NULL,
\n[UnitPrice] [money] NOT NULL,
\n[ExtendedAmount] [money] NOT NULL,
\n[UnitPriceDiscountPct] [float] NOT NULL,
\n[DiscountAmount] [float] NOT NULL,
\n[ProductStandardCost] [money] NOT NULL,
\n[TotalProductCost] [money] NOT NULL,
\n[SalesAmount] [money] NOT NULL,
\n[TaxAmt] [money] NOT NULL,
\n[Freight] [money] NOT NULL,
\n[CarrierTrackingNumber] [nvarchar](25) NULL,
\n[CustomerPONumber] [nvarchar](25) NULL,
\n[OrderDate] datetime NULL,
\n[DueDate] datetime NULL,
\n[ShipDate] datetime NULL
\n)ON [PRIMARY];
\nGO<\/p>\n

Next I created the sequence object (increment by 1, with a min of 1, max of 10, caching of 10 at a time and a cycling of values):<\/span><\/span><\/p>\n

CREATE SEQUENCE dbo.Seq_FactInternetSales
\nAS int
\nSTART WITH 1
\nINCREMENT BY 1
\nMINVALUE 1
\nMAXVALUE 10
\nCYCLE
\nCACHE 10;<\/p>\n

After that, I added a new column to the Fact table called PartitionBucketKey and associated it with the new sequence object:<\/span><\/span><\/p>\n

ALTER TABLE [dbo].[FactInternetSales]
\nADD PartitionBucketKey int DEFAULT
\n(NEXT VALUE FOR dbo.Seq_FactInternetSales);<\/p>\n

Next, I created a partition function and scheme:<\/span><\/span><\/p>\n

— Create a new partition function
\nCREATE PARTITION FUNCTION pfFactInternetSales(int)
\nAS RANGE LEFT FOR VALUES (1,2,3,4,5,6,7,8,9);
\n— Create a new partition scheme
\n— And yes, being lazy about the FGs, as I just want to see whether the
\n— individual partitions fan-out the way I want…
\nCREATE PARTITION SCHEME psFactInternetSales
\nAS PARTITION pfFactInternetSales
\nALL TO ( [PRIMARY] );<\/p>\n

Next up, I created a clustered index on the table referencing the PK columns used in the original version of this table but then referencing the PartitionBucketKey in partition scheme:<\/span><\/span><\/p>\n

— Create it on the new column referencing the sequence
\nCREATE CLUSTERED INDEX IX_FactInternetSales
\nON\u00a0 dbo.FactInternetSales(SalesOrderNumber, SalesOrderLineNumber)
\nON psFactInternetSales(PartitionBucketKey);<\/p>\n

It\u2019s show time.\u00a0 <\/span>Now I went ahead and populated 60,398 rows from the original table.\u00a0 <\/span>Not much for this test I realize, but this was just an initial proof-of-concept:<\/span><\/span><\/p>\n

INSERT dbo.FactInternetSales
\n(ProductKey, OrderDateKey, DueDateKey, ShipDateKey, CustomerKey,
\nPromotionKey, CurrencyKey, SalesTerritoryKey, SalesOrderNumber,
\nSalesOrderLineNumber, RevisionNumber, OrderQuantity, UnitPrice,
\nExtendedAmount, UnitPriceDiscountPct, DiscountAmount, ProductStandardCost,
\nTotalProductCost, SalesAmount, TaxAmt, Freight, CarrierTrackingNumber,
\nCustomerPONumber, OrderDate, DueDate, ShipDate)
\nSELECT ProductKey, OrderDateKey, DueDateKey, ShipDateKey, CustomerKey,
\nPromotionKey, CurrencyKey, SalesTerritoryKey, SalesOrderNumber,
\nSalesOrderLineNumber, RevisionNumber, OrderQuantity, UnitPrice,
\nExtendedAmount, UnitPriceDiscountPct, DiscountAmount, ProductStandardCost,
\nTotalProductCost, SalesAmount, TaxAmt, Freight, CarrierTrackingNumber,
\nCustomerPONumber, OrderDate, DueDate, ShipDate
\nFROM [AdventureWorksDWDenali].[dbo].[FactInternetSales];<\/p>\n

Now I\u2019ll check if the 60,398 rows were divided up evenly over the 10 partitions:<\/span><\/span><\/p>\n

SELECT partition_number, row_count
\nFROM sys.dm_db_partition_stats
\nWHERE object_id = object_id(‘[dbo].[FactInternetSales]’);<\/p>\n

\"clip_image001\"<\/a><\/span><\/p>\n

It worked.\u00a0 And i<\/span><\/span>f you look at the individual rows, you\u2019ll see the cycle of sequence values were defined based on the PK composite key (SalesOrderNumber, SalesOrderLineNumber):<\/span><\/span><\/p>\n

SELECT SalesOrderNumber, SalesOrderLineNumber, PartitionBucketKey
\nFROM [dbo].[FactInternetSales]
\nORDER BY SalesOrderNumber, SalesOrderLineNumber;<\/p>\n

\"clip_image003\"<\/a><\/span><\/p>\n

Okay, so it works.\u00a0 <\/span>But is this a wise thing to do?<\/span>\u00a0 <\/span><\/span><\/span><\/p>\n

I don\u2019t know yet.\u00a0 <\/span>I have other questions about this technique and I\u2019d like to do more testing on various scenarios.\u00a0 <\/span>But I do<\/em> like the fact that I\u2019m able to leverage a native engine feature in service of another native engine feature.\u00a0 <\/span>Time will tell if this is a viable pattern or a known anti-pattern.<\/span><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"

When I first heard about SQL Server 2012\u2019s SEQUENCE object \u2013 I thought it was an interesting feature to be added and one that I have been asked about by customers in the past (from those who had worked on different database platforms).\u00a0 But when I looked at the CYCLE argument of SEQUENCE, that\u2019s when […]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,34],"tags":[],"class_list":["post-511","post","type-post","status-publish","format-standard","hentry","category-performance","category-t-sql"],"yoast_head":"\nSQL Server SEQUENCE object hash partitioning - Joe Sack<\/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\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server SEQUENCE object hash partitioning - Joe Sack\" \/>\n<meta property=\"og:description\" content=\"When I first heard about SQL Server 2012\u2019s SEQUENCE object \u2013 I thought it was an interesting feature to be added and one that I have been asked about by customers in the past (from those who had worked on different database platforms).\u00a0 But when I looked at the CYCLE argument of SEQUENCE, that\u2019s when […]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/\" \/>\n<meta property=\"og:site_name\" content=\"Joe Sack\" \/>\n<meta property=\"article:published_time\" content=\"2012-01-25T04:44:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-01-20T18:03:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/hash-partitioning-with-sql-server-2012s-\/608ca4aa\/clip_image001_thumb.png\" \/>\n<meta name=\"author\" content=\"Joseph Sack\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joseph Sack\" \/>\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\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/\",\"name\":\"SQL Server SEQUENCE object hash partitioning - Joe Sack\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#website\"},\"datePublished\":\"2012-01-25T04:44:00+00:00\",\"dateModified\":\"2013-01-20T18:03:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Performance\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/performance\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Hash Partitioning with SQL Server 2012\u2019s SEQUENCE object and CYCLE argument\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/\",\"name\":\"Joe Sack\",\"description\":\"SQL Server Performance Tuning, High Availability and Disaster Recovery Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648\",\"name\":\"Joseph Sack\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a4b39a7719a6bfff1add3ec00527810734579ee114d6d983e8e68f937b77be96?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a4b39a7719a6bfff1add3ec00527810734579ee114d6d983e8e68f937b77be96?s=96&d=mm&r=g\",\"caption\":\"Joseph Sack\"},\"description\":\"Joe Sack is a Principal Consultant with SQLskills. He has worked as a SQL Server professional since 1997 and has supported and developed for SQL Server environments in financial services, IT consulting, manufacturing, retail and the real estate industry. Prior to joining SQLskills he worked at Microsoft as a Premier Field Engineer supporting very large enterprise customer environments. He was responsible for providing deep SQL Server advisory services, training, troubleshooting and ongoing solutions guidance. His areas of expertise include performance tuning, scalability, T-SQL development and high-availability. In 2006 Joe earned the \u201cMicrosoft Certified Master: SQL Server 2005\u201d certification and in 2008 he earned the \u201cMicrosoft Certified Master: SQL Server 2008\u201d certification. In 2009 he took over responsibility for the entire SQL Server Microsoft Certified Master program and held that post until 2011. He was given the SQL Server MVP award in 2013.\",\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/joe\",\"https:\/\/twitter.com\/https:\/\/twitter.com\/josephsack\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/author\/joe\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SQL Server SEQUENCE object hash partitioning - Joe Sack","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\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/","og_locale":"en_US","og_type":"article","og_title":"SQL Server SEQUENCE object hash partitioning - Joe Sack","og_description":"When I first heard about SQL Server 2012\u2019s SEQUENCE object \u2013 I thought it was an interesting feature to be added and one that I have been asked about by customers in the past (from those who had worked on different database platforms).\u00a0 But when I looked at the CYCLE argument of SEQUENCE, that\u2019s when […]","og_url":"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/","og_site_name":"Joe Sack","article_published_time":"2012-01-25T04:44:00+00:00","article_modified_time":"2013-01-20T18:03:34+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/hash-partitioning-with-sql-server-2012s-\/608ca4aa\/clip_image001_thumb.png"}],"author":"Joseph Sack","twitter_misc":{"Written by":"Joseph Sack","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/","url":"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/","name":"SQL Server SEQUENCE object hash partitioning - Joe Sack","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#website"},"datePublished":"2012-01-25T04:44:00+00:00","dateModified":"2013-01-20T18:03:34+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/hash-partitioning-with-sql-server-2012s-sequence-object-and-cycle-argument\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/"},{"@type":"ListItem","position":2,"name":"Performance","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/performance\/"},{"@type":"ListItem","position":3,"name":"Hash Partitioning with SQL Server 2012\u2019s SEQUENCE object and CYCLE argument"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/joe\/","name":"Joe Sack","description":"SQL Server Performance Tuning, High Availability and Disaster Recovery Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/joe\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648","name":"Joseph Sack","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a4b39a7719a6bfff1add3ec00527810734579ee114d6d983e8e68f937b77be96?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a4b39a7719a6bfff1add3ec00527810734579ee114d6d983e8e68f937b77be96?s=96&d=mm&r=g","caption":"Joseph Sack"},"description":"Joe Sack is a Principal Consultant with SQLskills. He has worked as a SQL Server professional since 1997 and has supported and developed for SQL Server environments in financial services, IT consulting, manufacturing, retail and the real estate industry. Prior to joining SQLskills he worked at Microsoft as a Premier Field Engineer supporting very large enterprise customer environments. He was responsible for providing deep SQL Server advisory services, training, troubleshooting and ongoing solutions guidance. His areas of expertise include performance tuning, scalability, T-SQL development and high-availability. In 2006 Joe earned the \u201cMicrosoft Certified Master: SQL Server 2005\u201d certification and in 2008 he earned the \u201cMicrosoft Certified Master: SQL Server 2008\u201d certification. In 2009 he took over responsibility for the entire SQL Server Microsoft Certified Master program and held that post until 2011. He was given the SQL Server MVP award in 2013.","sameAs":["http:\/\/3.209.169.194\/blogs\/joe","https:\/\/twitter.com\/https:\/\/twitter.com\/josephsack"],"url":"https:\/\/www.sqlskills.com\/blogs\/joe\/author\/joe\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts\/511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/comments?post=511"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts\/511\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/media?parent=511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/categories?post=511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/tags?post=511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}