powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленно работает запрос.
59 сообщений из 59, показаны все 3 страниц
Медленно работает запрос.
    #38469946
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте уважаемые форумчане.

Недавно стала работать с MySQL, плаваю еще во всем. До этого писала только SQL запросы для БД Access. Там вроде особых проблем не возникало. А тут что-то запрос уж совсем медленно работает, у меня на тестовой базе до 10 минут, а у клиента вообще редко отрабатывает полностью. На Access почти аналогичный запрос работает гораздо быстрее, но там и данных значительно меньше, только одного филиала. А на MySQL скидываются данные из 30 филиалов и вот потом надо делать выборку.

Попробую в кратце описать, что у меня есть.

Есть таблица клиентов Clients с первычным ключем по двум полям ClientID, BranchID. Основное для запроса поле: TRPID - это значение присваивается клиенту, который ходит в несколько филиалов и в них уже зарегистрирован по своему ClientID, чтобы потом смотреть его общую статистику посещений.
Есть таблица посещений клиентов Visits, так же с первичным ключем по двум полям VisitID, BranchID. Которая содержит ClientID. Поле VisitIN - дата посещения. В тестовой базе 500 000 записей
И есть таблица маркетинговых расходов, которые были при посещении клиента ClientsMarketingExp с первичным ключем по двум полям ClientsMarketingExpID, BranchID. В которую входит VisitID. Одно посещение может содержать несколько расходов. В тестовой базе 95 000 записей.
Таблица Branches содержит BranchID и BranchName - название филиала.

Мне надо выбрать все посещения с маркетинговыми расходами, если таковые были, клиентов с TRPID = 70010, за заданный период. Т.е. если посещение включает два расхода, то в результате мы должны иметь и две строки. А если расходов не было, то одну сроку, в которой информация о маркетнговых расходах пустая.

В Access я все таблицы подключала через LEFT JOIN. Написала аналогичный запрос и для MySQL. Но он работает медленно. Почитала что лучше вместо LEFT JOIN использовать другой JOIN. Но не могу понять какой.

Вот мой немного упрощенный запрос, он все равно работает очень медленно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT V.VisitID, CME.ClientsMarketingExpID, V.BranchID as BranchID, 
      V.ClientID, V.`Group` as "Group", V.ClientType, V.ClientSize, 
      V.VisitType, V.VisitIn as `In`, V.VisitOut as `Out`, V.Balance, V.Rate, V.MaxRisk, 
      V.Automat, V.MarketingSum, V.MarketingNotes,
      V.ChangeTime, V.VersionID, V.UserID, V.Is2ndVisit, V.IsTypicalClient,
      CME.Code, CME.Sum, CME.Notes, CME.PlayMachineID, 
      CME.TimeIn, CME.PlayMachineID, C.GamblerCode, 
      C.NickName, C.Type, C.TRPID, Date(Date_Format(V.VisitIn, '%Y-%m-%d')) as DateIn, IF(B.BranchName is null, Cast(V.BranchID as char), B.BranchName) as BranchName
FROM (Visits V
  LEFT JOIN  ClientsMarketingExp CME ON V.VisitID=CME.VisitID AND V.BranchID=CME.BranchID)
  LEFT JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID
  LEFT JOIN Branches B ON V.BranchID=B.BranchID
WHERE V.VersionID<>-1  AND IF(IsNull(CME.Versionid),0,CME.VersionID)<>-1 AND V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND C.TRPID ='70010' AND V.BranchID<>1 
ORDER BY V.VisitIn, TimeIn;



Запрос отрабатывает 4-5 минут на MySQLWorkbench и в результате возвращает 57 записей. Пробовала делать выборку сначала из таблица клиентов, а потом уже присоединять к ней визиты и расходы. На скорость почти не влияет. Выборку из клиентов и визитов делает быстро, но стоит добавить маркетинги сразу скорость падает.

Поскажите, как мне видоизменить запрос? А может нужно добавить индексы на какие-то поля?

Извините за "много букв".
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38469978
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
план запроса?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38469990
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korni,

Вы таблицы ClientsMarketingExp и Clients соединяете по LEFT JOIN, однако в секции WHERE выкидываете записи, где поля из этих таблиц оказываются NULL. Тут либо не нужно слово LEFT, либо неверные условия в секции WHERE.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38469996
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фрагмент
Код: sql
1.
IF(IsNull(CME.Versionid),0,CME.VersionID)<>-1

можно заменить на
Код: sql
1.
CME.Versionid<>-1
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470009
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korni,

Для начала убирайте во FROM скобки -- они там вообще ни на фиг не нужны.

Далее, Во-первых, убирайте отсюда

LEFT JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID


LEFT JOIN, заменяйте его просто JOIN -- у вас всё равно на эту таблицу условие:

C.TRPID ='70010'


Во-вторых, это условие

AND IF(IsNull(CME.Versionid),0,CME.VersionID)<>-1

видимо должно быть в JOIN а не в WHERE.


Итого, у вас остаётся один единственный вразумительный
SARG --
V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30'
Это за месяц.

Есть у вас индекс по полю VisitIn ?

Сколько записей за один месяц ?

Если их много, то шансов у запроса выполняться быстро просто нет.

Ну и если оно действительно "у клиента вообще редко отрабатывает полностью", то хочу напомнить, что на все условия JOIN-ов должны быть индексы, если JOIN по двум полям -- составные из этих двух полей.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470011
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowплан запроса?

