Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

Помогите оптимизировать SQL- запросик   Найти похожие ветки 

 
Max Zyuzin ©   (2005-08-25 16:31) [0]

Есть такая задача...
В наличие имеется объемная таблица №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-25 16:53) [1]

"...:ShpReqId"+inttostr(i) +...и т.д. - ? нельзя значение i засовывать в значение параметра и потом использовать этот параметр как положено?


 
Max Zyuzin ©   (2005-08-25 17:17) [2]

>Val ©   (25.08.05 16:53) [1]
Дело в том что ShpReqId"+inttostr(i) вот так вот делается что бы в запросе получисись параметры типа ShpReqId0, ShpReqId1, ShpReqId2... в общем то оно фактически и засовывается в параметр, только для того и предназначено что бы параметры были с номерами...

PS. Земляка с недавно прошедшим праздником!!!


 
Val ©   (2005-08-25 18:09) [3]

Дело в том..
сорри, торможу.
Честно говоря, похоже, я не врулил в объяснение проблемы - нельзя ли структуры таблиц и, на примере, процесс работы - как происходит фильтрация?
Почему требуется бегать по второй таблице, если пользователь выбирает все необходимые маски и их достаточно поставить в условие выборки из первой таблицы, как параметры?
PS. Спасибо, но Харьков не Ярославль ;)


 
Max Zyuzin ©   (2005-08-26 08:46) [4]

>Val ©   (25.08.05 18:09) [3]
В общем я тут подумал и решил все переделать решил выкинуть из запроса вообще таблицу в которой маски живут для первой, запрос стал иметь следующий вид

select * from Table1
where dDate between :fd and :td and (
(
......
) or
(
......
)
)
В местах где ..... в цыкле в зависимости от того есть ли в маске что добавляю условия типа Field1 = :field1 and ... в общем все теперь зависит от того на сколько этот самый фильтр заполнен, в результате стало все выполнятся в разы быстрее... вот.

PS. Я родился и вырос в Харькове... 15 лет там прожил.


 
evvcom ©   (2005-08-26 09:32) [5]

Используя MSSQL никак не можешь отвыкнуть от динамического формирования запроса на клиенте? На MSSQL вообще-то есть хранимые процедуры. Да и запрос без Query.SQL.Add воспринимается гораздо лучше.


 
Val ©   (2005-08-26 11:43) [6]

>[4] Max Zyuzin ©   (26.08.05 08:46)
Угу, так получше. А or там точно нужен, из-за чего он появляется в запросе?
>[5] evvcom ©   (26.08.05 09:32)
Не факт, что хп всегда заменяют динамический запрос. Есть смысл и в том и в другом.


 
Max Zyuzin ©   (2005-08-26 12:39) [7]

>Val ©   (26.08.05 11:43) [6]
OR появляется потому что фильтров может быть много после каждого набора условий из одного фильтра идет OR и дальше условия следуещего...

>evvcom ©   (26.08.05 09:32) [5]
Пытаюсь отучится... :(


 
Val ©   (2005-08-26 12:47) [8]

Если несколько фильтров, почему or, а не and? Судя по тому, что or в запросе статичен, не пользователь выбирает or это или and...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.015 c
2-1124860710
Sergo
2005-08-24 09:18
2005.10.09
Пользователь


3-1125307147
Rob
2005-08-29 13:19
2005.10.09
Проблема с переносом скрипта из QA в редактор TQuery


4-1123652186
pepper
2005-08-10 09:36
2005.10.09
Отключение сетевыеx дисков


2-1125496160
Гость22
2005-08-31 17:49
2005.10.09
Как проверить, доступна ли сетевая папка?


4-1123613446
Vitaly123
2005-08-09 22:50
2005.10.09
RS-485





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский