|
![]() |
#1 |
Участник
|
Спасибо, коллега 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 привела к ускорению процессов. Именно это и позволило мне выдать такие рекомендации. |
|