Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
Добрый день.

Встала задача проверить записи в двух таблицах на частичное совпадение по полю B.
написал запрос:
SELECT t1.A, t2.B, t1.B, t1.C   
FROM    t1 INNER JOIN
              t2 ON t1.B LIKE '%'+t2.B+'%'
ORDER BY t2.D

Можно ли как-то по другому сделать или оптимизировать? в одной таблице примерно 1500 записей в другой 30000, запрос выполняется 4 минуты.
20 ноя 13, 12:32    [15160644]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
sdet
Member

Откуда:
Сообщений: 463
vrtlpilot,
Full-text search
20 ноя 13, 12:45    [15160782]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
sdet,

спасибо за напутствие.
я задумывался об этом варианте, но, лично для меня плохо то, что нужно дополнительно строить полнотекстовый индекс.
подразумевается, что данный запрос, будет выполнятся всего лишь пару раз в неделю, и держать для этого индекс я считаю неразумным. ИМХО проще заставить пользователя подождать пять минут.
20 ноя 13, 14:34    [15161829]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Glory
Member

Откуда:
Сообщений: 104751
vrtlpilot
я задумывался об этом варианте, но, лично для меня плохо то, что нужно дополнительно строить полнотекстовый индекс.

fts не ищет по вхождению в строку. Только по началу
20 ноя 13, 14:36    [15161846]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
sdet
Member

Откуда:
Сообщений: 463
vrtlpilot,

Подумайте также нужен ли like '%'+t2.B+'%' или можно обойтись без % в начале
20 ноя 13, 14:42    [15161920]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
sdet
vrtlpilot,
Full-text search

раньше тоже так считал, но нет, не покатит : )
20 ноя 13, 14:43    [15161932]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
sdet
Member

Откуда:
Сообщений: 463
Александр52
sdet
vrtlpilot,
Full-text search

раньше тоже так считал, но нет, не покатит : )

Аргументы?
20 ноя 13, 14:46    [15161972]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
sdet
Александр52
пропущено...

раньше тоже так считал, но нет, не покатит : )

Аргументы?

ну попробуйте сами)

http://technet.microsoft.com/ru-ru/library/ms142571.aspx#queries
После добавления столбцов в полнотекстовый индекс, приложения и пользователи смогут выполнять полнотекстовые запросы к тексту из столбцов. Эти запросы могут вести поиск любых приведенных ниже элементов.
• Одно или несколько конкретных слов или фраз (простое выражение).
• Слова, начинающиеся заданным текстом, или фразы с такими словами (префиксные выражения).
• Словоформы конкретного слова (производное выражение).
• Слова или фразы, находящиеся рядом с другими словами или фразами (выражения с учетом расположения).
• Синонимические формы конкретного слова (тезаурус).
• Слова или фразы со взвешенными значениями (взвешенное выражение)

Слово "трос" не является префиксом для "матрос" и "отросток", а также не является их словоформой или синонимом. Поэтому "матрос" и "отросток" не могут быть найдены по "трос" в случае полнотекстового поиска.
20 ноя 13, 14:51    [15162029]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
Александр52
sdet
пропущено...

Аргументы?

ну попробуйте сами)

http://technet.microsoft.com/ru-ru/library/ms142571.aspx#queries
После добавления столбцов в полнотекстовый индекс, приложения и пользователи смогут выполнять полнотекстовые запросы к тексту из столбцов. Эти запросы могут вести поиск любых приведенных ниже элементов.
• Одно или несколько конкретных слов или фраз (простое выражение).
• Слова, начинающиеся заданным текстом, или фразы с такими словами (префиксные выражения).
• Словоформы конкретного слова (производное выражение).
• Слова или фразы, находящиеся рядом с другими словами или фразами (выражения с учетом расположения).
• Синонимические формы конкретного слова (тезаурус).
• Слова или фразы со взвешенными значениями (взвешенное выражение)

Слово "трос" не является префиксом для "матрос" и "отросток", а также не является их словоформой или синонимом. Поэтому "матрос" и "отросток" не могут быть найдены по "трос" в случае полнотекстового поиска.

да и спасибо пользователю Гость333, он в свое время это разъяснил.
20 ноя 13, 14:53    [15162052]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
sdet,
sdet
vrtlpilot,
Подумайте также нужен ли like '%'+t2.B+'%' или можно обойтись без % в начале