Да и без плана всё ясно.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470053
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
несовсем. есть сильное подозрение на отсутсвие индексов по полям джойна.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470073
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftKorni,

Вы таблицы ClientsMarketingExp и Clients соединяете по LEFT JOIN, однако в секции WHERE выкидываете записи, где поля из этих таблиц оказываются NULL. Тут либо не нужно слово LEFT, либо неверные условия в секции WHERE.

что-то я не понимаю, где у меня такие условия в секции WHERE?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470075
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korni,

Я явным образом написал.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470077
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KornimiksoftKorni,

Вы таблицы ClientsMarketingExp и Clients соединяете по LEFT JOIN, однако в секции WHERE выкидываете записи, где поля из этих таблиц оказываются NULL. Тут либо не нужно слово LEFT, либо неверные условия в секции WHERE.что-то я не понимаю, где у меня такие условия в секции WHERE?IF(IsNull(CME.Versionid),0,CME.VersionID)<>-1 и C.TRPID ='70010'
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470090
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivKorni,

Для начала убирайте во FROM скобки -- они там вообще ни на фиг не нужны.

скобки убрала - это отголосок синтаксиса Access'a.

MasterZivДалее, Во-первых, убирайте отсюда

LEFT JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID

LEFT JOIN, заменяйте его просто JOIN -- у вас всё равно на эту таблицу условие:

C.TRPID ='70010'

заменила

MasterZivИтого, у вас остаётся один единственный вразумительный
SARG --
V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30'
Это за месяц.

Есть у вас индекс по полю VisitIn ?

Сколько записей за один месяц ?

Если их много, то шансов у запроса выполняться быстро просто нет.

Ну и если оно действительно "у клиента вообще редко отрабатывает полностью", то хочу напомнить, что на все условия JOIN-ов должны быть индексы, если JOIN по двум полям -- составные из этих двух полей

посмотрела записей за месяц в среднем 23 000.
Добавила индекc по VisitIn и по полям VisitID и BranchID в таблице ClientsMarketingExp

В результате запрос отрабатывает за 45 секунд.

MasterZivВо-вторых, это условие

AND IF(IsNull(CME.Versionid),0,CME.VersionID)<>-1

видимо должно быть в JOIN а не в WHERE.
Здесь надо бы данные обновить на сервере и тогда можно будет убрать это условие.

Трудно с клиентом работать, он не хочет полностью мигрировать на MySQL сервер. Филиалы работают на Access и часть данных уходит на сервер. И они потом уже работают с обобщенными данными по филиалам.

Можно ли еще что-то улучшить или 45 секунд уже хороший результат? Компик у меня староват, может будь он помощнее и запрос веселее будет работать?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470095
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
explain запроса таки дайте
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470098
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrowexplain запроса таки дайте
а как его делать? Я только осваиваю MySQL.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470102
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перед запросом написать explain
выполнить.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470115
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow,
вот что получилось
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470142
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вам точно нужны 45 тыщ строк?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470169
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точно НЕ нужны.
если бы я еще понимала откуда они берутся, ведь месяц в среднем 23 тысячи.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470190
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из за джойнов скорее всего. попробуйте убирать джойны и смотреть сколько строк получается.
либо из за устаревшей статистики. попробуйте сделать analyze table для всех таблиц.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470254
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow,
убрала все джойны. Оставила только выборку из таблицы визитов. Explain все равно выдает 45 тысяч записей. Хотя если запускаю сам SELECT, он мне в результате запроса дает 21 тысячу.
вот сам запрос
авторexplain
SELECT V.VisitID, V.BranchID,
V.ClientID, V.`Group` as "Group", V.ClientType, V.ClientSize,
V.VisitType, V.VisitIn as `In`, V.VisitOut as `Out`, V.Balance, V.Rate, V.MaxRisk,
V.Automat, V.MarketingSum, V.MarketingNotes,
V.ChangeTime, V.VersionID, V.UserID, V.Is2ndVisit, V.IsTypicalClient
FROM Visits V
WHERE V.VersionID<>-1 AND V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND V.BranchID<>1
ORDER BY V.VisitIn
LIMIT 500000

Сделала analyze table. В результате получаю "status OK". Или я не то делаю, или там действительно все хорошо.
авторanalyze table visits - это надо было делать?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470264
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще убрала из основного запроса условие IF(IsNull(CME.Versionid),0,CME.VersionID)<>-1. Оказалось, в программе баг и это поле вообще на сервер не уходит. Но на скорость выполнения запроса это никак не повлияло. Так и осталось 40 секунд.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470265
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну понятно. вам сколько записей то нужно? ставьте limit сколько нужно.
дальше варианта 2. или подкрутить sort_buffer_size чтобы убрать filesort или добавить в таблицу Visits поле TimeIn из ClientsMarketingExp и сделать индекс (VisitIn, TimeIn )
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470285
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне все записи нужны. В результате моего запроса возвращается всего 57 записей.

Убрала сортировку из запроса. Время выполнения не изменилось.

Я еще думала, а не лучше ли начать с таблицы клиентов и уже к ней джойнить остальные таблицы? Если делать выборку из таблицы клиентов по моему условию, там всего 10 записей будет и сама таблица клиентов гораздо меньше визитов. А потом к ним уже "лепить" посещения. Или это на скорость работы не влияет?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470294
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторУбрала сортировку из запроса. Время выполнения не изменилось.

explain?

