{"id":1264,"date":"2017-01-12T20:35:04","date_gmt":"2017-01-12T20:35:04","guid":{"rendered":"http:\/\/nenadnoveljic.com\/blog\/?p=1264"},"modified":"2017-04-01T22:08:35","modified_gmt":"2017-04-01T22:08:35","slug":"index-organized-table-vs-clustered-index","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/","title":{"rendered":"Index Organized Table vs. Clustered Index"},"content":{"rendered":"<p><a href=\"https:\/\/docs.oracle.com\/database\/121\/CNCPT\/indexiot.htm#CNCPT911\" target=\"_blank\">Index Organized Tables (IOTs)<\/a> and <a href=\"https:\/\/msdn.microsoft.com\/en-us\/us-en\/library\/ms190457.aspx\" target=\"_blank\">Clustered Indexes<\/a> are data structures in Oracle and SQL Server, respectively, which, unlike heap tables, store non-key data together with the index key in the B-tree structure. As a consequence, no additional lookup is needed for retrieval when data is queried based on the index key.<\/p>\n<p>In this blog post I&#8217;ll compare the efficiency in terms of consistent gets\/logical reads of two database products. In particular, a case with a secondary\/nonclustered index will be considered. The tests were performed on the currently latest releases of both products &#8211; Oracle 12.1 and SQL Server 2016.<\/p>\n<h1>IOT<\/h1>\n<p>First, I&#8217;ll create a table with three columns, a primary key and a secondary index:<\/p>\n<pre><code>drop table t_iot ;\r\n\r\ncreate table t_iot ( \r\n  n1 number , n2 number , n3 number , constraint pk_t_iot primary key (n1) \r\n) organization index ;\r\n\r\ninsert into t_iot \r\n  SELECT level,level,level\r\n  FROM   dual\r\n  CONNECT BY level &lt;= 1000000 ; create index ix_t_iot_n2 on t_iot (n2) ; \r\n\r\nexec dbms_stats.gather_table_stats(user,'T_IOT',cascade =&gt; true ) ;<\/code><\/pre>\n<p>Then, I&#8217;ll execute different queries to measure the number of consistent gets for different access paths:<\/p>\n<ul>\n<li>primary key<\/li>\n<li>secondary index without a lookup (the selected column is contained in the secondary index)<\/li>\n<li>secondary index with a lookup (the selected column is not contained in the secondary index, so it must be retrieved from the table)<\/li>\n<\/ul>\n<pre><code>set autotrace traceonly explain statistics ;\r\nSQL&gt; set autotrace traceonly explain statistics ;\r\nSQL&gt; select <span style=\"color: #ff0000;\">n1<\/span> from t_iot where <span style=\"color: #ff0000;\">n1=1<\/span> ;\r\n                                                                              \r\n------------------------------------------------------------------------------  \r\n| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |  \r\n------------------------------------------------------------------------------  \r\n|   0 | SELECT STATEMENT  |          |     1 |     5 |     1   (0)| 00:00:01 |  \r\n|*  1 |  <span style=\"color: #ff0000;\">INDEX UNIQUE SCAN| PK_T_IOT<\/span> |     1 |     5 |     1   (0)| 00:00:01 |  \r\n------------------------------------------------------------------------------  \r\n                                                                                \r\nStatistics\r\n----------------------------------------------------------                      \r\n          <span style=\"color: #ff0000;\">2  consistent gets<\/span>                                                    \r\n\r\n\t\t  \r\nSQL&gt; select <span style=\"color: #ff0000;\">n2<\/span> from t_iot where <span style=\"color: #ff0000;\">n2=1<\/span> ;\r\n                                                                      \r\n--------------------------------------------------------------------------------\r\n| Id  | Operation        | Name        | Rows  | Bytes | Cost (%CPU)| Time     |\r\n--------------------------------------------------------------------------------\r\n|   0 | SELECT STATEMENT |             |     1 |     5 |     1   (0)| 00:00:01 |\r\n|*  1 |  <span style=\"color: #ff0000;\">INDEX RANGE SCAN| IX_T_IOT_N2<\/span> |     1 |     5 |     1   (0)| 00:00:01 |\r\n--------------------------------------------------------------------------------\r\n                                                                                \r\nStatistics\r\n----------------------------------------------------------                      \r\n          <span style=\"color: #ff0000;\">3  consistent gets<\/span>                                                    \r\n\r\nSQL&gt; select <span style=\"color: #ff0000;\">*<\/span> from t_iot where <span style=\"color: #ff0000;\">n2=1<\/span> ;\r\n\r\n---------------------------------------------------------------------------------\r\n| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |\r\n|   0 | SELECT STATEMENT  |             |     1 |    15 |     1   (0)| 00:00:01 |\r\n|*  1 |  <span style=\"color: #ff0000;\">INDEX UNIQUE SCAN| PK_T_IOT<\/span>    |     1 |    15 |     1   (0)| 00:00:01 |\r\n|*  2 |   <span style=\"color: #ff0000;\">INDEX RANGE SCAN| IX_T_IOT_N2<\/span> |     1 |       |     1   (0)| 00:00:01 |\r\n---------------------------------------------------------------------------------\r\n                                                                                \r\nStatistics\r\n----------------------------------------------------------                      \r\n          <span style=\"color: #ff0000;\">4  consistent gets                                                    \r\n\t\t  \r\n<\/span><\/code><\/pre>\n<p>The following table summarizes the the number of consistent gets for different access paths:<\/p>\n\n<table id=\"tablepress-1\" class=\"tablepress tablepress-id-1\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">access path<\/th><th class=\"column-2\">consistent gets<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">primary key<\/td><td class=\"column-2\">2<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">secondary index without lookup<\/td><td class=\"column-2\">3<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">secondary index with lookup<\/td><td class=\"column-2\">4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-1 from cache -->\n<p>Since the lookup after the access to the secondary index caused only one consistent get and the retrieval over primary key took two consistent gets, we can conclude that the lookup was performed over the rowid instead of the primary key.<\/p>\n<p>The reason for this efficiency is that secondary indexes include a physical guess, which is the physical rowid of the index entry when it was first made. If the physical guess is not stale, the row will be retrieved via rowid. The primary key needs to be scanned otherwise. Richard Foote explained this behaviour in more detail in his blog post\u00a0<a href=\"https:\/\/richardfoote.wordpress.com\/2012\/04\/26\/iot-secondary-indexes-the-logical-rowid-guess-component-part-i-lucky\/\" target=\"_blank\">IOT Secondary Indexes \u2013 The Logical ROWID Guess Component Part I (Lucky)<\/a> .<\/p>\n<p>Oracle developers implemented this cunning idea to avoid primary key scans.<\/p>\n<h1>Clustered Index<\/h1>\n<p>Let&#8217;s see how SQL Server behaves in such a situation. First, I&#8217;ll create a similar structure.<\/p>\n<pre><code>drop table t_clustered ;\r\n\r\ncreate table t_clustered (\r\nn1 integer , n2 integer , n3 integer ,\r\nCONSTRAINT PK_t_clustered PRIMARY KEY CLUSTERED (\r\nn1 ASC\r\n)) ;\r\n\r\ncreate index ix_t_clustered_n2 on t_clustered(n2) ;\r\n\r\ninsert into t_clustered select top(1000000)\r\nCONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id])),\r\nCONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id])),\r\nCONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id]))\r\nFROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2\r\nOPTION (MAXDOP 1);\r\n<\/code><\/pre>\n<p>Second, I&#8217;ll run the same queries as with Oracle:<\/p>\n<pre><code>set statistics io on\r\n\r\nselect <span style=\"color: #ff0000;\">n1<\/span> from t_clustered where <span style=\"color: #ff0000;\">n1 = 1<\/span> ;\r\n\r\n|--<span style=\"color: #ff0000;\">Clustered Index Seek(OBJECT:([master].[dbo].[t_clustered].[PK_t_clustered])<\/span>, SEEK:([master].[dbo].[t_clustered].[n1]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)\r\nTable 't_clustered'. Scan count 0, <span style=\"color: #ff0000;\">logical reads 3<\/span>, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.\r\n\r\nselect <span style=\"color: #ff0000;\">n2<\/span> from t_clustered where <span style=\"color: #ff0000;\">n2 = 1<\/span> ;\r\n\r\n|--<span style=\"color: #ff0000;\">Index Seek(OBJECT:([master].[dbo].[t_clustered].[ix_t_clustered_n2])<\/span>, SEEK:([master].[dbo].[t_clustered].[n2]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)\r\nTable 't_clustered'. Scan count 1, <span style=\"color: #ff0000;\">logical reads 3<\/span>, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.\r\n\r\nselect <span style=\"color: #ff0000;\">*<\/span> from t_clustered where <span style=\"color: #ff0000;\">n2 = 1<\/span> ;\r\n\r\n|--Nested Loops(Inner Join, OUTER REFERENCES:([master].[dbo].[t_clustered].[n1]))\r\n  |--<span style=\"color: #ff0000;\">Index Seek(OBJECT:([master].[dbo].[t_clustered].[ix_t_clustered_n2])<\/span>, SEEK:([master].[dbo].[t_clustered].[n2]=(1)) ORDERED FORWARD)\r\n  |--<span style=\"color: #ff0000;\">Clustered Index Seek(OBJECT:([master].[dbo].[t_clustered]<\/span>.[PK_t_clustered]), SEEK:([master].[dbo].[t_clustered].[n1]=[master].[dbo].[t_clustered].[n1]) LOOKUP ORDERED FORWARD)\r\nTable 't_clustered'. Scan count 1, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.\r\n\r\n<\/code><\/pre>\n<p>Finally, the table below shows the number of logical reads for different access paths. The nonclustered index in SQL Server corresponds with the secondary index in Oracle.<\/p>\n\n<table id=\"tablepress-2\" class=\"tablepress tablepress-id-2\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">access path<\/th><th class=\"column-2\">logical reads<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">clustered index (primary key)<\/td><td class=\"column-2\">3<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">nonclustered index without lookup<\/td><td class=\"column-2\">3<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">nonclustered index with lookup<\/td><td class=\"column-2\">6<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-2 from cache -->\n<p>Unlike Oracle, SQL Server does a lookup based on the primary key, so clustered index seek needs to be performed in order to retrieve data. In this case three logical reads were done instead of only one.<\/p>\n<h1>Conclusion<\/h1>\n<p>In conclusion, SQL Server needs to traverse the clustered index to retrieve a row. In contrast, Oracle database stores initial physical rowids in the secondary index. By doing so, in the best case scenario only a single logical read is additionally needed to retrieve the row from the table.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comparing efficiency of IOT in Oracle with Clustered Index in SQL Server. <a href=\"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[21,5,17],"tags":[],"class_list":["post-1264","post","type-post","status-publish","format-standard","hentry","category-comparison-oracle-sql-server","category-oracle","category-sql-server"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Index Organized Table vs. Clustered Index - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"Comparing efficiency of IOT in Oracle with Clustered Index in SQL Server.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Index Organized Table vs. Clustered Index - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Comparing efficiency of IOT in Oracle with Clustered Index in SQL Server.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-12T20:35:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-04-01T22:08:35+00:00\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\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\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Index Organized Table vs. Clustered Index\",\"datePublished\":\"2017-01-12T20:35:04+00:00\",\"dateModified\":\"2017-04-01T22:08:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/\"},\"wordCount\":465,\"commentCount\":0,\"articleSection\":[\"Comparison Oracle-SQL Server\",\"Oracle\",\"SQL Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/\",\"name\":\"Index Organized Table vs. Clustered Index - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2017-01-12T20:35:04+00:00\",\"dateModified\":\"2017-04-01T22:08:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"Comparing efficiency of IOT in Oracle with Clustered Index in SQL Server.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/index-organized-table-vs-clustered-index\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Index Organized Table vs. Clustered Index\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Index Organized Table vs. Clustered Index - All-round Database Topics","description":"Comparing efficiency of IOT in Oracle with Clustered Index in SQL Server.","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:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/","og_locale":"en_US","og_type":"article","og_title":"Index Organized Table vs. Clustered Index - All-round Database Topics","og_description":"Comparing efficiency of IOT in Oracle with Clustered Index in SQL Server.","og_url":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/","og_site_name":"All-round Database Topics","article_published_time":"2017-01-12T20:35:04+00:00","article_modified_time":"2017-04-01T22:08:35+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Index Organized Table vs. Clustered Index","datePublished":"2017-01-12T20:35:04+00:00","dateModified":"2017-04-01T22:08:35+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/"},"wordCount":465,"commentCount":0,"articleSection":["Comparison Oracle-SQL Server","Oracle","SQL Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/","url":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/","name":"Index Organized Table vs. Clustered Index - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2017-01-12T20:35:04+00:00","dateModified":"2017-04-01T22:08:35+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"Comparing efficiency of IOT in Oracle with Clustered Index in SQL Server.","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/index-organized-table-vs-clustered-index\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Index Organized Table vs. Clustered Index"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1264","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=1264"}],"version-history":[{"count":2,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1264\/revisions"}],"predecessor-version":[{"id":1494,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1264\/revisions\/1494"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=1264"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=1264"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=1264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}