Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как можно определить какие нужны индексы для SQL запроса / 25 сообщений из 25, страница 1 из 1
25.04.2010, 12:30
    #36596773
Victor_V_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Подскажите пожалуста, существует ли какой нибудь способ узнать какие индексы наиболее оптимальным образом требуются для опредеенного SQL запроса. Попробывал в SQl менеджере план запроса, но ничего там по этому вопросу не нашел. Вопрос возник из за того что запрос выполняется несколько медленновато. Естественно хочется побыстрее если это возможно путем создания дополнителных индексов.
...
Рейтинг: 0 / 0
25.04.2010, 13:19
    #36596809
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_S , для начала можно и сам запрос показать... И на конкретном примере начать разбираться.
...
Рейтинг: 0 / 0
25.04.2010, 16:46
    #36597010
Victor_V_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Имеется такая схема

1 Таблица - MOP.RUS
id code name
-- ----- -----
2 Таблица - MOP.Oper
id code nameA type
-- ----- ------ -----
3 Таблица - MOP.Stan
id code name id_RUS id_Oper
-- ----- ----- ------ --------
4 Таблица - MOP.Trafic
id id_Stan id_Stan_1 idStan_2 dur dateT
-- -------- ---------- -------- --- -----

И вот сам запрос

SELECT Trafic.dateT, RUS.name, Oper.nameA, SUM(Trafic.dur), Oper.type, Stan_2.code, Oper.%ID
FROM MOP.Oper Oper, MOP.Oper Oper_1, MOP.Oper Oper_2, MOP.RUS RUS, MOP.RUS RUS_1, MOP.RUS RUS_2, MOP.Stan Stan, MOP.Stan Stan_1, MOP.Stan Stan_2, MOP.Trafic Trafic
WHERE Trafic.inpStan = Stan.ID AND Trafic.outStan = Stan_1.ID AND Stan.oper = Oper.ID AND Stan_1.oper = Oper_1.ID AND Stan.rus = RUS.ID AND Stan_1.rus = RUS_1.ID AND Trafic.midStan = Stan_2.ID AND Stan_2.rus = RUS_2.ID AND Stan_2.oper = Oper_2.ID
GROUP BY Oper.ID, Trafic.dateT
HAVING Trafic.dateT<=:endDate AND Trafic.dateT>=:begDate
ORDER BY Oper.nameA, Trafic.dateT
...
Рейтинг: 0 / 0
25.04.2010, 17:30
    #36597040
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_S , хорошо бы к таблицам и полям таблиц коментарий написать что там хранится.

Потом еще и на словах описать что нужно получить запросом.
...
Рейтинг: 0 / 0
25.04.2010, 17:43
    #36597050
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
а запрос по-моему просто ужасен
и нужно смотреть все таки, что покажет план запроса, он хоть немного но помогает
...
Рейтинг: 0 / 0
25.04.2010, 19:28
    #36597171
Victor_V_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Ладно упрстим схему

Имеется такая схема

1 Таблица - MOP.RUS
id code name
-- ----- -----
2 Таблица - MOP.Oper
id code nameA type
-- ----- ------ -----
3 Таблица - MOP.Stan
id code name id_RUS id_Oper
-- ----- ----- ------ --------
4 Таблица - MOP.Trafic
id id_Stan dur dateT

Суть схемы достаточно проста
Таблицв Stan ссылаеттся на таблицу Oper и RUS
Таблица Trafic ссылается га таблицу Stan

Запрс тогда будет проще

SELECT Trafic.dateT, RUS.name, Oper.nameA, SUM(Trafic.dur), Oper.type,, Oper.ID
FROM MOP.Oper Oper, MOP.RUS RUS, MOP.Stan Stan, MOP.Trafic Trafic
WHERE Trafic.Stan = Stan.ID AND Stan.oper = Oper.ID AND Stan.rus = RUS.ID
GROUP BY Oper.ID, Trafic.dateT
HAVING Trafic.dateT<=:endDate AND Trafic.dateT>=:begDate
ORDER BY Oper.nameA, Trafic.dateT

Совершенно очевидно что нужны индексы по тем полям которые ссылвются на другие таблицы
и индексы по которым идет ORDER BY. Такие индексы есть. Мне хотелось бы понять принцип, как можно определить оптимальные индексы.
...
Рейтинг: 0 / 0
25.04.2010, 19:39
    #36597185
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
DAiMorа запрос по-моему просто ужасен
Вот и я про то же...
...
Рейтинг: 0 / 0
25.04.2010, 19:40
    #36597189
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_SСовершенно очевидно что ...
Таки хотелось бы получить описание таблиц по русски и текстовую постановку запроса.
...
Рейтинг: 0 / 0
25.04.2010, 19:43
    #36597192
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_SМне хотелось бы понять принцип, как можно определить оптимальные индексы.
Это такие, которые изначально определяют количество строк итоговой таблички + те индексы, что упростят потом расчет (если требуется) колонок.
...
Рейтинг: 0 / 0
25.04.2010, 20:06
    #36597213
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
по запросу, мое субъективное мнение такое
лучше воспользоваться JOIN'ами, запрос читать будет легче, и по-моему выполнятся быстрее (ну и я так сам привык делать)

