powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как можно определить какие нужны индексы для SQL запроса
25 сообщений из 25, страница 1 из 1
Как можно определить какие нужны индексы для SQL запроса
    #36596773
Victor_V_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуста, существует ли какой нибудь способ узнать какие индексы наиболее оптимальным образом требуются для опредеенного SQL запроса. Попробывал в SQl менеджере план запроса, но ничего там по этому вопросу не нашел. Вопрос возник из за того что запрос выполняется несколько медленновато. Естественно хочется побыстрее если это возможно путем создания дополнителных индексов.
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36596809
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor_V_S , для начала можно и сам запрос показать... И на конкретном примере начать разбираться.
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597010
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 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
Как можно определить какие нужны индексы для SQL запроса
    #36597040
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor_V_S , хорошо бы к таблицам и полям таблиц коментарий написать что там хранится.

Потом еще и на словах описать что нужно получить запросом.
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597050
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а запрос по-моему просто ужасен
и нужно смотреть все таки, что покажет план запроса, он хоть немного но помогает
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597171
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. Такие индексы есть. Мне хотелось бы понять принцип, как можно определить оптимальные индексы.
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597185
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorа запрос по-моему просто ужасен
Вот и я про то же...
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597189
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor_V_SСовершенно очевидно что ...
Таки хотелось бы получить описание таблиц по русски и текстовую постановку запроса.
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597192
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor_V_SМне хотелось бы понять принцип, как можно определить оптимальные индексы.
Это такие, которые изначально определяют количество строк итоговой таблички + те индексы, что упростят потом расчет (если требуется) колонок.
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597213
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по запросу, мое субъективное мнение такое
лучше воспользоваться JOIN'ами, запрос читать будет легче, и по-моему выполнятся быстрее (ну и я так сам привык делать)

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


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

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

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

но есть конечно и минусы, под каждый sql запрос не подстроиться, может получится так что для другого запроса этот индекс будет только мешать (бывало и такое), а Cache не может из множества разных индексов выбрать максимально подходящий, и выбирает не оптимальный.
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597595
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как можно определить какие нужны индексы для SQL запроса
    #36597598
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заодно сразу видно все неприятности этого запроса ;)
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597644
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesovвыбирать нужно из одной всего таблицы
Вот и запрос упростился...
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597753
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как можно определить какие нужны индексы для SQL запроса
    #36597933
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, having и where не взаимозаменяемы, т.к. первый есть критерий группировки, а второй - выборки.
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36597951
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovИМХО, having и where не взаимозаменяемы, т.к. первый есть критерий группировки, а второй - выборки.
Это если его применять скажем к сумме внутри группы... Или мин/максу... Т.е. к чему-то "групповому".
У автора же простой диапазон дат. Т.о. хевинг вроде как и не требуется...
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36598390
Victor_V_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как можно определить какие нужны индексы для SQL запроса
    #36598444
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor_V_SНе знал что в каше есть такая возможность
Так ускорился от этого запрос или нет?
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36598614
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как можно определить какие нужны индексы для SQL запроса
    #36598851
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit , просто автор так намудрил со своим изначальным запросом... Т.ч. хртелось бы узнать по времени исполнения "до" и "после".
...
Рейтинг: 0 / 0
Как можно определить какие нужны индексы для SQL запроса
    #36600097
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как можно определить какие нужны индексы для SQL запроса
    #36600232
Victor_V_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит выводы следующие:

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
Как можно определить какие нужны индексы для SQL запроса
    #36600721
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor_V_S3. По поводу оператора Having учитывая критику пока не решил что делать

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


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