авторЯ еще думала, а не лучше ли начать с таблицы клиентов и уже к ней джойнить остальные таблицы
оптимизатор это сам разруливает.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470316
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фильтром по дате отфильтровывается 23 тыщи
автормесяц в среднем 23 тысячи.
вопрос - чем отфильтровывется еще 22943 записи?

ибо
авторВ результате моего запроса возвращается всего 57 записей.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470367
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KorniМне все записи нужны. В результате моего запроса возвращается всего 57 записей.

Убрала сортировку из запроса. Время выполнения не изменилось.

Я еще думала, а не лучше ли начать с таблицы клиентов и уже к ней джойнить остальные таблицы? Если делать выборку из таблицы клиентов по моему условию, там всего 10 записей будет и сама таблица клиентов гораздо меньше визитов. А потом к ним уже "лепить" посещения. Или это на скорость работы не влияет?

Не лучше. У вас фильтр по визитам.
Но фильтр не самый лучший -- 27тыщ строк.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470372
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

как бы надо определиться.

Если запрос

Код: sql
1.
2.
3.
SELECT count(*)
FROM Visits V
WHERE V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30'



возвращает эти 23 000 записей, то собственно далее уже копать некуда.
Индекс по VisitIn используется, JOIN-ы тоже по индексам. А далее проблема только в большом кол-ве записей.
Быстрее их не прочитаешь.

(чтобы увидеть реальную скорость их чтения, рекомендую запрос выполнять в утилите mysql).
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470544
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow,

23 тысячи - это находили все клиенты во всех 30 филиалах за месяц. А мне надо выбрать сколько находил один человек за месяц в этих самых филиалах и какие на него были расходы. Вот и получается 57 записей. Просто с их мягко выражаясь дурацкой системой, этот человек в разных филиалах имеет разные ClientID, и определяется он по TRPID. Поэтому в WHERE у меня стоит C.TRPID ='70010'.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470545
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, тогда стоит попробовать секционированные таблицы [ http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html ]. Конечно, _нужные_ данные он всё равно будет поднимать с диска, а вот _ненужные_ сможет пропускать секциями...
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470547
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KorniПоэтому в WHERE у меня стоит C.TRPID ='70010'.Ну так уберите лишние LEFT-ы.
Тогда MySQL сможет эффективно использовать это условие для фильтра, если по нему индекс есть.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470550
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaМожет, тогда стоит попробовать секционированные таблицы [ http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html ]. Конечно, _нужные_ данные он всё равно будет поднимать с диска, а вот _ненужные_ сможет пропускать секциями...Не смешите, с такими копеечными данными никакие секции не нужны. Было бы порядков на несколько побольше, тогда - да, можно было бы подумать на эту тему...
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470556
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

MasterZivНе лучше. У вас фильтр по визитам.
но у меня же есть и фильтр по клиентам TRPID = 70010? или я чего-то уж совсем не понимаю?

Может я изначально неправильно запрос писала. Мне надо сделать выборку всех посещений и расходов, если таковые были при посещении, клиентов с заданным значением TRPID за заданный период времени. Наиболее часто этот период времени равен одному месяцу.
Я так понимаю при таком раскладе я все равно упираюсь в 23000 записей. Если оптимизатор сам разруливает из чего лучше сначала выбирать из клиентов или визитов.

MasterZiv(чтобы увидеть реальную скорость их чтения, рекомендую запрос выполнять в утилите mysql).
а что за утилита такая?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470557
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
тогда не понятно, откуда 40 сек. Точнее - понятно (explain видел) , что этот запрос нужно переписывать (а то генерится гиганстская выборка). Но без схемы и понятия "что требуется" гадать на кофейной гуще я не берусь.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470565
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftKorniПоэтому в WHERE у меня стоит C.TRPID ='70010'.Ну так уберите лишние LEFT-ы.
Тогда MySQL сможет эффективно использовать это условие для фильтра, если по нему индекс есть.

Объясните тупой, а какие лефты лишние.

Сейчас запрос выглядит так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT V.VisitID, CME.ClientsMarketingExpID, V.BranchID as BranchID, 
      V.ClientID, V.`Group` as "Group", V.ClientType, V.ClientSize, 
      V.VisitType, V.VisitIn as `In`, V.VisitOut as `Out`, V.Balance, V.Rate, V.MaxRisk, 
      V.Automat, V.MarketingSum, V.MarketingNotes,
      V.ChangeTime, V.VersionID, V.UserID, V.Is2ndVisit, V.IsTypicalClient,
      CME.Code, CME.Sum, CME.Notes, CME.PlayMachineID, 
      CME.TimeIn, CME.PlayMachineID, C.GamblerCode, 
      C.NickName, C.Type, C.TRPID, Date(Date_Format(V.VisitIn, '%Y-%m-%d')) as DateIn, IF(B.BranchName is null, Cast(V.BranchID as char), B.BranchName) as BranchName
FROM (Visits V
  LEFT JOIN  ClientsMarketingExp CME ON V.VisitID=CME.VisitID AND V.BranchID=CME.BranchID)
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID
  LEFT JOIN Branches B ON V.BranchID=B.BranchID
WHERE V.VersionID<>-1  AND V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND C.TRPID ='70010' AND V.BranchID<>1 
ORDER BY V.VisitIn, TimeIn;



С Branches я так понимаю тоже можно просто сделать JOIN. Да даже и не суть, можно и без него обойтись. Не думаю, что он уж очень тормозит процесс.

А что вы подразумеваете под копеечными данными - это 23 000 после фильтра или что-то иное?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470572
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про скобки тоже уже говорили...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT V.VisitID, CME.ClientsMarketingExpID, V.BranchID as BranchID, 
      V.ClientID, V.`Group` as "Group", V.ClientType, V.ClientSize, 
      V.VisitType, V.VisitIn as `In`, V.VisitOut as `Out`, V.Balance, V.Rate, V.MaxRisk, 
      V.Automat, V.MarketingSum, V.MarketingNotes,
      V.ChangeTime, V.VersionID, V.UserID, V.Is2ndVisit, V.IsTypicalClient,
      CME.Code, CME.Sum, CME.Notes, CME.PlayMachineID, 
      CME.TimeIn, CME.PlayMachineID, C.GamblerCode, 
      C.NickName, C.Type, C.TRPID, Date(Date_Format(V.VisitIn, '%Y-%m-%d')) as DateIn, IF(B.BranchName is null, Cast(V.BranchID as char), B.BranchName) as BranchName
FROM Visits V
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID
  LEFT JOIN ClientsMarketingExp CME ON V.VisitID=CME.VisitID AND V.BranchID=CME.BranchID
  LEFT JOIN Branches B ON V.BranchID=B.BranchID
WHERE V.VersionID<>-1  AND V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND C.TRPID ='70010' AND V.BranchID<>1 
ORDER BY V.VisitIn, CME.TimeIn;


Попробуйте так.
Если опять много - показывайте план и имеющиеся индексы (а лучше структуру таблиц целиком).
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470573
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще разок продублирую последний запрос, для удобства чтения.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT V.VisitID, CME.ClientsMarketingExpID, V.BranchID as BranchID, 
      V.ClientID, V.`Group` as "Group", V.ClientType, V.ClientSize, 
      V.VisitType, V.VisitIn as `In`, V.VisitOut as `Out`, V.Balance, V.Rate, V.MaxRisk, 
      V.Automat, V.MarketingSum, V.MarketingNotes,
      V.ChangeTime, V.VersionID, V.UserID, V.Is2ndVisit, V.IsTypicalClient,
      CME.Code, CME.Sum, CME.Notes, CME.PlayMachineID, 
      CME.TimeIn, CME.PlayMachineID, C.GamblerCode, 
      C.NickName, C.Type, C.TRPID, Date(Date_Format(V.VisitIn, '%Y-%m-%d')) as DateIn, IF(B.BranchName is null, Cast(V.BranchID as char), B.BranchName) as BranchName
FROM Visits V
  LEFT JOIN  ClientsMarketingExp CME ON V.VisitID=CME.VisitID AND V.BranchID=CME.BranchID
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID
  LEFT JOIN Branches B ON V.BranchID=B.BranchID
WHERE V.VersionID<>-1  AND V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND C.TRPID ='70010' AND V.BranchID<>1 
ORDER BY V.VisitIn, TimeIn;



И сама задача
Мне надо сделать выборку всех посещений Visits и расходов ClientsMarketingExp, если таковые были при посещении, клиентов с заданным значением TRPID (по сути это один клиент, только в разных филиалах он зарегистрирован по разному) за заданный период времени. Наиболее часто этот период времени равен одному месяцу.
Филиалы работают off-line и потом просто скидывают часть данных на MySQL сервер для последующей обработки
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470578
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

спасибо, завтра попробую и доложусь о результатах
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470582
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kornimiksoft,

спасибо, завтра попробую и доложусь о результатахТолько, на всякий случай, возьмите мою версию запроса. Хотя по идее, разницы быть не должно.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470611
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KorniScareCrow,

23 тысячи - это находили все клиенты во всех 30 филиалах за месяц. А мне надо выбрать сколько находил один человек за месяц в этих самых филиалах и какие на него были расходы. Вот и получается 57 записей. Просто с их мягко выражаясь дурацкой системой, этот человек в разных филиалах имеет разные ClientID, и определяется он по TRPID. Поэтому в WHERE у меня стоит C.TRPID ='70010'.
обожаю когда люди вместо ответа на прямой и конкретный вопрос разговаривают с голосами в голове.
повторяю вопрос - чем отфильтровывется еще 22943 записи?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470624
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaМожет, тогда стоит попробовать секционированные таблицы [ http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html ]. Конечно, _нужные_ данные он всё равно будет поднимать с диска, а вот _ненужные_ сможет пропускать секциями...

Ты издиваешься что ли ?
Зачем ей при таких мизерных объёмах партицирование ?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470626
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KorniMasterZiv,

MasterZivНе лучше. У вас фильтр по визитам.
но у меня же есть и фильтр по клиентам TRPID = 70010? или я чего-то уж совсем не понимаю?


Он из другой таблицы.
И тогда индекс нужен составной, по VisitIn и клиенту (TRPID).

KorniМожет я изначально неправильно запрос писала. Мне надо сделать выборку всех посещений и расходов, если таковые были при посещении, клиентов с заданным значением TRPID за заданный период времени. Наиболее часто этот период времени равен одному месяцу.
Я так понимаю при таком раскладе я все равно упираюсь в 23000 записей. Если оптимизатор сам разруливает из чего лучше сначала выбирать из клиентов или визитов.

MasterZiv(чтобы увидеть реальную скорость их чтения, рекомендую запрос выполнять в утилите mysql).
а что за утилита такая?


Тут проблема в том, что условие размазано по двум таблицам. Но может и можно свести в одну.
я погляжу.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470634
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korni,

вот глядите, ваш запрос без волнующих подробностей:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
FROM Visits V
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID
...
WHERE 
-- (1)
  V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' 
-- (2)
AND C.TRPID ='70010' 



Условие C.TRPID ='70010' and V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' вместе селективно,
отбирает мало записей.
А по отдельности они

C.TRPID ='70010'
и
V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30'

-- малоселективны.

Это типичный случай, как я её называю, распределённой селективности.
Термин конечно дурацкий, но суть в том, что СУБД приходится обрабатывать много записей, чтобы почти все отсеить и получить на выходе мало.

Были бы эти поля в одной таблице -- можно было бы построить составной индекс , и запрос бы летал.

а в таком виде:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT V.VisitID, CME.ClientsMarketingExpID, V.BranchID as BranchID, 
      V.ClientID, V.`Group` as "Group", V.ClientType, V.ClientSize, 
      V.VisitType, V.VisitIn as `In`, V.VisitOut as `Out`, V.Balance, V.Rate, V.MaxRisk, 
      V.Automat, V.MarketingSum, V.MarketingNotes,
      V.ChangeTime, V.VersionID, V.UserID, V.Is2ndVisit, V.IsTypicalClient,
      CME.Code, CME.Sum, CME.Notes, CME.PlayMachineID, 
      CME.TimeIn, CME.PlayMachineID, C.GamblerCode, 
      C.NickName, C.Type, C.TRPID, Date(Date_Format(V.VisitIn, '%Y-%m-%d')) as DateIn, IF(B.BranchName is null, Cast(V.BranchID as char), B.BranchName) as BranchName

FROM Visits V
  LEFT JOIN  ClientsMarketingExp CME ON V.VisitID=CME.VisitID AND V.BranchID=CME.BranchID
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID
  LEFT JOIN Branches B ON V.BranchID=B.BranchID
WHERE V.VersionID<>-1  AND V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND C.TRPID ='70010' AND V.BranchID<>1 
ORDER BY V.VisitIn, TimeIn;




надо строить индекс в Visits
по
(VisitIn, ClientID, BranchID)

тогда если по условию C.TRPID ='70010' отбирается одна запись, есть шанс, что тоже будет быстро.

Можно для надёжности переписать FROM немного ( если оптимизатор сам не догадается протолкнуть таблицу Clients C наверх) :
(но это не обязательно и не гарантирует успешний план)

Код: sql
1.
2.
3.
4.
FROM Clients C
  JOIN Visits V ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID  
  LEFT JOIN  ClientsMarketingExp CME ON V.VisitID=CME.VisitID AND V.BranchID=CME.BranchID
  LEFT JOIN Branches B ON V.BranchID=B.BranchID




У вас кстати

V.BranchID<>1

и

JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID

Так что можно сразу это условие написать на таблицу Clients,
С.BranchID<>1

(оптимизатор по идее может и сам догадаться, но запрос-то тоже логичным должен быть)
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470637
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowKorniScareCrow,

23 тысячи - это находили все клиенты во всех 30 филиалах за месяц. А мне надо выбрать сколько находил один человек за месяц в этих самых филиалах и какие на него были расходы. Вот и получается 57 записей. Просто с их мягко выражаясь дурацкой системой, этот человек в разных филиалах имеет разные ClientID, и определяется он по TRPID. Поэтому в WHERE у меня стоит C.TRPID ='70010'.
обожаю когда люди вместо ответа на прямой и конкретный вопрос разговаривают с голосами в голове.
повторяю вопрос - чем отфильтровывется еще 22943 записи?

По-моему уже было ясно, что

условием C.TRPID ='70010'
и последующим условием V.ClientID=C.ClientID AND V.BranchID=C.BranchID

Если нет, пусть топикстартер скажет.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470807
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivBagaBagaМожет, тогда стоит попробовать секционированные таблицы [ http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html ]. Конечно, _нужные_ данные он всё равно будет поднимать с диска, а вот _ненужные_ сможет пропускать секциями...

Ты издиваешься что ли ?
Зачем ей при таких мизерных объёмах партицирование ?

Ни в коем случае. Тогда точно можно не гадать, "а был ли мальчик" а есть ли индекс. Хотя и из пушки по воробьям.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38470922
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaТогда точно можно не гадать, "а был ли мальчик" а есть ли индексСоздать индекс будет наверняка быстрее, чем долбать партиции. И гадать тоже не нужно.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471041
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivScareCrowпропущено...

обожаю когда люди вместо ответа на прямой и конкретный вопрос разговаривают с голосами в голове.
повторяю вопрос - чем отфильтровывется еще 22943 записи?

По-моему уже было ясно, что

условием C.TRPID ='70010'
и последующим условием V.ClientID=C.ClientID AND V.BranchID=C.BranchID

Если нет, пусть топикстартер скажет.

Да-да, MasterZiv прав, именно этим условием и отсеивается.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471095
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

перепробовала я сегодня все варианты. Меняла визиты с клиентами местами, и переносила условие V.BranchID<>1 в условие джойна. меняла его на С.BranchID<>1, т.к. по сути это одно и тоже (мне надо отсеять визиты клиента из его основного филиала). Результат тот же 40 секунд +- 2 секунды. Индекс по VisitIN_ClientID_BranchID тоже создала. На скорость работы не повлияло. Вы писали, что если по условию C.TRPID ='70010' отбирается одна запись, то это может помочь. Но там отбирается 13 записей. Правда это самый запущенный случай. Обычно это 2-3 записи. Видимо поэтому индекс не помог.

