![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите оптимизировать SQL- запросик [D7, MSSQL]
Max Zyuzin © (2005-08-25 16:31:00)Есть такая задача...
В наличие имеется объемная таблица №1 с 2-мя десятками полей.
Есть отдельная табличка №2, пусть будет называться фильтры в ней 5 полей часто используемых в табличке №1, в общем по маскам из этой таблички должны фильтроваться записи в основной таблице...
т.е. юзверь забивает один или несоклько таких вот фильтров в формочку, потом нажимает кнопочку и ему высвечивают основную таблицу, к которой применены вот эти самые фильтры. Вот как бы это лучше реализовать? Сейчас я доизвращался вот примерно до такого...
Динамичеси формирую запрос начало что то вроде
select * from Table1View, Table2View
where dDate between :fd and :td
.. а далее к запросу приплюсовываются вот таки блоки в цикле по "фильтрам" этим
ShpReqShpQuery.SQL.Add('( SRFV.srfRequestNumber = :ShpReqId'+inttostr(i) + ' and SRFV.srfRequestDate = :ShpReqDate'+inttostr(i));
ShpReqShpQuery.SQL.Add(' and sDispatchStation = coalesce(SRFV.srfDispStation,sDispatchStation) ');
ShpReqShpQuery.SQL.Add(' and sDestinationStation = coalesce(SRFV.srfDestStation,sDestinationStation)');
ShpReqShpQuery.SQL.Add(' and sFreightETSNG = coalesce(SRFV.srfFreight,sFreightETSNG)');
ShpReqShpQuery.SQL.Add(' and CarType = coalesce( (select ctName from CarType where ctCode = SRFV.srfCarType), CarType )');
ShpReqShpQuery.SQL.Add(' and FreightSenderName = coalesce( (select fsName from FreightSender where fsCode = SRFV.srfFreightSender), FreightSenderName)');
ShpReqShpQuery.SQL.Add(')');
Все это работает мягко говоря неторопливо, вот сел я это все безобразие оптимизировать, думаю что не зря ли я в запрос вообще внес табличку с фильтрами? Мож ее стоило ввобще только как параметры использовать прогулявшись по ней в цикле?
А для чего я вот такое безобразие пол года назад писал даже вспомнить не могу :(
and FreightSenderName = coalesce( (select fsName from FreightSender where fsCode = SRFV.srfFreightSender), FreightSenderName)Ух...
Val (2005-08-26 12:47:00) [1]Если несколько фильтров, почему or, а не and? Судя по тому, что or в запросе статичен, не пользователь выбирает or это или and...
Max Zyuzin (2005-08-26 12:39:00) [2]>Val © (26.08.05 11:43) [6]
OR появляется потому что фильтров может быть много после каждого набора условий из одного фильтра идет OR и дальше условия следуещего...
>evvcom © (26.08.05 09:32) [5]
Пытаюсь отучится... :(
Val (2005-08-26 11:43:00) [3]>[4] Max Zyuzin © (26.08.05 08:46)
Угу, так получше. А or там точно нужен, из-за чего он появляется в запросе?
>[5] evvcom © (26.08.05 09:32)
Не факт, что хп всегда заменяют динамический запрос. Есть смысл и в том и в другом.
evvcom (2005-08-26 09:32:00) [4]Используя MSSQL никак не можешь отвыкнуть от динамического формирования запроса на клиенте? На MSSQL вообще-то есть хранимые процедуры. Да и запрос без Query.SQL.Add воспринимается гораздо лучше.
Max Zyuzin (2005-08-26 08:46:00) [5]>Val © (25.08.05 18:09) [3]
В общем я тут подумал и решил все переделать решил выкинуть из запроса вообще таблицу в которой маски живут для первой, запрос стал иметь следующий вид
select * from Table1
where dDate between :fd and :td and (
(
......
) or
(
......
)
)
В местах где ..... в цыкле в зависимости от того есть ли в маске что добавляю условия типа Field1 = :field1 and ... в общем все теперь зависит от того на сколько этот самый фильтр заполнен, в результате стало все выполнятся в разы быстрее... вот.
PS. Я родился и вырос в Харькове... 15 лет там прожил.
Val (2005-08-25 18:09:00) [6]Дело в том..
сорри, торможу.
Честно говоря, похоже, я не врулил в объяснение проблемы - нельзя ли структуры таблиц и, на примере, процесс работы - как происходит фильтрация?
Почему требуется бегать по второй таблице, если пользователь выбирает все необходимые маски и их достаточно поставить в условие выборки из первой таблицы, как параметры?
PS. Спасибо, но Харьков не Ярославль ;)
Max Zyuzin (2005-08-25 17:17:00) [7]>Val © (25.08.05 16:53) [1]
Дело в том что ShpReqId'+inttostr(i) вот так вот делается что бы в запросе получисись параметры типа ShpReqId0, ShpReqId1, ShpReqId2... в общем то оно фактически и засовывается в параметр, только для того и предназначено что бы параметры были с номерами...
PS. Земляка с недавно прошедшим праздником!!!
Val (2005-08-25 16:53:00) [8]'...:ShpReqId'+inttostr(i) +...и т.д. - ? нельзя значение i засовывать в значение параметра и потом использовать этот параметр как положено?