Posted by: siamnobita | 02/25/2015

Index and not equal

เพิ่งพบว่า trick ที่เคยใช้ได้ เหมือนจะใช้ไม่ได้แล้วใน 12c

เดิมหากเราต้องการใช้ index สำหรับเงื่อนไข col ไม่เท่ากับ ‘x’ เพราะเราคิดว่าข้อมูลส่วนใหญ่คือข้อมูลที่เท่ากับ ‘x’ เราสามารถใช้ trick โดยเขียนเงื่อนไขใหม่เป็น col น้อยกว่า ‘x’ หรือ col มากกว่า’x’ แต่วันนี้ optimizer เธอเปลี่ยนไป!

SQL> set autotrace traceonly
SQL> select * from bowie where text < 'BOWIE' or text > 'BOWIE';

1000001 rows selected.

Execution Plan
———————————————————-
Plan hash value: 1845943507

—————————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————
| 0 | SELECT STATEMENT | | 1000K| 10M| 636 (2)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| BOWIE | 1000K| 10M| 636 (2)| 00:00:01 |
—————————————————————————

Predicate Information (identified by operation id):
—————————————————

1 – filter(“TEXT”<>’BOWIE’)

Optimizer ฉลาดเกินไปแล้ว ไม่ยอมให้หลอกอีกต่อไป ทำอย่างไรดี เหมือนไม่สามารถปิดได้ด้วย บังคับใช้ /*+ use_concat */ ก็ไม่ได้ ปิด transformation ด้วย /*+ no_query_transformation */ ก็ไม่ได้
ผมพยายามลองอยู่หลายแบบพบว่า ต้องเขียนแบบนี้

SQL> select * from bowie where text < 'bowie' 2 union all 3 select * from bowie where text > 'bowie' ;

Execution Plan
———————————————————-
Plan hash value: 2927488297

————————————————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————————————
| 0 | SELECT STATEMENT | | 2 | 22 | 8(50) | 00:00:01 |
| 1 | UNION-ALL | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 1 | 11 | 4 (0) | 00:00:01 |
|* 3 | INDEX RANGE SCAN | BOWIE_I | 1 | | 3 (0) | 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 1 | 11 | 4 (0) | 00:00:01 |
|* 5 | INDEX RANGE SCAN | BOWIE_I | 1 | | 3 (0) | 00:00:01 |
————————————————————————————————

Predicate Information (identified by operation id):
—————————————————

3 – access(“TEXT”<‘bowie’) 5 – access(“TEXT”>’bowie’)

ไม่รู้ครั้งต่อไปจะมีอะไรให้ surprised อีก


ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

หมวดหมู่

%d bloggers like this: