Тема: FIND('=><')
Показать сообщение отдельно
Старый 29.12.2004, 18:07   #15  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Спасибо, коллега tyrex, что не забросили тему, надеюсь с вашей помощью всё таки довести до аудитории суть своих рекомендаций.
Во-первых вспомним, что речь шла о проверке набора данных на наличие в нем записей... Вопрос: а зачем это вообще делать? - вопрос открытый.
На мой взгляд - для того, чтобы принять решение о продолжении обработки этого набора данных. А почему бы сразу не открыть для этого курсор, как обычно
IF FIND('-') THEN REPEAT
...
UNTIL NEXT=0;
если вероятность того, что записей не окажется, маленькая (что обычно бывает) - то дополнительной проверки на пустоту не нужно делать, поскольку всё равно для заполнения табличной переменной реальными значениями FIND придется вызвать. А вот если вероятность от FIND('-') получить FALSE достаточно велика - дополнительная проверка становится осмысленной.
Для того, чтобы получить описанный мной эффект надо построить подходящий SQL индекс, в который бы входили все поля, участвующие в фильтре. Конечно, важно чтобы этот индекс был достаточно селективным. Так вот, для того чтобы обработать запрос <SELECT COUNT(*) FROM MyTable WHERE "Key"=@P1> серверу в этом случае не придется обращаться к данным в таблице, и выигрыш во времени получится существенным.
В моем опыте конструкция
IF COUNT <> 0 THEN BEGIN
FIND('-');
REPEAT
...
UNTIL NEXT=0;
END;
привела к ускорению соответствующего процесса в разы.
Замечу для точности что сам этот кусок кода находился в цикле обработки другого, основного набора данных, на основании которого определялись значения фильров.
Получив такой результат, я прошелся по тем местам кода, где вспомнилась именно проверка "на пустоту", когда потребности в самих данных нет. Во всех случаях замена на COUNT привела к ускорению процессов.
Именно это и позволило мне выдать такие рекомендации.