none
Stored Procedure + View RRS feed

  • Pergunta

  •  

    Vamos ao problema...

    Tenho um banco de dados em que a tabela Usuários possue 10 campos e em torno de 50 milhoes de registros.

    Tenho que fazer diversas pesquisas nessa tabela:

     

    Ex: where Cidade= xxxx

    Ex: where Estado = yyy

    Ex: where Idade>20 and Idade <30

     

    Quando executo um Select simples, o servidor processa essa informação (+-30 segundos)

    e as outras estação não conseguem executar qualquer outras sql, pois o processo do select esta executando. Isso traz diversos problemas.

     

    Uma solução que fiz foi, criar um Stored Procedure, na qual passo por paramentro a seleção da tabela que quero. Esta SP altera um View e depois que processo a SP, executo a View.

     

    O processo de execução da SP é extremamente rápido <0.05s , mas a execução da view demora mais de 60 segundos. Apesar de demorar mais que o Select, as outras consultas e processos executados no banco continuam a serem executados como se não tivessem sendo feito(claro que o servidor fica mais lento, mas não trava as demais estações).

     

    Resumindo: Porque a execução de uma view é feita em "etapas" enquanto a Select é executada de uma só vez sem a possibilidade de outras execuções em paralelo?

     

    Alguma outra solução?

    quarta-feira, 25 de junho de 2008 19:12

Todas as Respostas

  • Malcon,

     

    Mas esta view, esta fazendo a união dos dados entre as tables?

     

    Você esta utilizando Joins?

    quarta-feira, 25 de junho de 2008 19:50
  • Não, view simple. Vou te passar a SP que cria a view:

    GO

    /****** Object: StoredProcedure [dbo].[ModREL114] Script Date: 06/25/2008 17:20:20 ******/

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

     

    ALTER PROCEDURE [dbo].[ModREL114]

    @Selecao as varchar(1000)

    AS

    Declare @Padrao as varchar(1000)

    BEGIN

    If @Selecao <> ''

    begin

    set @Padrao = 'ALTER VIEW dbo.Vw_REL114 AS SELECT TOP (100) PERCENT Cliente, DATA, Sequencia, EVENTO, DESCRIÇÃO, ZONA, ATENDIMENTO

    FROM Eventos WHERE ' + @Selecao

    end

    else

    begin

    set @Padrao = 'ALTER VIEW dbo.Vw_REL114 AS SELECT TOP (100) PERCENT Cliente, DATA, Sequencia, EVENTO, DESCRIÇÃO, ZONA, ATENDIMENTO

    FROM Eventos ORDER By Cliente, Data, Sequencia'

    end

    END

    exec (@Padrao)

    RETURN

    quarta-feira, 25 de junho de 2008 20:17
  • Boa Tarde,

     

    Isso me parece um problema relacionado ao nível de isolamento (possivelmente uma consulta trava os demais acessos). Tente fazer o seguinte:

     

    Code Snippet

    SELECT Cliente, DATA, Sequencia, EVENTO, DESCRIÇÃO, ZONA, ATENDIMENTO

    FROM Eventos WITH (NOLOCK)

     

    Essa alteração é apenas em nível de testes e ainda não é a solução definitiva. Verifique se com ela as demais estações conseguem executar outros SELECTs.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 25 de junho de 2008 21:20