HAVING Trafic.dateT<=:endDate AND Trafic.dateT>=:begDate
заменить на between
и не думаю что обязательно его в having вставлять, думаю хватит если он будет в where


но в любом случае лучше сначала посмотреть план запроса, он все таки помогает
по плану запроса можно посмотреть в какой очередности он обходит данные, и можно там увидеть узкие места

к примеру он пишет, что иду по такому то индексу с такими то условиями, потому иду по другому индексу, собираю данные и все это во временную таблицу чтобы потом пойти по другому индексу

на основе этого понимаешь, что нужен индекс по полям, по которым идет условие where, а в Data индекса нужно вставить набор полей которые нужны запросу, таким образом не придется проходить дважды по разным индексам, сначала для поиска а потом для сбора данных, тем более когда эти данные нужны для подзапросов, такой подход может значительно ускорить запросы

но есть конечно и минусы, под каждый sql запрос не подстроиться, может получится так что для другого запроса этот индекс будет только мешать (бывало и такое), а Cache не может из множества разных индексов выбрать максимально подходящий, и выбирает не оптимальный.
...
Рейтинг: 0 / 0
26.04.2010, 03:06
    #36597595
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_SЛадно упрстим схему

Имеется такая схема

1 Таблица - MOP.RUS
id code name
-- ----- -----
2 Таблица - MOP.Oper
id code nameA type
-- ----- ------ -----
3 Таблица - MOP.Stan
id code name id_RUS id_Oper
-- ----- ----- ------ --------
4 Таблица - MOP.Trafic
id id_Stan dur dateT

Суть схемы достаточно проста
Таблицв Stan ссылаеттся на таблицу Oper и RUS
Таблица Trafic ссылается га таблицу Stan

Запрс тогда будет проще

SELECT Trafic.dateT, RUS.name, Oper.nameA, SUM(Trafic.dur), Oper.type,, Oper.ID
FROM MOP.Oper Oper, MOP.RUS RUS, MOP.Stan Stan, MOP.Trafic Trafic
WHERE Trafic.Stan = Stan.ID AND Stan.oper = Oper.ID AND Stan.rus = RUS.ID
GROUP BY Oper.ID, Trafic.dateT
HAVING Trafic.dateT<=:endDate AND Trafic.dateT>=:begDate
ORDER BY Oper.nameA, Trafic.dateT

Совершенно очевидно что нужны индексы по тем полям которые ссылвются на другие таблицы
и индексы по которым идет ORDER BY. Такие индексы есть. Мне хотелось бы понять принцип, как можно определить оптимальные индексы.

Мож я чего не понимаю, но если таблички - скл-проекция объектов, то выбирать нужно из одной всего таблицы:

Код: plaintext
1.
2.
3.
4.
select datet, id_stan->id_rus->name, ...
from mop.trafic
where datet between :begDate and :endDate
group by id_stan->oper, datet
order by id_stan->oper->namea, datet

и индекс тут нужен по datet + на все объектные свойства
а дальше смотреть на план запроса и на селективности.
...
Рейтинг: 0 / 0
26.04.2010, 03:13
    #36597598
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Заодно сразу видно все неприятности этого запроса ;)
...
Рейтинг: 0 / 0
26.04.2010, 08:33
    #36597644
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
kolesovвыбирать нужно из одной всего таблицы
Вот и запрос упростился...
...
Рейтинг: 0 / 0
26.04.2010, 10:05
    #36597753
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_S , интересно... При тех же индексах запрос

kolesov
Код: plaintext
1.
2.
3.
4.
select datet, id_stan->id_rus->name, ...
from mop.trafic
where datet between :begDate and :endDate
group by id_stan->oper, datet
order by id_stan->oper->namea, datet


Работает быстрее твоего начального

Код: plaintext
1.
2.
3.
4.
5.
SELECT Trafic.dateT, RUS.name, Oper.nameA, SUM(Trafic.dur), Oper.type, Stan_2.code, Oper.%ID
FROM MOP.Oper Oper, MOP.Oper Oper_1, MOP.Oper Oper_2, MOP.RUS RUS, MOP.RUS RUS_1, MOP.RUS RUS_2, MOP.Stan Stan, MOP.Stan Stan_1, MOP.Stan Stan_2, MOP.Trafic Trafic
WHERE Trafic.inpStan = Stan.ID AND Trafic.outStan = Stan_1.ID AND Stan.oper = Oper.ID AND Stan_1.oper = Oper_1.ID AND Stan.rus = RUS.ID AND Stan_1.rus = RUS_1.ID AND Trafic.midStan = Stan_2.ID AND Stan_2.rus = RUS_2.ID AND Stan_2.oper = Oper_2.ID
GROUP BY Oper.ID, Trafic.dateT
HAVING Trafic.dateT<=:endDate AND Trafic.dateT>=:begDate
ORDER BY Oper.nameA, Trafic.dateT

