none
Problema com velocidade usando a função iif RRS feed

  • Pergunta

  • Olá, a pergunta é grande, pois tentei especificar bem, porém vc pode rolar pra baixo que tem um resumo bem resumido para que vcs deem um primeira olhada (se ja souber como ajudar nem precisa ler o resto e posta =D).

    La perguncha.

    Olhem só, eu fiz um relatório que traz 21 campos, sendo 9 deles relacionados a endereço.

    O relatório funciona assim:

    tem um campo chamado fatFamilia, quando ele é diferente de 0 é pq a fatura esta para algum segurado, então eu devo colocar o endereço do segurado, quando fatFamilia é igual a 0 então eu devo buscar o endereço da empresa.

    A minha procedure retorna 30 campos, 12 que são iguais pra todos e 18 divididos em 2, 9 para endereço da empresa e 9 para endereço do segurado.

    Meu relatório é mais ou menos assim :

    ___________________________________________________________
    Registro : ..............................Referencia :...........................Contrato :
    Vencimento :..........................Pagamento :..........................Valor :
    Tipo :.....................................Parcela :................................Fatura :
    Empresa :...........................................................................
    Segurado :..........................................................................Família :

    Endereço :..........................................................................Cep :
    Complemento :........................Bairro :..................................
    Cidade :..................................UF :......................................
    Tel. Res. :...............................Tel. Com. :............................Celular :
    ___________________________________________________________

    Eu criei uma Stored Procedure para fazer a seleção pra mim...
    Ela é complexa e traz os resultados no tempo de 3 a 10 segundos.
    Porém eu criei outra SP com um select mais simples :

    select * from FATURAS
    left join ENDERECOS_SEGURADOS on fatmatricula = endMatri
    left join EMPRESAS on fatCodEmpresa = empCodigo

    Ela retorna em um tempo de 2 a 6 segundos.
    O resultado final foi o mesmo (explicarei mais adiante)

    A parte de cima é sempre igual, mas a parte de baixo muda.

    Conforme eu falei acima, essa parte debaixo muda conforme o campo fatFamilia (se for = 0 mostra endereço da empresa, senão mostra endereço do segurado)

    Ai esta o problema, eu fiz isso usando IIF só que quando eu uso isso o tempo de processamento do relatório sobe ABSURDAMENTE (fica mais de 30 minutos processando pra mais)

    ....

    A expressão nos campos de endereços ficou assim :

    =iif(Fields!fatFamilia.Value=0,Fields!empEndereco.Value,Fields!endEndereco.Value)
    =iif(Fields!fatFamilia.Value=0,Fields!empComplemento.Value,Fields!endComplemento.Value)
    ...
    É mesma coisa para todos os campos de endereço.
    Como vcs podem perceber emp é relacionado a tabela EMPRESAS e end a ENDERECOS_SEGURADOS


    ---------------------

    Resumo :

    Pq quando uso a expressão :

    =iif(Fields!X.Value=0,Fields!Y.Value,Fields!Z.Value) o tempo do meu relatório sobe absurdamente?
    PS: X é um campo int.



    sexta-feira, 1 de fevereiro de 2008 14:29

Respostas

  • Consegui....

    Resolvi na storedprocedure mesmo

    fiz alguns cases nos campos que retornam no select da SP.

    tipo assim:
            CASE WHEN F.fatFamilia = 0 THEN E.empEndereco ELSE D.endEndereco END AS Endereco,
            CASE WHEN F.fatFamilia = 0 THEN E.empComplemento ELSE D.endComplemento END AS Complemento,
            CASE WHEN F.fatFamilia = 0 THEN E.empBairro ELSE D.endBairro END AS Bairro,
    ... e etc...

    Resolveu, lá no report eu só coloco =Fields!Endereco e a própria procedure pega o endereço do segurado ou da empresa =D

    Ficou bom.

    Vlw aew Júnior pelo esclarecimento, coloquei seu post como útil pois me fez desistir de resolver no report e tentar ir pela SP mesmo.
    terça-feira, 12 de fevereiro de 2008 12:21

Todas as Respostas

  • R3N4N,

     

    O uso da função IIF por parte do Reporting Services é extremamente lento por se tratar de uma função condicional, que deve executar uma análise a cada linha gerada pelo relatório.

     

    Principalmente se você estiver fazendo uma análise condicional em um campo.

    sexta-feira, 1 de fevereiro de 2008 17:30
  • Consegui....

    Resolvi na storedprocedure mesmo

    fiz alguns cases nos campos que retornam no select da SP.

    tipo assim:
            CASE WHEN F.fatFamilia = 0 THEN E.empEndereco ELSE D.endEndereco END AS Endereco,
            CASE WHEN F.fatFamilia = 0 THEN E.empComplemento ELSE D.endComplemento END AS Complemento,
            CASE WHEN F.fatFamilia = 0 THEN E.empBairro ELSE D.endBairro END AS Bairro,
    ... e etc...

    Resolveu, lá no report eu só coloco =Fields!Endereco e a própria procedure pega o endereço do segurado ou da empresa =D

    Ficou bom.

    Vlw aew Júnior pelo esclarecimento, coloquei seu post como útil pois me fez desistir de resolver no report e tentar ir pela SP mesmo.
    terça-feira, 12 de fevereiro de 2008 12:21
  • R3N4N,

     

    Obrigado, realmente o uso do Case é muito mais prático, rápido e simples.

    terça-feira, 12 de fevereiro de 2008 15:47