Может на скорость влиять старость и дряблость моего компьютера, все-таки 2 GHz, это даже не вчерашний день :( ? Попробую, что у клиента получится в результате всех улучшений. Правда, там тоже свои подводные камни :(

Я так понимаю следующим шагом мне надо создать в таблице визитов поле TRPID, но при этом в таблице клиентов оно тоже сохраняется. И тогда в запросе у меня отсеется таблица клиентов. Плюс создать индекс по полям VisitIN, TRPID, BranchID. Тогда скорость должна еще повысится.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471110
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЕсли опять много - показывайте план и имеющиеся индексы (а лучше структуру таблиц целиком).
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471143
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

вот explain моего запроса


запрос имеет вид
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
explain
SELECT V.VisitID, CME.ClientsMarketingExpID, V.BranchID as BranchID, 
      V.ClientID, V.`Group` as "Group", V.ClientType, V.ClientSize, 
      V.VisitType, V.VisitIn as `In`, V.VisitOut as `Out`, V.Balance, V.Rate, V.MaxRisk, 
      V.Automat, V.MarketingSum, V.MarketingNotes,
      V.ChangeTime, V.VersionID, V.UserID, V.Is2ndVisit, V.IsTypicalClient,
      CME.Code, CME.Sum, CME.Notes, CME.PlayMachineID, 
      CME.TimeIn, CME.PlayMachineID, C.GamblerCode, 
      C.NickName, C.Type, C.TRPID, Date(Date_Format(V.VisitIn, '%Y-%m-%d')) as DateIn, IF(B.BranchName is null, Cast(V.BranchID as char), B.BranchName) as BranchName
FROM Visits V
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID AND C.BranchID<>1
  LEFT JOIN  ClientsMarketingExp CME ON V.VisitID=CME.VisitID AND V.BranchID=CME.BranchID
  LEFT JOIN Branches B ON V.BranchID=B.BranchID
WHERE V.VersionID<>-1  AND V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND C.TRPID ='70010'  
ORDER BY V.VisitIn, CME.TimeIn;



структура таблиц
Код: sql
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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
delimiter $$

CREATE TABLE `clients` (
  `ClientID` int(11) NOT NULL DEFAULT '0',
  `BranchID` int(11) NOT NULL DEFAULT '0',
  `NickName` varchar(100) DEFAULT NULL,
  `Name` varchar(50) DEFAULT NULL,
  `Surname` varchar(100) DEFAULT NULL,
  `Activity` tinyint(1) DEFAULT NULL,
  `GamblerCode` varchar(20) DEFAULT NULL,
  `Group` varchar(10) DEFAULT NULL,
  `Type` varchar(10) DEFAULT NULL,
  `Size` varchar(10) DEFAULT NULL,
  `ChangeTime` datetime DEFAULT NULL,
  `CreateTime` datetime DEFAULT NULL,
  `VersionID` int(11) DEFAULT NULL,
  `UserID` varchar(20) DEFAULT NULL,
  `UserZales` varchar(50) DEFAULT NULL,
  `IsTypicalClient` tinyint(1) DEFAULT NULL,
  `Deleted` tinyint(1) DEFAULT NULL,
  `DeleteDate` datetime DEFAULT NULL,
  `SortOrder` int(11) DEFAULT NULL,
  `TRPID` varchar(10) DEFAULT NULL,
  `Birthday` datetime DEFAULT NULL,
  `NameDay` datetime DEFAULT NULL,
  `Age` tinyint(4) DEFAULT NULL,
  `Occupation` varchar(100) DEFAULT NULL,
  `TRPReport` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`ClientID`,`BranchID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

--------
delimiter $$

CREATE TABLE `visits` (
  `VisitID` int(11) NOT NULL DEFAULT '0',
  `BranchID` int(11) NOT NULL DEFAULT '0',
  `ClientID` int(11) DEFAULT NULL,
  `Group` varchar(10) DEFAULT NULL,
  `ClientType` varchar(10) DEFAULT NULL,
  `ClientSize` varchar(10) DEFAULT NULL,
  `VisitType` varchar(1) DEFAULT NULL,
  `VisitIN` datetime DEFAULT NULL,
  `VisitOUT` datetime DEFAULT NULL,
  `Balance` decimal(9,2) DEFAULT NULL,
  `Automat` varchar(200) DEFAULT NULL,
  `MarketingSum` decimal(9,2) DEFAULT NULL,
  `MarketingNotes` varchar(250) DEFAULT NULL,
  `ChangeTime` datetime DEFAULT NULL,
  `VersionID` int(11) DEFAULT NULL,
  `UserID` varchar(20) DEFAULT NULL,
  `UserZales` varchar(50) DEFAULT NULL,
  `Is2ndVisit` tinyint(1) DEFAULT NULL,
  `IsTypicalClient` tinyint(1) DEFAULT NULL,
  `Rate` decimal(9,2) DEFAULT NULL,
  `MaxRisk` decimal(9,2) DEFAULT NULL,
  PRIMARY KEY (`VisitID`,`BranchID`),
  KEY `VisitIN` (`VisitIN`),
  KEY `VisitIN_ClientID_BranchID` (`VisitIN`,`ClientID`,`BranchID`),
  KEY `ClientID_BranchID` (`ClientID`,`BranchID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

----------
delimiter $$

CREATE TABLE `clientsmarketingexp` (
  `ClientsMarketingExpID` int(11) NOT NULL DEFAULT '0',
  `BranchID` int(11) NOT NULL DEFAULT '0',
  `ClientID` int(11) DEFAULT NULL,
  `NickName` varchar(100) DEFAULT NULL,
  `GamblerCode` varchar(20) DEFAULT NULL,
  `Code` varchar(5) DEFAULT NULL,
  `ChangeTime` datetime DEFAULT NULL,
  `CreateTime` datetime DEFAULT NULL,
  `TimeIn` datetime DEFAULT NULL,
  `PlayMachineID` tinytext,
  `Sum` decimal(9,2) DEFAULT NULL,
  `UserID` varchar(20) DEFAULT NULL,
  `UserZales` varchar(50) DEFAULT NULL,
  `VisitID` int(11) DEFAULT NULL,
  `BranchName` varchar(25) DEFAULT NULL,
  `VersionID` int(11) DEFAULT NULL,
  `Notes` varchar(200) DEFAULT NULL,
  `Parbaudits` varchar(100) DEFAULT NULL,
  `VideoPiezimes` varchar(100) DEFAULT NULL,
  `Rate` decimal(9,2) DEFAULT NULL,
  `MaxRisk` decimal(9,2) DEFAULT NULL,
  PRIMARY KEY (`ClientsMarketingExpID`,`BranchID`),
  KEY `VisitID_BranchID` (`VisitID`,`BranchID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471161
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korni,

Попробуйте добавить индекс `clients` (`TRPID`). После этого сделайте ANALYZE TABLE `clients` и проверьте работу запроса еще раз.
Если опять плохо - опять показывайте план.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471207
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

все сделала, результат 12 секунд!!!

вот план, он изменился


Теперь на первое место вышла таблица клиентов. В общем-то по логике так и должно было быть. И из таблицы визитов обрабатывается на порядок меньше записей.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471361
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему в планах key_len=9 там, где по идее должно быть 8 ? Кто в курсе?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471363
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRPID надо перенести в таблицу Visits и сделать индекс TRPID, VisitIn
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471369
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftА почему в планах key_len=9 там, где по идее должно быть 8 ? Кто в курсе?И своя же версия - это DEFAULT NULL у одного из полей индекса такое дает?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471490
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за помощь!
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471722
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KorniВы писали, что если по условию C.TRPID ='70010' отбирается одна запись, то это может помочь. Но там отбирается 13 записей. Правда это самый запущенный случай. Обычно это 2-3 записи. Видимо поэтому индекс не помог.
.

Я описался, потом хотел исправить, но забыл. Конечно, имелось в виду, что записей мало, а не что она только одна.
13 -- это тоже мало.

На счёт всего остального -- мало написать правильно запрос и создать правильный индекс, нужно ещё убедиться, что оптимизатор будет использовать этот индекс. А если не использует, и вы уверены, что должен -- заставить его это делать.

KorniЯ так понимаю следующим шагом мне надо создать в таблице визитов поле TRPID, но при этом в таблице клиентов оно тоже сохраняется. И тогда в запросе у меня отсеется таблица клиентов. Плюс создать индекс по полям VisitIN, TRPID, BranchID. Тогда скорость должна еще повысится.

Ну, можно и так.

Но я бы ещё раз хотел поглядеть на последний вариант запроса и таблиц.

show create table со всех таблиц и запрос давайте.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471724
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowTRPID надо перенести в таблицу Visits и сделать индекс TRPID, VisitIn

Уже не нужно. Можно и так оставить.
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38471730
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korni,

ещё вопрос, что такой запрос выдаёт?

Код: sql
1.
2.
3.
4.
SELECT count(*)
FROM Visits V
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID AND C.BranchID<>1
WHERE V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND C.TRPID ='70010'  ;




сколько тут записей будет ?
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38472760
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivKorni,

ещё вопрос, что такой запрос выдаёт?

Код: sql
1.
2.
3.
4.
SELECT count(*)
FROM Visits V
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID AND C.BranchID<>1
WHERE V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' AND C.TRPID ='70010'  ;




сколько тут записей будет ?
здесь у меня 44 записи получается
...
Рейтинг: 0 / 0
Медленно работает запрос.
    #38472797
Korni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivshow create table со всех таблиц и запрос давайте.

Что-то я немного сегодня в шоке, запустила план вроде как последнего запроса, но картина немного изменилась. Почему-то в визитах получается 11 записей.

вот план


В общем последний запрос выглядит так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT V.VisitID, CME.ClientsMarketingExpID, V.BranchID as BranchID, 
      V.ClientID, V.`Group` as "Group", V.ClientType, V.ClientSize, 
      V.VisitType, V.VisitIn as `In`, V.VisitOut as `Out`, V.Balance, V.Rate, V.MaxRisk, 
      V.Automat, V.MarketingSum, V.MarketingNotes,
      V.ChangeTime, V.VersionID, V.UserID, V.Is2ndVisit, V.IsTypicalClient,
      CME.Code, CME.Sum, CME.Notes, CME.PlayMachineID, 
      CME.TimeIn, CME.PlayMachineID, C.GamblerCode, 
      C.NickName, C.Type, C.TRPID, Date(Date_Format(V.VisitIn, '%Y-%m-%d')) as DateIn, IF(B.BranchName is null, Cast(V.BranchID as char), B.BranchName) as BranchName
FROM Visits V
  JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID AND V.BranchID<>1 AND C.TRPID ='70010'
  LEFT JOIN  ClientsMarketingExp CME ON V.VisitID=CME.VisitID AND V.BranchID=CME.BranchID
  LEFT JOIN Branches B ON V.BranchID=B.BranchID
WHERE V.VersionID<>-1  AND V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30'  
ORDER BY V.VisitIn, CME.TimeIn;



таблицы
Код: sql
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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
CREATE TABLE `clients` (
  `ClientID` int(11) NOT NULL DEFAULT '0',
  `BranchID` int(11) NOT NULL DEFAULT '0',
  `NickName` varchar(100) DEFAULT NULL,
  `Name` varchar(50) DEFAULT NULL,
  `Surname` varchar(100) DEFAULT NULL,
  `Activity` tinyint(1) DEFAULT NULL,
  `GamblerCode` varchar(20) DEFAULT NULL,
  `Group` varchar(10) DEFAULT NULL,
  `Type` varchar(10) DEFAULT NULL,
  `Size` varchar(10) DEFAULT NULL,
  `ChangeTime` datetime DEFAULT NULL,
  `CreateTime` datetime DEFAULT NULL,
  `VersionID` int(11) DEFAULT NULL,
  `UserID` varchar(20) DEFAULT NULL,
  `UserZales` varchar(50) DEFAULT NULL,
  `IsTypicalClient` tinyint(1) DEFAULT NULL,
  `Deleted` tinyint(1) DEFAULT NULL,
  `DeleteDate` datetime DEFAULT NULL,
  `SortOrder` int(11) DEFAULT NULL,
  `TRPID` varchar(10) DEFAULT NULL,
  `Birthday` datetime DEFAULT NULL,
  `NameDay` datetime DEFAULT NULL,
  `Age` tinyint(4) DEFAULT NULL,
  `Occupation` varchar(100) DEFAULT NULL,
  `TRPReport` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`ClientID`,`BranchID`),
  KEY `TRPID` (`TRPID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

-------

CREATE TABLE `clientsmarketingexp` (
  `ClientsMarketingExpID` int(11) NOT NULL DEFAULT '0',
  `BranchID` int(11) NOT NULL DEFAULT '0',
  `ClientID` int(11) DEFAULT NULL,
  `NickName` varchar(100) DEFAULT NULL,
  `GamblerCode` varchar(20) DEFAULT NULL,
  `Code` varchar(5) DEFAULT NULL,
  `ChangeTime` datetime DEFAULT NULL,
  `CreateTime` datetime DEFAULT NULL,
  `TimeIn` datetime DEFAULT NULL,
  `PlayMachineID` tinytext,
  `Sum` decimal(9,2) DEFAULT NULL,
  `UserID` varchar(20) DEFAULT NULL,
  `UserZales` varchar(50) DEFAULT NULL,
  `VisitID` int(11) DEFAULT NULL,
  `BranchName` varchar(25) DEFAULT NULL,
  `VersionID` int(11) DEFAULT NULL,
  `Notes` varchar(200) DEFAULT NULL,
  `Parbaudits` varchar(100) DEFAULT NULL,
  `VideoPiezimes` varchar(100) DEFAULT NULL,
  `Rate` decimal(9,2) DEFAULT NULL,
  `MaxRisk` decimal(9,2) DEFAULT NULL,
  PRIMARY KEY (`ClientsMarketingExpID`,`BranchID`),
  KEY `VisitID_BranchID` (`VisitID`,`BranchID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

----------

CREATE TABLE `visits` (
  `VisitID` int(11) NOT NULL DEFAULT '0',
  `BranchID` int(11) NOT NULL DEFAULT '0',
  `ClientID` int(11) DEFAULT NULL,
  `Group` varchar(10) DEFAULT NULL,
  `ClientType` varchar(10) DEFAULT NULL,
  `ClientSize` varchar(10) DEFAULT NULL,
  `VisitType` varchar(1) DEFAULT NULL,
  `VisitIN` datetime DEFAULT NULL,
  `VisitOUT` datetime DEFAULT NULL,
  `Balance` decimal(9,2) DEFAULT NULL,
  `Automat` varchar(200) DEFAULT NULL,
  `MarketingSum` decimal(9,2) DEFAULT NULL,
  `MarketingNotes` varchar(250) DEFAULT NULL,
  `ChangeTime` datetime DEFAULT NULL,
  `VersionID` int(11) DEFAULT NULL,
  `UserID` varchar(20) DEFAULT NULL,
  `UserZales` varchar(50) DEFAULT NULL,
  `Is2ndVisit` tinyint(1) DEFAULT NULL,
  `IsTypicalClient` tinyint(1) DEFAULT NULL,
  `Rate` decimal(9,2) DEFAULT NULL,
  `MaxRisk` decimal(9,2) DEFAULT NULL,
  PRIMARY KEY (`VisitID`,`BranchID`),
  KEY `VisitIN` (`VisitIN`),
  KEY `VisitIN_ClientID_BranchID` (`VisitIN`,`ClientID`,`BranchID`),
  KEY `ClientID_BranchID` (`ClientID`,`BranchID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
...
Рейтинг: 0 / 0
59 сообщений из 59, показаны все 3 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленно работает запрос.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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