powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация. Начало:)
19 сообщений из 19, страница 1 из 1
Оптимизация. Начало:)
    #32087981
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблички - покупатели и приход/расход с кучей записей каждому покупателю. Необходимо выбрать всех покупателей, у которых общая сумма больше определённого числа. Т.к. что такое оптимизация не представляю вообще, то хотелось бы проконсультироваться, как лучше делать.
1.
select distinct a.name from customers a,prihod b
where a.id_cust=b.id_cust
group by a.name
having sum(sumn)>5000

2.
select a.name from customers a,(select id_cust from prihod b group by id_cust having sum(sumn)>5000) b
where a.id_cust=b.id_cust

3.
select a.name from customers a
where exists
(select * from
(select id_cust from prihod b group by id_cust having sum(sumn)>5000) b
where a.id_cust=b.id_cust
)

4.
select a.name from customers a
where exists
(
select id_cust from customers b where a.id_cust=b.id_cust group by id_cust having sum(sumn)>5000
)

С каждым разом всё шустрее и шустрее:) Мысли по этому поводу имеются, но хотелось бы услышать ответ профессионалов. Чем можно анализировать запросы?
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088016
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Чем можно анализировать запросы?
Обычно для этого используют ExplainPlan

Хотя неплохо было бы перед _началом_ оптимизации почитать про
подсказки оптимизатору..... хотя бы...
для _начала_ ;-P
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088019
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот посмотри что у меня получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
Variant  1 

SELECT DISTINCT a.name
FROM
  CUST a,
  PRIXOD b
WHERE
  a.id = b.cust_id
GROUP BY
  a.NAME
HAVING
  sum(b.msum) >  5000 

  0      SELECT STATEMENT Optimizer=CHOOSE
   1    0     FILTER
   2    1       SORT (GROUP BY) 
   3    2         NESTED LOOPS
   4    3           TABLE ACCESS (FULL) OF 'PRIXOD'
   5    3           TABLE ACCESS (BY INDEX ROWID) OF 'CUST'
   6    5             INDEX (UNIQUE SCAN) OF 'SYS_C002182' (UNIQUE)

Variant2

select a.name
from cust a,(select cust_id from prixod b group by cust_id having sum(msum)> 5000 ) b
where a.id=b.cust_id

  0      SELECT STATEMENT Optimizer=CHOOSE
   1    0     NESTED LOOPS
   2    1       VIEW
   3    2         FILTER
   4    3           SORT (GROUP BY) 
   5    4             TABLE ACCESS (FULL) OF 'PRIXOD'
   6    1       TABLE ACCESS (BY INDEX ROWID) OF 'CUST'
   7    6         INDEX (UNIQUE SCAN) OF 'SYS_C002182' (UNIQUE)

Variant  3 

select a.name from cust a
where exists
(select * from
(select cust_id from prixod b group by cust_id having sum(msum)> 5000 ) b
where a.id=b.cust_id
)

  0      SELECT STATEMENT Optimizer=CHOOSE
   1    0     FILTER
   2    1       TABLE ACCESS (FULL) OF 'CUST'
   3    1       VIEW
   4    3         FILTER
   5    4           SORT (GROUP BY) 
   6    5             TABLE ACCESS (FULL) OF 'PRIXOD'


Variant  4 

select a.name
from cust a
where exists
(
select cust_id from prixod b where a.id=b.cust_id group by cust_id having sum(msum)> 5000 
)


  0      SELECT STATEMENT Optimizer=CHOOSE
   1    0     FILTER
   2    1       TABLE ACCESS (FULL) OF 'CUST'
   3    1       FILTER
   4    3         SORT (GROUP BY) 
   5    4           TABLE ACCESS (FULL) OF 'PRIXOD'


Я выбрал первый вариант. 4-й и третий отпадают сразу, т.к. полностью сканируют таблицу клиентов.
>>Чем можно анализировать запросы?
Можно использовать SET AUTOTRACE ON в SQL*Plus
Или графическими инструментами
OraTools,Develope.
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088028
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а скорость от 1 к 4 наоборот уменьшается...
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088034
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>а скорость от 1 к 4 наоборот уменьшается...
А сколько в таблице записей?
Ты наверное эксперементируеш с почти пустой таблицей?
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088050
va_kochnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Чем можно анализировать запросы?

Секундомером.

Еще вариант
select a.name from customers a
where id_cust in
(
select id_cust from customers b group by id_cust having sum(sumn)>5000
)
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088055
va_kochnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон. Облажался.
Вот так
select a.name from customers a
where id_cust in
(select id_cust from prihod b group by id_cust having sum(sumn)>5000) b
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088060
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем я проверил:
Внес данные в таблицы
в клиентов 10000 строк
в прихо 2000.
Первые запросы отработали мгновенно
timing показал следующее

Вариант1
Выбрано 291 записть истенное время: 351

Вариант2
Выбрано 291 записть истенное время: 331

Вариант3
Выбрано 291 записть истенное время: 66366

Вариант3
Выбрано 291 записть истенное время: 66927

3 и 4 варианты зависали(круто).

Вот тебе ответ :)
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088085
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное я бредить начал.
10000/120000

1) 2.1
2) 1.8
3) 1.1
4) 0.6
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088112
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что все зависит от числа Т. Если большинство клиетов имеют сумму больше чем Т, то понятно что полное сканирование подойдет больше. Все зависит от процента выбора.
У меня ситуация всего 1000 клиентов , выбираются 300 -3%. Использование индекса приводет к повышению производительности.
Какой процент выборки у Вас?
поэксперементируйте с Т. Желаю удачи.
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088126
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
customers -10682
prihod - 118353

5000р - 66%
7000р - 37%

Со временем ситуация не меняется

С удивлением для себя обнаружил индекс по id_cust в приходе. Может это влияет?
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088170
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для просмотра по индексу твои проценты слишком велики!!!
Похорошему это должно быть до 6%, при дополнительных условиях до 15%.
Индекс понятно влияет, но в Вашем случае с высоким поцентом выборки он мешает!!!
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088181
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Откуда ж ноги растут...
Well, тогда как по explain plan оценивать трудоёмкость?
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088185
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
см. Performance Tuning Guide and Reference Oracle
Part II Глава 9 Using Explain Plan
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088223
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а ссылочку...
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088235
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотри сюда

...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088236
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извиняюсь
http://download-west.oracle.com/docs/cd/A97630_01/server.920/a96533/ex_plan.htm#19259
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088259
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
thanks. Я там зареганым даже оказался:)
...
Рейтинг: 0 / 0
Оптимизация. Начало:)
    #32088462
юный ораклист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
трассировку включи и посмотри,что делает
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация. Начало:)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]