Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация. Начало:) / 19 сообщений из 19, страница 1 из 1
09.01.2003, 11:35
    #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
09.01.2003, 12:05
    #32088016
Oleg Afanasiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация. Начало:)
>Чем можно анализировать запросы?
Обычно для этого используют ExplainPlan

Хотя неплохо было бы перед _началом_ оптимизации почитать про
подсказки оптимизатору..... хотя бы...
для _начала_ ;-P
...
Рейтинг: 0 / 0
09.01.2003, 12:10
    #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
09.01.2003, 12:16
    #32088028
Allexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация. Начало:)
а скорость от 1 к 4 наоборот уменьшается...
...
Рейтинг: 0 / 0
09.01.2003, 12:22
    #32088034
Mergen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация. Начало:)
>>а скорость от 1 к 4 наоборот уменьшается...
А сколько в таблице записей?
Ты наверное эксперементируеш с почти пустой таблицей?
...
Рейтинг: 0 / 0
09.01.2003, 12:32
    #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
09.01.2003, 12:35
    #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
09.01.2003, 12:39
    #32088060
Mergen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация. Начало:)
Вобщем я проверил:
Внес данные в таблицы
в клиентов 10000 строк
в прихо 2000.
Первые запросы отработали мгновенно
timing показал следующее

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

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

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

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

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

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

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

5000р - 66%
7000р - 37%

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

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

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


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