Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
johnnyg Member Откуда: Сообщений: 8 |
Добрый день, All! Подскажите пожалуйста, как можно лучшим образом решить следующую задачу: В столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde% В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def% Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски. К примеру, записи выше подходят друг другу. Я делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно. |
17 июл 14, 16:27 [16319600] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
а чем like не устроил то ? |
17 июл 14, 16:28 [16319607] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
А надо доказать, что множества строк, порождённые двумя разными масками, равны друг другу. johnnyg, лет через 30 напишите здесь, получилось у Вас что-нибудь или нет. Предсказываю, что напишете "не получилось". |
||
17 июл 14, 16:36 [16319666] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
поясните, почему вы считаете что эти две маски подходят друг другу строка "afcde", например, подходит первой маске, но не подходит второй |
||
17 июл 14, 16:39 [16319689] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
ну се ты так сразу :) Вдруг задача легче ? |
||
17 июл 14, 16:40 [16319691] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Хотя, если формально написать алгоритм обработки строки каждой маской, и они совпадут, то, значит, и сами маски равны. |
17 июл 14, 16:42 [16319713] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
|
||||
17 июл 14, 16:43 [16319728] Ответить | Цитировать Сообщить модератору |
johnnyg Member Откуда: Сообщений: 8 |
Возможно не верно объяснил. Мне нужно найти строки в таблицах A и B которые подходят друг другу учитывая, что в обеих строках маски. В примере: строка 1: a_cde% строка 2: ab_def% Подходят друг другу, т.к.: на позиции 2 первой строки стоит символ '_', следовательно в строке 2 на этой позиции может быть что угодно. на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно. на позиции 6 первой строки стоит символ '%', следовательно в строке 2 на этой позиции может быть что угодно или ничего не быть. на позиции 7 второй строки стоит символ '%', следовательно в строке 1 на этой позиции может быть что угодно или ничего не быть. Like не подходит. т.к. такой пример вернет нам в обоих выборках пустоту. select 'a_cde%' as Q into #A select 'ab_def%' as W into #B select * from #A, #B where #A.Q like #B.W select * from #A, #B where #B.W like #A.Q |
17 июл 14, 17:01 [16319839] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
johnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит |
17 июл 14, 17:13 [16319911] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Иначе вообще непонятно. |
||
17 июл 14, 17:15 [16319929] Ответить | Цитировать Сообщить модератору |
johnnyg Member Откуда: Сообщений: 8 |
Так я же пишу: на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно. У меня появилась идея это реализовать только посимвольным сравнением: Идем по обеим строкам: Если в первой строке на данной позиции '_' или во второй на данной позиции '_', то переходим к следующему символу, если нет то сравниваем символы в строках на данной позиции. Ну для '%' понятно. Вопрос в том, можно ли это реализовать как-то по другому, кроме посимвольного сравнения? |
||
17 июл 14, 17:18 [16319952] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Если предположить, что каждое знакоместо может быть представлено, скажем, 128 символами и длина маски не более 10, то получим вполне компактный "шумовой" массив данных, на котором можно тестировать маски. |
17 июл 14, 17:19 [16319962] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
интересно. строки 'привет%' и '%пока' будут подходить или нет и почему? и как вы собираетесь их посимвольно сравнивать? |
||||||
17 июл 14, 17:24 [16319986] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Маски подходят, если хотя бы одна из них является множеством для остальных. |
17 июл 14, 17:27 [16320005] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Чет я загнул, это ж 128 в 10 степени. |
||
17 июл 14, 17:29 [16320016] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
|
||
17 июл 14, 17:33 [16320036] Ответить | Цитировать Сообщить модератору |
johnnyg Member Откуда: Сообщений: 8 |
Прощу прощения, небольшое уточнение: % может быть только в конце маски.
Нам нужно собрать только те строки, из обеих таблиц которые описывают два разных, частично пересекающихся множества строк. Если их множества не пересекаются - не брать. |
||||||
17 июл 14, 17:39 [16320063] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
глобал вапрос - условие етой частичности у вас у самого сформированно как-то ? |
||
17 июл 14, 17:42 [16320081] Ответить | Цитировать Сообщить модератору |
johnnyg Member Откуда: Сообщений: 8 |
Прощу прощения - уточнение: частично и полностью пересекающиеся. |
||||
17 июл 14, 18:00 [16320171] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
написали бы сразу - выбрать пары масок из таблиц A и B, для которых найдется хотя бы одна строка, подходящая обеим. быстрого решения для больших таблиц тут не вижу |
||
17 июл 14, 18:11 [16320214] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Лучше CLR ничего не приходит в голову... |
17 июл 14, 18:31 [16320286] Ответить | Цитировать Сообщить модератору |
Mind Member Откуда: Лучший город на Земле Сообщений: 2322 |
Какую скорость обработки вы ожидаете? |
||
18 июл 14, 01:09 [16322137] Ответить | Цитировать Сообщить модератору |
johnnyg Member Откуда: Сообщений: 8 |
Если использовать CLR получится ли быстрее посимвольного сравнения в SQL?
По 100млн строк в каждой таблице. Любому ускорению от 5% по сравнению с посимвольным сравнением буду рад. |
||||||
18 июл 14, 14:24 [16325196] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
у вас два полных скана, некий расход памяти и проверка (100млн * 100млн ) пар. если маски повторяются в пределах одной таблицы, можно дистинктом уменьшить количество проверяемых пар, но получим затраты на дистинкт; можно отсеять обратные друг другу комбинации; можно сразу выбрать одинаковые маски из A и B как подходящие, можно сразу выбрать случаи когда одна маска покрывает другую и т.д. вместо посимвольного сравнения можно перейти к самой сути вашей задачи http://stackoverflow.com/questions/2966865/intersection-of-two-regular-expressions , но боюсь, что будет еще медленнее. и проверьте где у вас медленное звено |
||
18 июл 14, 14:54 [16325498] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Думаю, что на несколько порядков при том же посимвольном алгоритме (не знаю реализации). Вам же требуется 10^16 - 10^8 сравнений... |
||
18 июл 14, 15:50 [16325941] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |