Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуста, существует ли какой нибудь способ узнать какие индексы наиболее оптимальным образом требуются для опредеенного SQL запроса. Попробывал в SQl менеджере план запроса, но ничего там по этому вопросу не нашел. Вопрос возник из за того что запрос выполняется несколько медленновато. Естественно хочется побыстрее если это возможно путем создания дополнителных индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 12:30 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Victor_V_S , для начала можно и сам запрос показать... И на конкретном примере начать разбираться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 13:19 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Имеется такая схема 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 16:46 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Victor_V_S , хорошо бы к таблицам и полям таблиц коментарий написать что там хранится. Потом еще и на словах описать что нужно получить запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 17:30 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
а запрос по-моему просто ужасен и нужно смотреть все таки, что покажет план запроса, он хоть немного но помогает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 17:43 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Ладно упрстим схему Имеется такая схема 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. Такие индексы есть. Мне хотелось бы понять принцип, как можно определить оптимальные индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 19:28 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
DAiMorа запрос по-моему просто ужасен Вот и я про то же... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 19:39 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Victor_V_SСовершенно очевидно что ... Таки хотелось бы получить описание таблиц по русски и текстовую постановку запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 19:40 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Victor_V_SМне хотелось бы понять принцип, как можно определить оптимальные индексы. Это такие, которые изначально определяют количество строк итоговой таблички + те индексы, что упростят потом расчет (если требуется) колонок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 19:43 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
по запросу, мое субъективное мнение такое лучше воспользоваться JOIN'ами, запрос читать будет легче, и по-моему выполнятся быстрее (ну и я так сам привык делать) HAVING Trafic.dateT<=:endDate AND Trafic.dateT>=:begDate заменить на between и не думаю что обязательно его в having вставлять, думаю хватит если он будет в where но в любом случае лучше сначала посмотреть план запроса, он все таки помогает по плану запроса можно посмотреть в какой очередности он обходит данные, и можно там увидеть узкие места к примеру он пишет, что иду по такому то индексу с такими то условиями, потому иду по другому индексу, собираю данные и все это во временную таблицу чтобы потом пойти по другому индексу на основе этого понимаешь, что нужен индекс по полям, по которым идет условие where, а в Data индекса нужно вставить набор полей которые нужны запросу, таким образом не придется проходить дважды по разным индексам, сначала для поиска а потом для сбора данных, тем более когда эти данные нужны для подзапросов, такой подход может значительно ускорить запросы но есть конечно и минусы, под каждый sql запрос не подстроиться, может получится так что для другого запроса этот индекс будет только мешать (бывало и такое), а Cache не может из множества разных индексов выбрать максимально подходящий, и выбирает не оптимальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2010, 20:06 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
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. и индекс тут нужен по datet + на все объектные свойства а дальше смотреть на план запроса и на селективности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 03:06 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Заодно сразу видно все неприятности этого запроса ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 03:13 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
kolesovвыбирать нужно из одной всего таблицы Вот и запрос упростился... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 08:33 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Victor_V_S , интересно... При тех же индексах запрос kolesov Код: plaintext 1. 2. 3. 4. Работает быстрее твоего начального Код: plaintext 1. 2. 3. 4. 5. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 10:05 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
ИМХО, having и where не взаимозаменяемы, т.к. первый есть критерий группировки, а второй - выборки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 11:26 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Alexey MaslovИМХО, having и where не взаимозаменяемы, т.к. первый есть критерий группировки, а второй - выборки. Это если его применять скажем к сумме внутри группы... Или мин/максу... Т.е. к чему-то "групповому". У автора же простой диапазон дат. Т.о. хевинг вроде как и не требуется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 11:32 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 13:56 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Victor_V_SНе знал что в каше есть такая возможность Так ускорился от этого запрос или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 14:19 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Victor_V_S, Полезные ссылки: Choosing an Index Type SQL Optimizing Performance SQL Special Features krvsaТак ускорился от этого запрос или нет? Не думаю. Это всего лишь удобный синтаксис. Цитата из документации: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 15:11 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
servit , просто автор так намудрил со своим изначальным запросом... Т.ч. хртелось бы узнать по времени исполнения "до" и "после". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2010, 16:30 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
krvsaAlexey MaslovИМХО, having и where не взаимозаменяемы, т.к. первый есть критерий группировки, а второй - выборки. Это если его применять скажем к сумме внутри группы... Или мин/максу... Т.е. к чему-то "групповому". У автора же простой диапазон дат. Т.о. хевинг вроде как и не требуется... Почему же. Если цель, например, погонять Каше на производительность и заставить вначале выполнить все группировки, а потом применить к ним having, то вполне сгодится и такой "подход"... шутка ;) м.б. из-за этого having и проблема. по идее движок выберет все записи, подходящие по where, группируя их по всем датам, а потом уже выполнит having... Или не так? Проверяем: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. Код: plaintext 1. 2. Делаем выводы ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2010, 10:57 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Значит выводы следующие: 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 учитывая критику пока не решил что делать Спасибо всем учавствовавшем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2010, 11:41 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
Victor_V_S3. По поводу оператора Having учитывая критику пока не решил что делать чо тут делать!? убирать его нахрен нужно! и переносить условие в вэа с битвин!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2010, 14:27 |
|
||
|
Как можно определить какие нужны индексы для SQL запроса
|
|||
|---|---|---|---|
|
#18+
kolesovубирать его нахрен нужно! Поддерживаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2010, 21:01 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=36596773&tid=1558100]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 221ms |
| total: | 377ms |

| 0 / 0 |
