Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Оптимизация запроса по поиску подстроки (число прочтений - 11011 )
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Оптимизация запроса по поиску подстроки
21. Августа 2006 :: 09:01
Печать  
Сразу извиняюсь, если не по теме форума - у меня не проблема с запросом, как таковым - у меня желание оптимизировать оный всеми возможными способами.

Итак, стандартная и в общем-то вполне конкретная, задача:
1) Есть таблица с полем Descr (пусть будет справочник "Номенклатура", хотя она моя собственная, не из конфы)
2) Необходимо осуществить выборку элементов по подстроке (like '%' + КусокНаименования + '%')

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

Мой ламерский вариант:
Код
Выбрать все
	ДлинаРеквизитаОтбора = Метаданные.Справочник("Номенклатура").ДлинаНаименования;

	//--- создание таблицы
	ТекстЗапроса = "
		|set nocount on
		|IF EXISTS (SELECT *
		|	   FROM   sysobjects
		|	   WHERE  name = 'MyTable')
		|	DROP TABLE MyTable
		|
		|create table MyTable (ROW_ID int, ID char(9), Descr char(" + ДлинаРеквизитаОтбора + "), StrID int IDENTITY (1, 1) NOT NULL )
		|
		|-- по рекомендации SQL-сервера, создадим индекс
		|CREATE NONCLUSTERED INDEX [MyTable_Descr] ON MyTable ([Descr] ASC)
		|
		|INSERT INTO MyTable (ROW_ID,ID,Descr)
		|SELECT Спр.ROW_ID, Спр.ID, Спр.Code + $Спр.Артикул + Спр.Descr
		|FROM $Справочник.Номенклатура AS Спр (NOLOCK)
		|WHERE (Спр.IsFolder = 2)
		|ORDER BY Спр.Descr
		|set nocount off
		|";

	//--- Подготовка параметризированного запроса
	RS = СоздатьОбъект("ODBCRecordSet");
	RS.Подготовить("
	|Set NoCount ON
	|DECLARE @SubStr varchar(" + ДлинаРеквизитаОтбора + ")
	|SET @SubStr = RTrim(?)
	|SELECT
	|	Descr
	|FROM MyTable (NoLock)
	|WHERE	(Descr like '%' + @SubStr + '%')
	|");
	RS.ДобПараметр(1, 14, ДлинаРеквизитаОтбора, 0);

	//--- Получение выборки
	RS.УстПараметр(1,ВыбСтрока);
	ТЗ = RS.ВыполнитьИнструкцию();
	ТЗ.ВыбратьСтроку();
 


буду очень признателен за любое участие!  Улыбка, тем более, что вопрос часто насущный

кстати эта тема коррелирует с, только что выложенным ADirks'ом, классом "Общие_ПолеВыбораЗначения", в котором реализована фильтрация по первым символам, что очень шустро, а если расширить этот функционал с нужным мне, то получаются тормоза... Смущённый
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #1 - 21. Августа 2006 :: 09:24
Печать  
Ты уверен что '%' в начале подстроки поиска нужен.
Если да, то индекс не сработает и будут тормоза
Обычно ищут по первый символам, а в этом случае % нужен только в конце
  

1&&2&&3
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #2 - 21. Августа 2006 :: 09:30
Печать  
согласен, что "обычно" ищут по первым символам, это правильно, но так уж завелось у нас и это не лечится, что номенклатуры наплодили под 30 тыс. штук и есть там:
Вентилятор центробежный RFE 146 DKU
и
Центробежный вентилятор RFE 146 DKU
и даже совсем без пробелов
Центр.вентилятор RFE 146 DKU

и такой дребедени много, при поиске по первым символам после первого неудачного поиска пыл остывает и появляется очередной дубль
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #3 - 21. Августа 2006 :: 09:33
Печать  
совет исправить все (т.е. перелопатить справочник и вынести ключевые слова вперед) - не поможет - тут работы на полгода, да и бесполезная она окажется - постоянно изменяется номенклатура - я жить хочу... Плачущий
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #4 - 21. Августа 2006 :: 09:35
Печать  
Полнотекстовый поиск (Full-Text Indexes), рекомендую ознакомиться в BOL.
  
Наверх
ICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #5 - 21. Августа 2006 :: 09:38
Печать  
а при таком кол-ве номенклатуры товар принимается и отпускается вручную? терминалы сбора данных не используете? может стоить посмотреть в эту сторону? тогда у номеклатуры появится уникальное поле под названием код или штрихкод...
вот по нему и начнешь работать с позициями, тут и кластеризованный индекс можно будет применять мне кажется и к наименованию не нужно будет привязыаться вообще...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #6 - 21. Августа 2006 :: 09:40
Печать  
Центробежные вентиляторы по терминалу сбора данных Улыбка
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #7 - 21. Августа 2006 :: 09:52
Печать  
Arta писал(а) 21. Августа 2006 :: 09:40:
Центробежные вентиляторы по терминалу сбора данных Улыбка

да, а что в этом такго эдакого?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #8 - 21. Августа 2006 :: 09:54
Печать  
Цитата:
а при таком кол-ве номенклатуры товар принимается и отпускается вручную? терминалы сбора данных не используете? может стоить посмотреть в эту сторону? тогда у номеклатуры появится уникальное поле под названием код или штрихкод...
вот по нему и начнешь работать с позициями, тут и кластеризованный индекс можно будет применять мне кажется и к наименованию не нужно будет привязыаться вообще...


у нас оптовая торговля и сканеров штрих кодов не используется, а равно подобных устройств

На самом деле наша беда, как это обычно бывает - в лени, в нежелании операторов хоть как-то думать, они давно превратились в печатающие устройства - им говорят "как-то так", они "как-то так" ищут, а потом - даже если они нашли что-то "похожее" - опять проблема - надо принять решение, что это "именно то что нужно, а не что-то другое"... Могу много говорить на эту тему, потому остановлюсь.

И еще - зачастую мы продаем воздух, как это ни странно - т.е. то, чего у нас в наличии нет (и скорее всего не будет именно в таком виде), получается схема:
1) Мы выставляем счет покупателю на Центробежный вентилятор малошумный...
2) У поставщика заказали Вентилятор центробежный Ду..., правый
3) Поставщик нам привез (по документам) Вентилятор центр. правый, Ду., Тд..., Тп... и плюс к нему виброизолятор ... и ведро с гайками
4) Все это комплектуется (хотя на самом деле гайки привинчены, виброизолятор уже стоит) и отгружается