?
...
Рейтинг: 0 / 0
26.04.2010, 11:26
    #36597933
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
ИМХО, having и where не взаимозаменяемы, т.к. первый есть критерий группировки, а второй - выборки.
...
Рейтинг: 0 / 0
26.04.2010, 11:32
    #36597951
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Alexey MaslovИМХО, having и where не взаимозаменяемы, т.к. первый есть критерий группировки, а второй - выборки.
Это если его применять скажем к сумме внутри группы... Или мин/максу... Т.е. к чему-то "групповому".
У автора же простой диапазон дат. Т.о. хевинг вроде как и не требуется...
...
Рейтинг: 0 / 0
26.04.2010, 13:56
    #36598390
Victor_V_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
kolesov
select datet, id_stan->id_rus->name, ...
from mop.trafic
where datet between :begDate and :endDate
group by id_stan->oper, datet
order by id_stan->oper->namea, datet

Вот за это спасибо . Не знал что в каше есть такая возможность

Возможно плап запроса мне не помог потомучто я его вызывал на пустой базе. На рабочей базе у нас отключен CSP.
...
Рейтинг: 0 / 0
26.04.2010, 14:19
    #36598444
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_SНе знал что в каше есть такая возможность
Так ускорился от этого запрос или нет?
...
Рейтинг: 0 / 0
26.04.2010, 15:11
    #36598614
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_S,

Полезные ссылки:
Choosing an Index Type

SQL Optimizing Performance

SQL Special Features

krvsaТак ускорился от этого запрос или нет?
Не думаю.
Это всего лишь удобный синтаксис. Цитата из документации:
Код: plaintext
This arrow syntax can be used instead of explicit join syntax, or in combination with explicit join syntax.
...
Рейтинг: 0 / 0
26.04.2010, 16:30
    #36598851
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
servit , просто автор так намудрил со своим изначальным запросом... Т.ч. хртелось бы узнать по времени исполнения "до" и "после".
...
Рейтинг: 0 / 0
27.04.2010, 10:57
    #36600097
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
krvsaAlexey MaslovИМХО, having и where не взаимозаменяемы, т.к. первый есть критерий группировки, а второй - выборки.
Это если его применять скажем к сумме внутри группы... Или мин/максу... Т.е. к чему-то "групповому".
У автора же простой диапазон дат. Т.о. хевинг вроде как и не требуется...

Почему же. Если цель, например, погонять Каше на производительность и заставить вначале выполнить все группировки, а потом применить к ним having, то вполне сгодится и такой "подход"... шутка ;)

м.б. из-за этого having и проблема. по идее движок выберет все записи, подходящие по where, группируя их по всем датам, а потом уже выполнит having... Или не так?

Проверяем:
Код: plaintext
1.
2.
3.
select SUM(ID) from table
where ***= 11373 
group by ***
Быстродействие: 0.000 Секунд 100 глобальных ссылок
Код: plaintext
1.
2.
3.
select SUM(ID) from table
group by ***
having ***= 11373 
Быстродействие: 1.801 Секунд 1409411 глобальных ссылок
Код: plaintext
1.
2.
select SUM(ID) from table
group by ***
Быстродействие: 1.728 Секунд 1322657 глобальных ссылок

Делаем выводы ;)
...
Рейтинг: 0 / 0
27.04.2010, 11:41
    #36600232
Victor_V_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Значит выводы следующие:

1. Запрос стал выглядеть более внятно (сдесь приведен запрос для рабочей схемы)

SELECT dateT, inpStan->RUS->name, inpStan->Oper->nameA, SUM(dur), inpStan->oper->type, midStan->code, inpStan->oper, type
FROM MOP.Trafic
GROUP BY inpStan->oper,type , dateT
HAVING dateT<=:endDate AND dateT>=:begDate
ORDER BY inpStan->oper->nameA,type , dateT

2 Скорость увеличилась но незначительно хотя вполне приемлемо для 300000 записей примерно 30-60 сек. на рабочем сервере под реальной нагрузкой

3. По поводу оператора Having учитывая критику пока не решил что делать

Спасибо всем учавствовавшем
...
Рейтинг: 0 / 0
27.04.2010, 14:27
    #36600721
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_S3. По поводу оператора Having учитывая критику пока не решил что делать

чо тут делать!? убирать его нахрен нужно! и переносить условие в вэа с битвин!!!
...
Рейтинг: 0 / 0
27.04.2010, 21:01
    #36601660
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
kolesovубирать его нахрен нужно!
Поддерживаю.
...
Рейтинг: 0 / 0
28.04.2010, 12:02
    #36602567
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно определить какие нужны индексы для SQL запроса
Victor_V_S, "Не решил что делать"... Вам же показали результаты теста!?!
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как можно определить какие нужны индексы для SQL запроса / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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