Сразу извиняюсь, если не по теме форума - у меня не проблема с запросом, как таковым - у меня желание оптимизировать оный всеми возможными способами.
Итак, стандартная и в общем-то вполне конкретная, задача:
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'ом, классом "Общие_ПолеВыбораЗначения", в котором реализована фильтрация по первым символам, что очень шустро, а если расширить этот функционал с нужным мне, то получаются тормоза...