|
|
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
Исходные данные: Есть четыре таблицы - Clients, RubricaNames, Rubricator, Points2Rubrica Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Код: plsql 1. 2. 3. 4. 5. Код: plsql 1. 2. 3. 4. 5. Код: plsql 1. 2. 3. 4. 5. Где: Clients - карточки клиентов RubricaNames - заведенные пользователем рубрикаторы Rubricator - значения рубрикаторов Points2Rubrica - таблица привязок значений рубрикаторов к карточкам клиентов Задача: вывести плоскую таблицу, в каждой записи которой есть Id, FamilyId из карточки и 12 полей - привязанных значений рубрикатора (или 0, если привязки нет), а так же 1 или 0, в зависимости от "совершеннолетия". Пока решил следующим запросом: Код: plsql 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. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. Но быстродействие как-то немного сомнительно. 1000 записей обрабатывается в районе 14 секунд. Как считаете, есть куда оптимизировать? И если "да", покажите пожалуйста куда копать. А еще бы лучше на примере 2 рубрикаторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 16:01:07 |
|
||
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 16:05:43 |
|
||
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
Majestio1 или 0, в зависимости от "совершеннолетия".сразу правьте Majestio Код: plsql 1. на Код: sql 1. хотя бы по причине того, что совершеннолетие наступает в день рождения, а не в год рождения. порадовало полеMajestio Код: plsql 1. то есть гендер есть или его нет :) кстати это ещё и неполиткорректно, а в некоторых странах есть средний пол ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 16:10:15 |
|
||
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
roadster , про объединения я в курсе, только не понимаю каким боком их тут применить :-\ На каждый новый столбец "значения рубрикатора" объединять с одними и теми же таблицами по нескольку раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 16:18:41 |
|
||
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
roadsterMajestio1 или 0, в зависимости от "совершеннолетия".сразу правьте Majestio Код: plsql 1. на Код: sql 1. 2. хотя бы по причине того, что совершеннолетие наступает в день рождения, а не в год рождения. Заказчик настаивает только на годе рождения. В принципе его понять можно - отчеты как правило годовые. В январе за прошлый год. Думаю, так прокатит. roadsterпорадовало поле Majestio Код: plsql 1. то есть гендер есть или его нет :) кстати это ещё и неполиткорректно, а в некоторых странах есть средний пол Пофик. У нас такого нет. Помогите лучче с примером на объединение. Хотя бы 2 рубрикатора, дальше я сам соображу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 16:23:56 |
|
||
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
MajestioЗаказчик настаивает только на годе рождения.заказчик завтра передумает и придётся много переделывать, проще в структуре заложиться на дату и доставать из неё год в запросе. MajestioПомогите лучче с примером на объединение.хм... по структуре всё совсем неочевидно, но если следовать описанию таблиц, а именно Majestio Points2Rubrica - таблица привязок значений рубрикаторов к карточкам клиентов то выглядеть это будет примерно так Код: sql 1. 2. 3. 4. это без имени рубрики и я не понимаю почему именно 12 полей? а если у заказчика появится новая рубрика например "Семья погибшего опекуна-инвалида, отселённого для получения пособия"? Вы будете весь год переписывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 16:37:24 |
|
||
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
Majestio, да, в примере будет много строк для одного клиента, но можно сделать вью описанного вида, а потом запросом транспонировать и агрегировать его как хочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 16:38:40 |
|
||
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
roadsterMajestioЗаказчик настаивает только на годе рождения.заказчик завтра передумает и придётся много переделывать, проще в структуре заложиться на дату и доставать из неё год в запросе. Специфика эксплуатации. Как видно, наверное, из сказанного выше - клиенты в критических психологических состояниях. Часто от множества вопросов бросают телефонную трубку. Заказчик (психологи) настояли на вводе или года рождения в поля, или возраста. В зависимости от числа я трактую его в программе, либо как год рождения, либо как возраст на момент регистрации. Конечно, погрешности тут явные. Изначально и было забито поле типа "дата". Настояли убрать, аргументировав вышесказанным. Это пошло под их подпись в Т3. Захотят прередалать - пусть оплачивают, ноу проблем. roadsterMajestioПомогите лучче с примером на объединение.хм... по структуре всё совсем неочевидно, но если следовать описанию таблиц, а именно Majestio Points2Rubrica - таблица привязок значений рубрикаторов к карточкам клиентов то выглядеть это будет примерно так Код: sql 1. 2. 3. 4. Спасибо. И за оперативный ответ - отдельно. Попробую поэксперементировать с объединениями. roadsterэто без имени рубрики и я не понимаю почему именно 12 полей? Типовой стандартизированный отчет, где используюется подмножество рубрик. roadsterа если у заказчика появится новая рубрика например "Семья погибшего опекуна-инвалида, отселённого для получения пособия"? Вы будете весь год переписывать? Не появится) Рубрикацию мы уже месяца два согласовывали. Сложные описатели разносим по нескольким рубрикам. В вопросе выше это будет набор рубрикаторов: * Инвалид (да/нет) * Опекун (да/нет) * Погибший (да/нет) * Семья на отселении (да/нет) * Получает пособие (да/нет) Отчет довольно громоздкий, 96 полей "аля Семья погибшего опекуна-инвалида, отселённого для получения пособия". Решил вытащить плоскую таблицу и пересчитать на клиенте. В информационной модели есть "Карточки клиентов" и есть "Семьи" (но в неявном виде), реализуемые привязкой карточек между собой степенью родства. Каждая семья так же рубрицируется (видно в запросе по FamilyId). Ну вот как-то так) Еще раз спасибо, пошел Navicat мучать)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 17:05:45 |
|
||
|
Прошу помочь с оптимизацией запроса
|
|||
|---|---|---|---|
|
#18+
Вопрос решен в плане оптимизации. Новый вид запроса выполняется в 7 раз быстрее (2 сек вместо 14). Уже более-менее "съедобно". Код: plsql 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. Для обеспечения функционирования этого "хозяйства" во FreeBSD ставим порт: Код: sql 1. 2. Потом регаем расширения: Код: sql 1. Пользуемся нужной функцией crosstab Вопрос закрыт, если нет возражений) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2014, 10:55:04 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=124&tid=1998540]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
71ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
| others: | 225ms |
| total: | 401ms |

| 0 / 0 |
