как бороться и стоит ли бороться с корреляцией столбцов?

Begin ner
Дата: 21.09.2015 15:25:20
версия оракла: 11.2. далее в примере кардинальность запроса = 1000 вместо 10 на 10000 строк в таблице.
create table tt as 
select level n1, level + 1 n2, level + 2  n3 
from dual connect by level <= 10000;
/
begin
dbms_stats.gather_table_stats(ownname => user, tabname => 'TT', method_opt => 'FOR ALL COLUMNS SIZE 1', estimate_percent => 100);
end;
/
explain plan for select * from TT where (N1 between 1 and 1000) AND (N2 BETWEEN 2 AND 1001) AND (N3 BETWEEN 3 AND 1002);
SELECT * FROM table(DBMS_XPLAN.DISPLAY(null,null,'ALL'));
/

+
DROP TABLE TT succeeded.
create table succeeded.
anonymous block completed
explain plan succeeded.
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 264906180

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 120 | 8 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TT | 10 | 120 | 8 (0)| 00:00:01 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

1 - SEL$1 / TT@SEL$1

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

1 - filter("N1"<=1000 AND "N2"<=1001 AND "N3"<=1002 AND "N1">=1 AND
"N2">=2 AND "N3">=3)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

1 - "N1"[NUMBER,22], "N2"[NUMBER,22], "N3"[NUMBER,22]

24 rows selected
Begin ner
Дата: 21.09.2015 15:30:56
поправлюсь: кардинальность запроса = 10 вместо 1000 на 10000 строк в таблице
AlexFF__|
Дата: 21.09.2015 15:56:16
Begin ner,

Ты уже всех достал, зачем тебя волнуют вопросы производительности, если ты не хочешь ни думать ни ЧИТАТЬ документацию.
Вот тебе пример, пока не поймешь, почему так получается - не приходи
select /*+ dynamic_sampling(t 4) */ * from TT t where (N1 between 1 and 1000) AND (N2 BETWEEN 2 AND 1001) AND (N3 BETWEEN 3 AND 1002);
pihel
Дата: 21.09.2015 16:12:42
Begin ner,

еще вариант побить запрос на части, чтобы селективности не перемножались:
select * from TT where (N1 between 1 and 1000) intersect
select * from TT where (N2 BETWEEN 2 AND 1001) intersect 
select * from TT where (N3 BETWEEN 3 AND 1002);
dbms_photoshop
Дата: 21.09.2015 16:25:57
Begin ner,

Погугли "dbms_stats.create_extended_stats correlation".
AlexFF__|
Ты уже всех достал, зачем тебя волнуют вопросы производительности, если ты не хочешь ни думать ни ЧИТАТЬ документацию.
Это да, ТС, почему бы тебе не направить свой слабоумный энтузиазм в другое русло?
dbms_photoshop
Дата: 21.09.2015 16:28:25
pihel
побить запрос на части
Побей себе с следующий раз по голове, когда захочется делать три full scan вместо 1.
pihel
Дата: 21.09.2015 16:33:35
dbms_photoshop,

Хорошо, я понимаю всю абсурдность варианта, предложил его только как способ получить нужную кардинальность.
Begin ner
Дата: 21.09.2015 16:54:57
а почему происходит такая ошибка на коррелированных столбцах? почему оптимизатору не все равно, что столбцы коррелированы? кто-то сможет объяснить?
Begin ner
Дата: 21.09.2015 16:58:22
dbms_photoshop
почему бы тебе не направить свой слабоумный энтузиазм в другое русло?

скажи спасибо, что я со своим слабоумным энтузиазмом работаю программистом, а не хирургом или полицейским. так что нужно таким, как я, помогать изо всех сил! можно даже платить просто за то, что я не хирург =)
pihel
Дата: 21.09.2015 17:00:21
Begin ner,

такая формула расчета кадинальности при условии фильтрации AND = 1 / ( селективность 1 условия * селективность 2 условия * селективность 3 условия).

Она хорошо работает, если данные в условиях взаимно уникальны.