|
Сложный запрос
|
|||
---|---|---|---|
#18+
Всем привет, большая проблема, очень нужна помощь(( Есть база пациентов, случаев очень много, на данный момент 5 миллионов, ну и каждый месяц естественно добавляются новые. Задача в том, что нужно выбрать повторные случаи, то есть, если один и тот же человек с одним полисом посещал несколько раз медицинское учреждение, ну и плюс кое-какие условия, типа совпадает специальность врача, цель посещения и т.д, то тогда эти случаи нужно отобрать. В базе есть разные таблицы, основная - случай лечения, которая соединяется с таблицей пациентов. Один и тот же человек может быть в таблице пациентов под несколькими id. Проблема в том, что когда там много записей процедура, отбирающая эти случаи отрабатывает ооооочень долго. Ну естественно, потому что таблица объединяется сама с собой... Как быть в такой ситуации? Может быть у кого-то было что-то похожее? Каким образом можно попытаться ускорить? Дайте совет пожалуйста ( ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2017, 22:27 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Тут нужен программист, освоивший язык SQL до слов GROUP BY и HAVING. А соединять таблицу с собой при этом совсем не нужно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2017, 22:34 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, нельзя просто сгруппировать по номеру полису и взять >1. Одно из условий на дату посещения, если больше 15 дней, то повторным уже не считается ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2017, 22:48 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Кареглазая_заянельзя Можно. Кареглазая_заяесли больше 15 дней, то повторным уже не считается А если было четыре посещения с периодом в две недели каждое, это как считается? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2017, 22:54 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Кареглазая_зая> нельзя Зачем спорить, если элементарно не хватает квалификации? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2017, 22:58 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, все 4 должны быть отобраны. Первый потому что у него есть второе посещение и разница дней между ними не больше 15, у второго третье, у третьего четвертое ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2017, 23:02 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, я не спорю. А говорю, что обычной группировкой тут не обойдешься ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2017, 23:12 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Вот примерная структура r_pacient : id, polis, dr r_schet : id, id_type r_sl : id, id_schet, id_r_pacient, dt_end, mkb, pos, nomlpu Выбрать r_schet.id, r_sl.id , r_sl.nomlpu, такие, что возраст (r_pacient.dr) < 65 посещения (r_sl.dt_end)между двумя случаями <16 исключить r_sl.mkb на букву O, r_schet.id_type 1, пары с r_sl1.pos = 2 , а r_sl2.pos =1, если r_sl1.dt_end < r_sl2.dt_end Помогите пожалуйста тогда написать запрос! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2017, 23:31 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Как-то так. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 00:14 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, как-то так я сейчас и делаю. Правда соединять надо не по id_r_pacient, а по полису. Но таблица r_sl очень большая, можно ли каким-нибудь образом exists заменить? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 01:22 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
А я бы вообще запросом не делал, а набросал ХП, в которой можно было бы спокойно учесть все предикаты, нюансы и перламутровые пуговицы, которые через неделю всплывут. Заодно подзапроса можно будет выкинуть, одного цикла хватит. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 01:32 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, ХП - хранимая процедура? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 01:46 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Кареглазая_заятаблица r_sl очень большая, можно ли каким-нибудь образом exists заменить?Я бы в 1-ю очередь обратил внимание на join'ы - они по-умолчанию inner, если я не ошибаюсь. Если есть возможность, лучше заменять их на left/right [outer] join'ы - они работают "в один проход" при чем "с нужной стороны", в отличие от inner. Например, если к основной таблице чз left join присоединить другую с записями по ключу - такое соединение пройдет наиболее безболезненно по времени. Что касается exists - он работает быстро, ведь он в WHERE и не участвует в соединении таблиц, а только в фильтрации результата. Можно попробовать и приджойнить "себя же" и в WHERE только даты сравнивать, но я очень сомневаюсь, что будет быстрее. Да, еще, основное условие "mkb not starting with 'O'" ужасно, по полю mkb с таким условием индекс сомневаюсь, что получится использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 02:07 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Да, а долго будет в любом случае, т.к. условия идут по второстепенным таблицам, а значит наверняка перебираются все записи основной большой таблицы не по индексу. Чтобы хоть часть отсечь в таком случае - придется основной таблицей делать пациентов - их можно по возрасту по индексу фильтрануть. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 02:21 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
YuRockЕсли есть возможность, лучше заменять их на left/right [outer] join'ы - они работают "в один проход" при чем "с нужной стороны", в отличие от inner. Например, если к основной таблице чз left join присоединить другую с записями по ключу - такое соединение пройдет наиболее безболезненно по времени. А давай ты не будешь говорить о том в чём совсем не смыслишь. Оба твоих сообщения полнейшая чушь ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 06:58 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Кареглазая_заяОдин и тот же человек может быть в таблице пациентов под несколькими id. Бардак. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 08:41 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
wadmanКареглазая_заяОдин и тот же человек может быть в таблице пациентов под несколькими id. Бардак. Надо Дока звать, он предметную часть знает. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 10:44 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Кареглазая_заякак-то так я сейчас и делаю. Тогда в полный рост встаёт вопрос планов, статистики, наличия индексов и прочий высший пилотаж. Раз уж хитроподвывернутые условия так криво ложатся на схему БД. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 10:56 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
GallemarНадо Дока звать не надо, "я еще не волшебник..." © :) С wadman согласен на 146%, бардак полнейший. Полис ОМС у россиянина один на всю жизнь. А тут ТС даже структуры базы нормально показать не может. Трудно ей будет у нас ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 11:06 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Кареглазая_зая, Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 11:09 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Док, сложно, я просто не знаю как объяснить по-нормальному, чтобы и ненужных вещей не говорить и в тоже время суть. А насчет id пациента, никакого бардака нет. Такую информацию передает Фонд ОМС, а связано с тем, что пациенты выгружаются помесячно - счетами, и соответственно в каждом счете id пациента уникально, а счетов мб много. Такая структура. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 11:31 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Симонов ДенисYuRockЕсли есть возможность, лучше заменять их на left/right [outer] join'ы - они работают "в один проход" при чем "с нужной стороны", в отличие от inner. Например, если к основной таблице чз left join присоединить другую с записями по ключу - такое соединение пройдет наиболее безболезненно по времени. А давай ты не будешь говорить о том в чём совсем не смыслишь. Оба твоих сообщения полнейшая чушь Окей, чушь, но я написал всё это исходя из своего опыта и своего понимания, как это всё работает. P.S. Ты утверждаешь, что inner и left join'ы -одинаковы по быстродействию, т.е. для сервера работы одинаковое количество для этих двух видов соединения таблиц? Я считаю, что нет, и left легче, а ты написал - что это полная чушь. Так вот, повторяю вопрос: "Ты утверждаешь, что inner и left join'ы -одинаковы по быстродействию, т.е. для сервера работы одинаковое количество для этих двух видов соединения таблиц?" ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 11:37 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
авторПолис ОМС у россиянина один на всю жизнь. За свою недолгую жизнь я в прошлом году получил уже третий полис. Так шта... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 11:37 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
YuRock, твой опыт весьма поверхностный. Я привык доверять оптимизатору и только если меня не устраивает быстродействие, то рассматриваю как можно самостоятельно оптимизировать запрос. Золотое правило не пытаться преждевременно оптимизировать. И да в случае inner join вариантов выполнения много больше. Оптимизатор может принять лучшее решение и только если он это делает неправильно нужно рассматривать другие варианты. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 11:43 |
|
Сложный запрос
|
|||
---|---|---|---|
#18+
Симонов ДенисYuRock, Я привык доверять оптимизатору и только если меня не устраивает быстродействие, то рассматриваю как можно самостоятельно оптимизировать запрос. Золотое правило не пытаться преждевременно оптимизировать. И да в случае inner join вариантов выполнения много больше. Оптимизатор может принять лучшее решение и только если он это делает неправильно нужно рассматривать другие варианты. Именно так я и поступаю тоже всегда. Сдесь же ТС обратился с просьбой дать идеи, как попробовать оптимизировать запрос, который выполняется "оооочень долго". Я дал свои советы, исходя из своего опята. Симонов ДенисОба твоих сообщения полнейшая чушь. Симонов Дениствой опыт весьма поверхностный. Тут можешь продолжать и дальше, меня подобные высказывания не трогают. Только ты ответь: Ты действительно считаешь чушью (как ты и написал), что left легче inner? Или просто у самого чушь вырвалась случайно? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2017, 11:49 |
|
|
start [/forum/topic.php?fid=40&msg=39463442&tid=1561558]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
139ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 306ms |
total: | 552ms |
0 / 0 |