|
|
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Помогите, пожалуйста, с реализацией запроса. Не могу понять каким образом лучше сделать - есть таблица CREATE TABLE tbl(id INT PRIMARY KEY, p1 INT, p2 INT, p3 INT, p4 INT, ..., p15 INT); Поля p(n) - принимают значения от [0;2] Необходимо вывести записи, у которых все поля p(n) уникальные, две записи, которые различаются только по 1 полю (если таких пар больше чем одна, то вывести все, если записей отличающихся на одно поле больше чем 2, то не выводить), 3 записи, различающиеся по 2 полям и так до 5 полей Т.е. в результате должно получиться что-то подобное Единственные записи: 1 | 211111211121111 3 | 201010201020101 Записи различающиеся на одну 234 | 201111111011111 412 | 101111111011110 ----------------------- 123 | 100000000000000 321 | 000000000000000 Записи, различающиеся на две 111 | 120000000000000 112 | 010000000000000 113 | 210000000000000 ----------------------- 114 | 222122222201111 115 | 222022222211111 222 | 222222222211111 И т.д. Что примерно можно сделать, оптимальное с точки зрения производительности? С уникальными 15 записями все легко, выбрать записи с уникальным параметрами, но как сделать остальное. Либо регулярки, либо группировки по всем возможным вариантам, больше ничего не приходит в голову Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2013, 04:52:42 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
Если записей не много, то я бы просто "перевернул" таблицу как (id, N, p) Ранжированием перевернутой таблицы получил бы чего хотел, потом через join с основной вывел бы колонки как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2013, 06:08:40 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
ну порядка 100 тысяч записей... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2013, 06:46:35 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
Нормализовал таблицу, сделав ее вида id | n | p Добавил такой запрос, на выборку всех записей с совпадающими значениями по 15 параметрам: SELECT t1.id, t2.id, count(*) AS c FROM test.T t1 INNER JOIN test.T as t2 on t1.n = t2.n AND t1.p = t2.p GROUP BY t1.id, t2.id HAVING c = 15 Но запрос получается очень тяжелый... выполняется слишком долго при 100 000 записях, можно ли это как-то оптимизировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2013, 15:37:09 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
Тыкайте индексы. Я в индексах MySQL не спец, но по аналогии с MS SQL сделал был составной индекс как в порядке аргументов запроса. Не знаю есть ли в MySQL аналог "кластерного индекса" как MS SQL, т.е. с физическим упорядывачиванием записей. Но в таких запросах я предпочитаю его, т.к. тогда SQL-сервер фактически почти как Table Scan по кусочку таблицы делает. В MS SQL очень быстро такое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 00:39:42 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
ManWithCloseMind, 1. будет полезнее, если вы хотябы намекнете смысл запроса, ну напромер: строин сайт знакомс и ишем совпадение профайлов по всем N атрибутам, а затем по N-1, N-2, N-3 и N-4 совпадений. 2. можно сделаь примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Это будет скорее всего фул скан 3. Перепишите предыдуший СКЛ в виде юниона и будет по индексу. 4. вертикально-сосисочный (EAV) вариант будет работать аналогично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 01:09:04 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
В принципе есть еще один секретный приемчик "фальшивый ключ" В смысле склеить стринг из p(N) отображающий их комбинации и по нему сделать индекс. Когда много полей и таблица большая я это делал несколько раз. Причем если умело присобачить сбоку еще индекс заведомо усекающий таблицу до кусочка 100-1000 записей, то можно агрессивно использовать Like даже. Просто SQL-сервер первым индексом оторвет нужные записи, а остальные переберет по Like. Не знаю как в MySQL, но до 1000 записей в MS SQL переборы даже быстрее индексов обычно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 01:29:59 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
ManWithCloseMind, решение из другой республики Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 02:54:32 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
ManWithCloseMind, результат ne_sowpadeniit1.z0t2.z01111123111211311123211115222112332121111122111113211132121121232113123211332121141152114222223441241234 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 02:57:21 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
В принципе MS SQL по такой запрос сам сделает Work Table и даже накрутит сверху виртуальных индексов. Сделает ли так оптимайзер MySQL? Но если это не делать, то мне кажется он будет выполняться очень долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 04:14:17 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
Попробовал сделать в MS SQL Server 2008, создал кластерный индекс по id и p, все-равно запрос выполнения для 5000 записей (в развернутом виде 75000) выполняется все долго... порядка часа на выполнение =( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 18:55:51 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
тестируется все на corei5 2.5gz, 4 гб рам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 18:56:57 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
javajdbc, к сожалению, нужно искать не по параметру... был бы параметр, было бы намного легче, нужно именно искать количество совпадения строк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 19:08:19 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
ПЕНСИОНЕРКА, в принципе, как альтернатива, только по оптимальности, такой запрос вряд ли выйдет лучше... Мне вообще кажется, что для данной задачи нужны большие вычислительные мощности, хотелось бы, чтобы 5000 записей с 15 параметрами считались хотя бы за минут 10. Как индексы не расставляй, все равно выходит около часа(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 19:13:00 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
ManWithCloseMindjavajdbc, к сожалению, нужно искать не по параметру... был бы параметр, было бы намного легче, нужно именно искать количество совпадения строк опять же, лучше выдавать бизнес смысл задачи. Будет намного понятнее что к чему. Похоже что ПЕНСИОНЕРКА вам выдала нормальное решение -- если задача действительно перебрать ВСЕ пары в базе и найти какие-то совпадения (или какието несовпадения). Щта задача не имеет оптимизации ибо надо перебрать ВСЕ пары, полный картезиан. Скорее всего репение и не требует оптимизации ибо имеет смысл как одноразовая задача. хоть час, хоть 10 часов одноразово. Если вам надо гонять эту задачу раз в 10 минут --- значит что то не то в голове у бизнесс аналиста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 19:24:48 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
К сожалению, бизнес-условия я рассказать не могу, просто примите это условие - загружается матрица из 100 записей и количество совпадений должно рассчитываться за указанное время. Я просто предполагал, что может есть какое-то решение, позволяющее эффективно выполнить эту задачу Но как не крути, все-равно выходит картезиан =/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2013, 19:41:01 |
|
||
|
Помогите с запросом - 15 полей, несколько группировок
|
|||
|---|---|---|---|
|
#18+
ManWithCloseMindПопробовал сделать в MS SQL Server 2008, создал кластерный индекс по id и p, все-равно запрос выполнения для 5000 записей (в развернутом виде 75000) выполняется все долго... порядка часа на выполнение =( Вы не умеете его готовить :) Вам нужно кластерный индекс не по id, а так как в порядке group by. Точнее первые 2 уровня обычно прикинув, что при применении такого индекса осталось бы в листе не более 100-1000 записей. Не помешает принудительно указать MS SQL такой индекс, т.к. оптимизатор к составным индексам относится хмуро и может его отбросить. Поэтому заглянуть в Query Plan не помешает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2013, 00:50:17 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38338329&tid=1836414]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 320ms |

| 0 / 0 |
