性能陷阱:Oracle表连接中范围比较
Lately, I met a case that the range filter predicates due to wrong cardinality issue. Letrsquo;s check the followin
Lately, I met a case that the range filter predicates due to wrong cardinality issue. Let’s check the following query.
最近遇到一个由于范围过滤导致错误基数而引起的性能问题。让我们来看下面的查询:
The real records number is around 38,000,000.
真实的记录数大约3千8百万
The explain plan shows 72838, optimizer think it has good filtration. So put this JOIN in the first order. Actually , it is totally wrong.
执行计划显示72838,这里优化器认为它有良好的过滤芯,所以把它放在一个多个表JOIN的第一位置。显然,,它完全错了。
SQL> set autotrace traceonly explain;
SQL> set linesize 999
SQL> SELECT
2 T.DURATIONSECSQTY TIMEINSECONDS,
T.MONEYAMT MONEYAMOUNT,
T.WAGEAMT WAGEAMOUNT,
T.APPLYDTM APPLYDATE,
T.ADJAPPLYDTM ADJUSTEDAPPLYDATE,
T.STARTDTM,
T.ENDDTM,
T.HOMEACCOUNTSW
FROM
TKCSOWNER.WFCTOTAL T,
TKCSOWNER.PAYCODE1MMFLAT MP
WHERE
MP.EFFECTIVEDTM
AND MP.EXPIRATIONDTM > T.APPLYDTM
AND MP.PAYCODEID = T.PAYCODEID
/
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 72838 | 5192K| 37450 |
|* 1 | HASH JOIN | | 72838 | 5192K| 37450 |
| 2 | TABLE ACCESS FULL| PAYCODE1MMFLAT | 323 | 6783 | 3 |
| 3 | TABLE ACCESS FULL| WFCTOTAL | 8938K| 443M| 37317 |
Now, let me comment the range filter.
让我注释到范围条件看:
“MP.EFFECTIVEDTM
AND MP.EXPIRATIONDTM > T.APPLYDTM”
SQL> SELECT
2 T.DURATIONSECSQTY TIMEINSECONDS,
T.MONEYAMT MONEYAMOUNT,
T.WAGEAMT WAGEAMOUNT,
T.APPLYDTM APPLYDATE,
T.ADJAPPLYDTM ADJUSTEDAPPLYDATE,
T.STARTDTM,
T.ENDDTM,
T.HOMEACCOUNTSW
FROM
TKCSOWNER.WFCTOTAL T,
TKCSOWNER.PAYCODE1MMFLAT MP
WHERE
/* MP.EFFECTIVEDTM
AND MP.EXPIRATIONDTM > T.APPLYDTM*/
MP.PAYCODEID = T.PAYCODEID 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 /
Execution Plan
----------------------------------------------------------
Plan hash value: 564403449
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 29M| 1583M| 37405 |
|* 1 | HASH JOIN | | 29M| 1583M| 37405 |
| 2 | INDEX FAST FULL SCAN| PK_PAYCODE1MMFLAT | 323 | 1615 | 1 |
| 3 | TABLE ACCESS FULL | WFCTOTAL | 8938K| 443M| 37317 |
The Cardinality show 29,135,142 , it is already close to the correct value.
基础是29,135,142,已经接近正确结果了。
So how optimizer work out the cardinality with range filter in TABLE JOIN ?
那么优化器怎么出来表连接中的范围扫描呢?
The answer is 5%, always 5%.
答案是5%
29135142 * 5% * 5% = 72837.8 , This is exact equal to the result of test 1.
So if you meet any performance issue with range filter in TBALE JOIN, I am not surprise. I think Oracle need to improve the CBO to get better support on such situation.

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











MySQL is an open source relational database management system, mainly used to store and retrieve data quickly and reliably. Its working principle includes client requests, query resolution, execution of queries and return results. Examples of usage include creating tables, inserting and querying data, and advanced features such as JOIN operations. Common errors involve SQL syntax, data types, and permissions, and optimization suggestions include the use of indexes, optimized queries, and partitioning of tables.

In Oracle, the FOR LOOP loop can create cursors dynamically. The steps are: 1. Define the cursor type; 2. Create the loop; 3. Create the cursor dynamically; 4. Execute the cursor; 5. Close the cursor. Example: A cursor can be created cycle-by-circuit to display the names and salaries of the top 10 employees.

MySQL is chosen for its performance, reliability, ease of use, and community support. 1.MySQL provides efficient data storage and retrieval functions, supporting multiple data types and advanced query operations. 2. Adopt client-server architecture and multiple storage engines to support transaction and query optimization. 3. Easy to use, supports a variety of operating systems and programming languages. 4. Have strong community support and provide rich resources and solutions.

Oracle views can be exported through the EXP utility: Log in to the Oracle database. Start the EXP utility, specifying the view name and export directory. Enter export parameters, including target mode, file format, and tablespace. Start exporting. Verify the export using the impdp utility.

When Oracle log files are full, the following solutions can be adopted: 1) Clean old log files; 2) Increase the log file size; 3) Increase the log file group; 4) Set up automatic log management; 5) Reinitialize the database. Before implementing any solution, it is recommended to back up the database to prevent data loss.

MySQL is suitable for web applications and content management systems and is popular for its open source, high performance and ease of use. 1) Compared with PostgreSQL, MySQL performs better in simple queries and high concurrent read operations. 2) Compared with Oracle, MySQL is more popular among small and medium-sized enterprises because of its open source and low cost. 3) Compared with Microsoft SQL Server, MySQL is more suitable for cross-platform applications. 4) Unlike MongoDB, MySQL is more suitable for structured data and transaction processing.

Building a Hadoop Distributed File System (HDFS) on a CentOS system requires multiple steps. This article provides a brief configuration guide. 1. Prepare to install JDK in the early stage: Install JavaDevelopmentKit (JDK) on all nodes, and the version must be compatible with Hadoop. The installation package can be downloaded from the Oracle official website. Environment variable configuration: Edit /etc/profile file, set Java and Hadoop environment variables, so that the system can find the installation path of JDK and Hadoop. 2. Security configuration: SSH password-free login to generate SSH key: Use the ssh-keygen command on each node

Oracle is not only a database company, but also a leader in cloud computing and ERP systems. 1. Oracle provides comprehensive solutions from database to cloud services and ERP systems. 2. OracleCloud challenges AWS and Azure, providing IaaS, PaaS and SaaS services. 3. Oracle's ERP systems such as E-BusinessSuite and FusionApplications help enterprises optimize operations.