и пример с вентилятором - не самый сложный в понимании
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #9 - 21. Августа 2006 :: 10:12
Печать  
DmitrO писал(а) 21. Августа 2006 :: 09:35:
Полнотекстовый поиск (Full-Text Indexes), рекомендую ознакомиться в BOL.

Спасибо!

Начал искать и вот что нашел в BOL:
Цитата:
To enable a table for full-text indexing

1. Expand the server group, expand Databases, expand User Databases, and expand the database that contains the table you want to enable for full-text indexing.

2. Right-click the table that you want to enable for full-text indexing.

3. Select Full-Text index, and then click Enable Full-Text indexing.

пытаюсь проделать это со своей табличкой, а он мне пишет:
Цитата:
The selected table has no
unique single column index on a column that does not allow NULLS.

Database:   Market_test

Table:   [dbo].[MyTable]

у всех полей поставил признак "NOT NULL" - не помогает...
где бы почитать что-нибудь поподробнее и желательно по-русски?.. Круглые глаза
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #10 - 21. Августа 2006 :: 10:21
Печать  
Он хочет уникальный индекс по одному полю.

Прочитать по русски можно здесь.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #11 - 21. Августа 2006 :: 10:25
Печать  
berezdetsky писал(а) 21. Августа 2006 :: 10:21:
Он хочет уникальный индекс по одному полю.

Прочитать по русски можно здесь.

спасибо конечно, но можно как-нибудь не качая 120 Мб?.. Смущённый
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #12 - 21. Августа 2006 :: 10:25
Печать  
berezdetsky писал(а) 21. Августа 2006 :: 10:21:
Он хочет уникальный индекс по одному полю.

Прочитать по русски можно здесь.

это на 2005?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #13 - 21. Августа 2006 :: 10:27
Печать  
Цитата:
berezdetsky писал(а) 21. Августа 2006 :: 10:21:
Он хочет уникальный индекс по одному полю.

Прочитать по русски можно здесь.

это на 2005?


и это тоже верно - мне на MS SQL 2000 надо бы, впрочем возможно это аналогичная документация...
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса по поиску подстроки
Ответ #14 - 21. Августа 2006 :: 10:36
Печать  
Цитата:
и это тоже верно - мне на MS SQL 2000 надо бы, впрочем возможно это аналогичная документация...

Возможно, я ошибаюсь, но, на сколько я помню, нормальный полнотекстовый поиск с учётом русских словоформ сделали только в SQL Server 2005 SP1.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать