<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Btree Index &#8211; Database Research &amp; Development</title>
	<atom:link href="https://www.dbrnd.com/tag/btree-index/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbrnd.com</link>
	<description>BIGData &#124; NoSQL &#124; MSSQL &#124; MySQL &#124; PostgreSQL</description>
	<lastBuildDate>Sun, 02 Oct 2016 18:27:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>
	<item>
		<title>PostgreSQL: How we can create Index on Expression?</title>
		<link>https://www.dbrnd.com/2016/10/postgresql-how-we-can-create-index-on-expression-brin-btree-partial-index/</link>
		
		<dc:creator><![CDATA[Anvesh Patel]]></dc:creator>
		<pubDate>Mon, 03 Oct 2016 16:16:58 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Anvesh Patel]]></category>
		<category><![CDATA[BRIN Index]]></category>
		<category><![CDATA[Btree Index]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[database research and development]]></category>
		<category><![CDATA[dbrnd]]></category>
		<category><![CDATA[Expression Index]]></category>
		<category><![CDATA[Index Performance]]></category>
		<category><![CDATA[Partial Index]]></category>
		<category><![CDATA[plpgsql]]></category>
		<category><![CDATA[Postgres Query]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[postgresql 9.5]]></category>
		<category><![CDATA[PostgreSQL Administrator]]></category>
		<category><![CDATA[PostgreSQL Error]]></category>
		<category><![CDATA[PostgreSQL Programming]]></category>
		<category><![CDATA[PostgreSQL Tips and Tricks]]></category>
		<guid isPermaLink="false">https://www.dbrnd.com/?p=3744</guid>

					<description><![CDATA[If you are searching about, What is Expression Index, this is the one of the right article for you. We know about the different types of PostgreSQL Index. If you don&#8217;t about this, please visit below few links. What is BRIN (Block Range Index )? What is Partial Index? What is BTree Index? Most of [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.dbrnd.com%2F2016%2F10%2Fpostgresql-how-we-can-create-index-on-expression-brin-btree-partial-index%2F&amp;linkname=PostgreSQL%3A%20How%20we%20can%20create%20Index%20on%20Expression%3F" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.dbrnd.com%2F2016%2F10%2Fpostgresql-how-we-can-create-index-on-expression-brin-btree-partial-index%2F&amp;linkname=PostgreSQL%3A%20How%20we%20can%20create%20Index%20on%20Expression%3F" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fwww.dbrnd.com%2F2016%2F10%2Fpostgresql-how-we-can-create-index-on-expression-brin-btree-partial-index%2F&amp;linkname=PostgreSQL%3A%20How%20we%20can%20create%20Index%20on%20Expression%3F" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pinterest" href="https://www.addtoany.com/add_to/pinterest?linkurl=https%3A%2F%2Fwww.dbrnd.com%2F2016%2F10%2Fpostgresql-how-we-can-create-index-on-expression-brin-btree-partial-index%2F&amp;linkname=PostgreSQL%3A%20How%20we%20can%20create%20Index%20on%20Expression%3F" title="Pinterest" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Fwww.dbrnd.com%2F2016%2F10%2Fpostgresql-how-we-can-create-index-on-expression-brin-btree-partial-index%2F&amp;linkname=PostgreSQL%3A%20How%20we%20can%20create%20Index%20on%20Expression%3F" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=https%3A%2F%2Fwww.dbrnd.com%2F2016%2F10%2Fpostgresql-how-we-can-create-index-on-expression-brin-btree-partial-index%2F&amp;linkname=PostgreSQL%3A%20How%20we%20can%20create%20Index%20on%20Expression%3F" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dbrnd.com%2F2016%2F10%2Fpostgresql-how-we-can-create-index-on-expression-brin-btree-partial-index%2F&#038;title=PostgreSQL%3A%20How%20we%20can%20create%20Index%20on%20Expression%3F" data-a2a-url="https://www.dbrnd.com/2016/10/postgresql-how-we-can-create-index-on-expression-brin-btree-partial-index/" data-a2a-title="PostgreSQL: How we can create Index on Expression?"></a></p><p>If you are searching about, What is Expression Index, this is the one of the right article for you. </p>
<p>We know about the different types of PostgreSQL Index.<br />
If you don&#8217;t about this, please visit below few links.</p>
<blockquote><p><a href="https://www.dbrnd.com/2016/08/postgresql-9-5-introduced-brin-block-range-index-with-detail-performance-test-report-on-6gb-table/" target="_blank"><strong>What is BRIN (Block Range Index )?</strong></a></p>
<p><a href="https://www.dbrnd.com/2016/08/postgresql-example-of-partial-unique-composite-index-to-avoid-duplicate-records/" target="_blank"><strong>What is Partial Index?</strong></a></p>
<p><a href="https://en.wikipedia.org/wiki/B-tree" target="_blank"><strong>What is BTree Index?</strong></a></p></blockquote>
<blockquote><p>Most of the Database Administrators or Developers are doing a common mistake,<br />
When you create any Index on Table Column, dose not mean that you can use the Indexed column in any expression and Index will work as per the expectation. </p></blockquote>
<blockquote><p>When you used Indexed column in any kind of expression, query planner simply skips the scanning of Indexes of that column. </p></blockquote>
<blockquote><p>For example,<br />
We have created one index on Date column and in WHERE are extracting days from this Date column.<br />
In this situation, the Index will not work on Date column and for such specific requirement, we have to create the Expression Index of PostgreSQL. </p></blockquote>
<p><strong>Let me demonstrate this.</strong></p>
<p><strong>First create one sample table:</strong></p>
<pre class="crayon-plain-tag">CREATE TABLE tbl_ItemTransactions 
(
	TranID SERIAL
	,TransactionDate TIMESTAMPTZ
	,TransactionName TEXT
);</pre> </p>
<p><strong>Generate sample data for testing the performance of Indexes:</strong></p>
<pre class="crayon-plain-tag">INSERT INTO tbl_ItemTransactions 
(TransactionDate, TransactionName)
SELECT x, 'dbrnd' 
FROM generate_series('2015-01-01 00:00:00'::timestamptz, '2016-08-01 00:00:00'::timestamptz,'2 seconds'::interval) a(x);</pre> </p>
<p><strong>Total inserted record count is 24969601:</strong></p>
<pre class="crayon-plain-tag">SELECT COUNT(1) FROM tbl_ItemTransactions;</pre> </p>
<p><strong>Now create index on TransactionDate column:</strong></p>
<pre class="crayon-plain-tag">CREATE INDEX idx_tbl_ItemTransactions_TransactionDate
ON tbl_ItemTransactions (TransactionDate);</pre> </p>
<p><strong>Lets see the plan of query with date filter:</strong></p>
<pre class="crayon-plain-tag">EXPLAIN ANALYZE
SELECT *FROM 
tbl_ItemTransactions 
WHERE TransactionDate BETWEEN '20150808' AND '20160108';
/*
"Index Scan using idx_tbl_itemtransactions_transactiondate on tbl_itemtransactions  
(cost=0.44..249472.54 rows=6681405 width=18) 
(actual time=61.558..17765.979 rows=6609601 loops=1)"
"Index Cond: ((transactiondate &gt;= '2015-08-08 00:00:00+05:30'::timestamp with time zone) AND 
(transactiondate &lt;= '2016-01-08 00:00:00+05:30'::timestamp with time zone))"
"Planning time: 87.751 ms"
"Execution time: 29691.279 ms"
*/</pre> </p>
<p><strong>Check Index usage by above query<br />
(Result is one index scan):</strong></p>
<pre class="crayon-plain-tag">SELECT *
FROM pg_stat_user_indexes
WHERE indexrelname='idx_tbl_itemtransactions_transactiondate';</pre> </p>
<p><strong>Lets see the plan of query with date function filter:</strong></p>
<pre class="crayon-plain-tag">EXPLAIN ANALYZE
SELECT *FROM 
tbl_ItemTransactions 
WHERE EXTRACT(day FROM TransactionDate) = 8;
/*
"Seq Scan on tbl_itemtransactions  
(cost=0.00..533587.00 rows=124848 width=18) 
(actual time=1246.093..37028.883 rows=820800 loops=1)"
"  Filter: (date_part('day'::text, transactiondate) = '8'::double precision)"
"  Rows Removed by Filter: 24148801"
"Planning time: 0.396 ms"
"Execution time: 58230.847 ms"
*/</pre> </p>
<p><strong>Check Index usage by above query:</strong><br />
The Result is one index scan, means above query processed without scaning any index.<br />
We created one index on TransactionDate, but when we use this column with any of default function, planner skips the index fot that column. </p>
<pre class="crayon-plain-tag">SELECT *
FROM pg_stat_user_indexes
WHERE indexrelname='idx_tbl_itemtransactions_transactiondate';</pre> </p>
<p><strong>Now we should create one expression Index:<br />
Please provide your require timezone otherwise It produces error like:</strong></p>
<pre class="crayon-plain-tag">ERROR: functions in index expression must be marked IMMUTABLE</pre> </p>
<pre class="crayon-plain-tag">CREATE INDEX idx_tbl_ItemTransactions_TransactionDate_day
ON tbl_ItemTransactions ((EXTRACT(day FROM TransactionDate AT TIME ZONE 'UTC')));</pre> </p>
<p><strong>Lets execute same query with date function filter:</strong></p>
<pre class="crayon-plain-tag">EXPLAIN ANALYZE
SELECT *FROM 
tbl_ItemTransactions 
WHERE EXTRACT(day FROM TransactionDate AT TIME ZONE 'UTC') = 8;
/*
"Bitmap Heap Scan on tbl_itemtransactions  (cost=2340.01..160893.01 rows=124848 width=18) 
(actual time=367.653..2181.489 rows=820800 loops=1)"
"  Recheck Cond: (date_part('day'::text, 
(transactiondate)::timestamp without time zone) = '8'::double precision)"
"  Heap Blocks: exact=5248"
"  -&gt;  Bitmap Index Scan on idx_tbl_itemtransactions_transactiondate_day  
(cost=0.00..2308.80 rows=124848 width=0) 
(actual time=365.386..365.386 rows=820800 loops=1)"
"        Index Cond: (date_part('day'::text, 
(transactiondate)::timestamp without time zone) = '8'::double precision)"
"Planning time: 0.297 ms"
"Execution time: 3608.713 ms"
*/</pre> </p>
<p><strong>Check created new Expression Index usage by above query<br />
(Result is one index scan):</strong></p>
<pre class="crayon-plain-tag">SELECT *
FROM pg_stat_user_indexes
WHERE indexrelname='idx_tbl_itemtransactions_transactiondate_day';</pre> </p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
