Temporary tablespaces in RAC ? Oracle databas...
Temporary tablespaces are shared objects and they are associated to an user or whole database (using default temporarytablespace). So, in RAC, temporary tablespaces are shared between the instances. Many temporary tablespaces can be created in a database, but all of those temporary tablespaces are shared between the instances. Hence, temporarytablespaces must be allocated in shared storage or ASM. We will explore the space allocation in temporary tablespace inRAC, in this blog entry.
In contrast, UNDO tablespaces are owned by an instance and all transactions from that instance is exclusively allocated inthat UNDO tablespace. Remember that other instances can read blocks from remote undo tablespace, and so, undotablespaces also must be allocated from shared storage or ASM.
Space allocation in TEMP tablespace
TEMP tablespaces are divided in to extents (In 11.2, extent size is 1M, not sure whether the size of an extent is controllable or not). These extent maps are cached in local SGA, essentially, soft reserving those extents for the use of sessions connecting to that instance. But, note that, extents in a temporary tablespace are not cached at instance startup, instead instance caches the extents as the need arises. We will explore this with a small example:
This database has two instances and a TEMP tablespace. TEMP tablespace has two temp files, 300M each.
Listing 1-1: dba_temp_files 1* select file_name, bytes/1024/1024 sz_in_mb from dba_temp_files SYS@solrac1:1>/ FILE_NAME SZ_IN_MB ------------------------------------------------------------ ---------- +DATA/solrac/tempfile/temp.266.731449235 300 +DATA/solrac/tempfile/temp.448.775136163 300
Initially, no extents were cached, and no extents were in use as shown from the output of gv$temp_extent_pool view in Listing 1-2.
Listing 1-2: Initial view of temp extents select inst_id, file_id, extents_cached, extents_used from gv$temp_extent_pool order by 1,2; INST_ID FILE_ID EXTENTS_CACHED EXTENTS_USED ---------- ---------- -------------- ------------ 1 1 0 0 1 2 0 0 2 1 0 0 2 2 0 0
We are ready to start a test case
Listing 1-3: Script in execution select inst_id, file_id, extents_cached, extents_used from gv$temp_extent_pool order by 1,2; INST_ID FILE_ID EXTENTS_CACHED EXTENTS_USED ---------- ---------- -------------- ------------ 1 1 0 0 1 2 0 0 2 1 22 22 2 2 23 23 ... / INST_ID FILE_ID EXTENTS_CACHED EXTENTS_USED ---------- ---------- -------------- ------------ 1 1 0 0 1 2 0 0 2 1 108 108 2 2 111 111
I started a small SQL script that joins multiple tables with hash join so as to induce disk based sorting. After starting the SQL script execution in instance 2, you can see that extents are cached and used in the instance 2, as shown in Listing 1-3. Initially, 45 extents were in use, few seconds later, temp tablespace usage grew to 219 extents.
Listing 1-4: script completion INST_ID FILE_ID EXTENTS_CACHED EXTENTS_USED ---------- ---------- -------------- ------------ 1 1 0 0 1 2 0 0 2 1 163 0 2 2 166 0
After the completion of the script,as shown in Listing 1-4, extents_used column is set to 0, But extents_cached is still at maximum usage level (319 extents). Meaning that, extents are cached (soft reserved) in an instance and not released (until another instance asks for it, as we see later).
You should also note that extents are equally spread between two files in that temporary tablespace. If you have more files inthat temporary tablespace, then the extents will be uniformly allocated in all those temp files.
Space reallocation
Even if the cached extents are free, these extents are not available to use in other instance(s) immediately. An instance will request the owning instance to uncache the extents and then only those extents are available for use in the requesting instance. We will demonstrate this concept with the same test case, except that we will execute that test case in instance 1.
Listing 1-5: script in instance #1 execution INST_ID FILE_ID EXTENTS_CACHED EXTENTS_USED ---------- ---------- -------------- ------------ 1 1 42 42 1 2 42 42 2 1 163 0 2 2 166 0
At the start of SQL execution, instance started to reserve extents by caching them. My session was using those extents as visible from gv$temp_extent_pool. Number of extents used by the instance #1 was slowly growing.See Listing 1-5.
Listing 1-6: instance #1 stole the extents from instance #2 INST_ID FILE_ID EXTENTS_CACHED EXTENTS_USED ---------- ---------- -------------- ------------ 1 1 195 71 1 2 133 116 2 1 63 0 <-- note here 2 2 166 0
It gets interesting. Notice that 329 extents were reserved In Listing 1-5. Since my SQL script needs 329M of space in the temp tablespace, instance 1 needs to steal space from instance 2.
In Listing 1-6, Instance 1 needed more extents and so, Instance 2 uncached 100 extents as the extents_cached column went down from a value of 163 to 63 extents (third row in the output above). Essentially, in this example, instance 1 requested instance 2 to uncache the extents and instance 2 obliged and uncached 100 extents. Prior to 11g, un-caching of extents used to be at one extent per request. From 11g onwards, 100 extents are released for a single request and all 100 extents are acquired by the requesting instance. Instance 1 acquired those 100 extents, cached those extents, and then the session continued to use those temp extents.
Listing 1-7: script completion and node #1 has more extents cached. INST_ID FILE_ID EXTENTS_CACHED EXTENTS_USED ---------- ---------- -------------- ------------ 1 1 195 0 1 2 133 0 2 1 63 0 2 2 166 0
After the completion of the script execution, instance 1 did not release the extents. Cached extents are not released (extents are soft reserved )until another instance asks for those extents to be un-cached.
I also enabled sql trace in my session from instance 1 while executing the script. SQL trace file spills out the details about un-reserving of these extents.
Listing 1-8: SQL Trace ... #1: nam='enq: TS - contention' ela= 4172867 name|mode=1414725636 tablespace ID=3 dba=2 obj#=0 tim=6322835898 #2: nam='enq: SS - contention' ela= 608 name|mode=1397948417 tablespace #=3 dba=2 obj#=0 tim=6322837101 #3: nam='enq: SS - contention' ela= 414 name|mode=1397948422 tablespace #=3 dba=2 obj#=0 tim=6322837710 #4: nam='DFS lock handle' ela= 389 type|mode=1128857605 id1=14 id2=1 obj#=0 tim=6322838264 #5: nam='DFS lock handle' ela= 395 type|mode=1128857605 id1=14 id2=3 obj#=0 tim=6322838788 #6: nam='DFS lock handle' ela= 260414 type|mode=1128857605 id1=14 id2=2 obj#=0 tim=6323099335 ...
Line #1 above shows a tablespace level lock (TS enqueue) is taken on TEMP tablespace (ID=3 is ts# column in sys.ts$ table). Then SS locks were acquired on that tablespace, first with mode=1 and then with mode=6 (line #2 and #3). In Line #4,Cross Invocation Call (CIC) was used to ask remote SMON process to un-reserve the cached extents using CI type locks and mechanism with lock types CI-14-1, CI-14-2, and CI-14-3.
Listing 1-9: Enqueue type select chr(bitand(&&p1,-16777216)/16777215) || chr(bitand(&&p1,16711680)/65535) type, mod(&&p1, 16) md from dual; Enter value for p1: 1397948422 TY MD -- ---------- SS 6 Enter value for p1: 1128857605 TY MD -- ---------- CI 5
From Listing 1-8, Approximately, 4.5 seconds were spent to move the cached extents from the one instance to another instance. Prior to 11g, this test case will run much longer, since the extents were un-cached 1 extent per request. Hundreds of such request would trigger tsunami of SS, CI enqueue requests leading to massive application performance issues. In 11g,Oracle Development resolved this issue by un-caching 100 extents per request.
Important points to note
- As you can see, extents are allocated from all temporary files uniformly. There are also changes to file header block during this operation. This is one of the reason, to create many temporary files in RAC. Recommendation is to create,as many files as the # of instances. If you have 24 nodes in your RAC cluster, yes, that would imply that you would have to create 24 temp files to the TEMP tablespace.
- As we saw in our test case locking contention output, having more temp tablespace might help alleviate SS enqueue contention since SS locks are at tablespace level. Essentially, more temporary tablespace means more SS enqueues,But, you will move the contention from SS locks to ‘DFS lock handle’ waits as Cross invocation Call is one per the instance for extents un-caching operation.
- Temporary tablespace groups is of no use since the contention will be at Cross Invocation Call. In fact, there is a potential for temporary tablespace groups to cause more issues since the free space in one temp tablespace can not be reassigned to another temp tablespace dynamically, even if they are in the same tablespace group. In theory, it is possible to have more SS, CI locking contention with temp tablespace groups.
- Probably a good approach is to assign different temporary tablespace to OLTP users and DSS users and affinitize the workload to specific instances.
Update 1: Remember that you need to understand your application workload before following my advice
11 Responses to “Temporary tablespaces in RAC”
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20747382/viewspace-2135660/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Encrypted TablespacesOracle
- Oracle Transporting TablespacesOracle
- oracle bigfile tablespacesOracle
- oracle temporary tableOracle
- [Oracle Script] Temporary Sort UsageOracle
- Oracle Temporary Tables(Oracle 臨時表)Oracle
- ORACLE撤銷表空間(Undo Tablespaces)Oracle
- Oracle臨時表GLOBAL TEMPORARY TABLEOracle
- oracle的兩種global temporary table!Oracle
- Transportable Tablespaces (TTS) for Oracle Database [ID 1461278.2]TTSOracleDatabase
- Oracle 12C RMAN Duplicating Tablespaces Within a PDBOracle
- Allocation of Temporary Segments for Temporary Tables and Indexes (28)Index
- Overview of Tablespaces (38)View
- oracle的臨時表空間temporary tablespaceOracle
- Oracle 12c RMAN Duplicating a Subset of the Source Database TablespacesOracleDatabase
- Oracle佇列鎖enq:TS,Temporary Segment (also TableSpace)Oracle佇列ENQ
- 【TEMPORARY TABLE】Oracle臨時表使用注意事項Oracle
- oracle RACOracle
- How to Move Tablespaces Across Platforms Using Transportable Tablespaces With RMAN [ID 371556.1]ROSPlatform
- Oracle RAC Cache Fusion 系列十七:Oracle RAC DRMOracle
- Using Multiple Tablespaces (46)
- Transport of Tablespaces Between Databases (59)Database
- Oracle10g New Feature -- 5.Temporary Tablespace GroupOracle
- Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part TwoOracleServer
- ORACLE RAC clusterwareOracle
- oracle rac oemOracle
- oracle rac + dataguardOracle
- Oracle 11.2 DataGuard RAC To RAC搭建Oracle
- 2.5 Overview of Tablespaces and Database Files in a CDBViewDatabase
- 20160822Oracle 11g Temporary TablespaceOracle
- oracle 12c 新特性 Temporary UNDO 臨時回滾段Oracle
- oracle10g_impdp工具測試學習_之二_transport_tablespacesOracle
- Oracle RAC Cache Fusion系列十八:Oracle RAC Statisticsand Wait EventsOracleAI
- Oracle RAC Cache Fusion 系列十四:Oracle RAC CR Server Part OneOracleServer
- Oracle RAC Cache Fusion 系列十:Oracle RAC Enqueues And Lock Part 1OracleENQ
- 【RAC】Oracle RAC如何修改心跳網路Oracle
- oracle rac 增加磁碟Oracle
- oracle RAC RDS on AIXOracleAI