к сожалению, нужен и начальный и конечный
20 ноя 13, 15:15    [15162323]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
sdet
Member

Откуда:
Сообщений: 463
Александр52
sdet
пропущено...

Аргументы?

ну попробуйте сами)

http://technet.microsoft.com/ru-ru/library/ms142571.aspx#queries
После добавления столбцов в полнотекстовый индекс, приложения и пользователи смогут выполнять полнотекстовые запросы к тексту из столбцов. Эти запросы могут вести поиск любых приведенных ниже элементов.
• Одно или несколько конкретных слов или фраз (простое выражение).
• Слова, начинающиеся заданным текстом, или фразы с такими словами (префиксные выражения).
• Словоформы конкретного слова (производное выражение).
• Слова или фразы, находящиеся рядом с другими словами или фразами (выражения с учетом расположения).
• Синонимические формы конкретного слова (тезаурус).
• Слова или фразы со взвешенными значениями (взвешенное выражение)

Слово "трос" не является префиксом для "матрос" и "отросток", а также не является их словоформой или синонимом. Поэтому "матрос" и "отросток" не могут быть найдены по "трос" в случае полнотекстового поиска.

Да в fts есть некоторые ограничения по сравнению с like, но это не означает, что автору в конкретном случае они нужны, а вот скорость по сравнению с like может быть значительно улучшена, поэтому был дан fts на рассмотрение
20 ноя 13, 15:16    [15162330]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
[quot sdet]
Александр52
пропущено...

Да в fts есть некоторые ограничения по сравнению с like, но это не означает, что автору в конкретном случае они нужны, а вот скорость по сравнению с like может быть значительно улучшена, поэтому был дан fts на рассмотрение


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

ИП Кузнецов С.А.
ПБОЮЛ Кузнецов И.П.
ООО Кузнецов и Ко

производится импорт, и программа должна максимально облегчить пользователю поиск возможных двойников для
загружаемых записей. а там например загружается

АстраСервис
Иванов С.А.
Кузнецов П.В.

Как то так.
20 ноя 13, 15:28    [15162472]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
vrtlpilot
Добрый день.
SELECT t1.A, t2.B, t1.B, t1.C   
FROM    t1 INNER JOIN
              t2 ON t1.B LIKE '%'+t2.B+'%'
ORDER BY t2.D

в одной таблице примерно 1500 записей в другой 30000, запрос выполняется 4 минуты.

отвечаю сам себе. может кому-то пригодится.
Если написать ХП в которой все будет вызываться в цикле по 500 записей например, то (на том же объеме) в итоге экономия в две минуты. А если вместо join использовать пользовательскую функцию которая возвращает результат, попадает запись в LIKE или нет, то на том же объеме время выполнения вырастает в три раза. %)
Может у кого-нибудь есть еще варианты кроме FTS? Задача то тривиальная. наверняка я просто чего-то не знаю/неправильно делаю.
21 ноя 13, 14:44    [15168557]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Glory
Member

Откуда:
Сообщений: 104751
vrtlpilot
Если написать ХП в которой все будет вызываться в цикле по 500 записей например, то (на том же объеме) в итоге экономия в две минуты. А если вместо join использовать пользовательскую функцию которая возвращает результат, попадает запись в LIKE или нет, то на том же объеме время выполнения вырастает в три раза. %)

И можно увидеть этот чудо-код ?
21 ноя 13, 14:49    [15168606]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
Glory,

какой именно?
21 ноя 13, 14:57    [15168691]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Glory
Member

Откуда:
Сообщений: 104751
vrtlpilot
Glory,

какой именно?

Да оба, что "в цикле по 500 записей", что "пользовательскую функцию которая возвращает результат, попадает запись в LIKE или нет"
21 ноя 13, 14:57    [15168698]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
Glory,
с функцией так:
CREATE FUNCTION [dbo].[uf_OrgForImport_CheckByName] (@Imported_NameOrg varchar(150))
RETURNS bit AS
BEGIN

DECLARE @R bit
SET @R = 0

IF EXISTS (SELECT KODORG FROM Org WHERE Org.NamOrg LIKE '%'+@Imported_NameOrg+'%')
	SET @R = 1

RETURN @R
END

......

SELECT ID FROM OrgForImport WHERE dbo.uf_OrgForImport_CheckByName(ORgForImport.NamOrg) = 1

а с процедурой, каюсь, погорячился. Еще не реализована. Но если в консоли вызвать десять раз подряд
SELECT t1.A, t2.B, t1.B, t1.C   
FROM    t1 INNER JOIN
              t2 ON t1.B LIKE '%'+t2.B+'%'
WHERE t1.A BETWEEN 1 AND 500
ORDER BY t2.D
GO
SELECT t1.A, t2.B, t1.B, t1.C   
FROM    t1 INNER JOIN
              t2 ON t1.B LIKE '%'+t2.B+'%'
WHERE t1.A BETWEEN 501 AND 1000
ORDER BY t2.D

и т.д.

то скорость растет
21 ноя 13, 15:23    [15168937]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Glory
Member

Откуда:
Сообщений: 104751
vrtlpilot
то скорость растет

Вы планы своих запросов сравнивали ?
21 ноя 13, 15:26    [15168964]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
Glory
vrtlpilot
то скорость растет

Вы планы своих запросов сравнивали ?

Конечно. Но что именно там нужно сравнивать?
В случае с функцией это один простой запрос, в другом почти такой же, только подключается буферизация на 2,5 млн записей.
21 ноя 13, 15:33    [15169020]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Glory
Member

Откуда:
Сообщений: 104751
vrtlpilot
Конечно.

vrtlpilot
Но что именно там нужно сравнивать?

- Петька, приборы !
- 200

vrtlpilot
В случае с функцией это один простой запрос, в другом почти такой же, только подключается буферизация на 2,5 млн записей.

" в одной таблице примерно 1500 записей в другой 30000" - это отсюда миллионы выросли ?
21 ноя 13, 15:35    [15169043]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
Glory,

Именно
21 ноя 13, 15:42    [15169105]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
vrtlpilot,

ON t1.B LIKE '%'+t2.B+'%'

-- не советую.

Так --

ON t1.B LIKE t2.B+'%'

ещё можно, с индексом на t1.B,
а как у тебя -- будет полное декартово произведение таблиц обрабатываться.
21 ноя 13, 16:27    [15169535]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
vrtlpilot
Member

Откуда:
Сообщений: 29
MasterZiv
vrtlpilot,

ON t1.B LIKE '%'+t2.B+'%'

-- не советую.

Так --

ON t1.B LIKE t2.B+'%'

ещё можно, с индексом на t1.B,
а как у тебя -- будет полное декартово произведение таблиц обрабатываться.


Я все это понимаю. Будь моя воля, я вообще LIKE бы не использовал. Но у нас все для пользователей, а они хотят, чтобы за них компьютер работал и работал быстро. вот и приходится изобретать велосипед с квадратными колесами.
21 ноя 13, 16:37    [15169604]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
[quot vrtlpilot]
sdet
пропущено...


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

ИП Кузнецов С.А.
ПБОЮЛ Кузнецов И.П.
ООО Кузнецов и Ко

производится импорт, и программа должна максимально облегчить пользователю поиск возможных двойников для
загружаемых записей. а там например загружается

АстраСервис
Иванов С.А.
Кузнецов П.В.

Как то так.

только если заранее разбить это поле на несколько, если это возможно - примерно как 'ИП' и 'Кузнецов С.А.'
21 ноя 13, 19:45    [15170539]     Ответить | Цитировать Сообщить модератору
 Re: INNER JOIN по LIKE  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
vrtlpilot
MasterZiv
vrtlpilot,

ON t1.B LIKE '%'+t2.B+'%'

-- не советую.

Так --

ON t1.B LIKE t2.B+'%'

ещё можно, с индексом на t1.B,
а как у тебя -- будет полное декартово произведение таблиц обрабатываться.


Я все это понимаю. Будь моя воля, я вообще LIKE бы не использовал. Но у нас все для пользователей, а они хотят, чтобы за них компьютер работал и работал быстро. вот и приходится изобретать велосипед с квадратными колесами.
Ну, сделайте как вот тут DeColo®es предлагал:
Что делать, когда Full-Text бессилен или зарисовки на тему LIKE '%искомое%'
21 ноя 13, 20:08    [15170600]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить