none
Lentidão no sistema devido a clausula WHERE da procedure RRS feed

  • Discussão Geral

  • Olá.

    Estou com o seguinte problema:

    Problema no sistema devido a alteração na clausula WHERE da procedure.

    O meu codigo SQL está funcionando corretamente(retornando os dados que eu preciso) e com um bom desempenho mas ao remover o cast da da data na clausula where :(CAST(A.[Data] AS DATE) =  @Start )  


     o sistema que faz uso dessa procedure fica muito lento mas ao executar a procedure no banco de dados ela ainda continua com o mesmo desempenho.      

    Com o cast na data o sistema continua a funcionar normalmente.


    Código abaixo:

    ALTER PROCEDURE [dbo].[Compromissos]
    @DiaryID INT = NULL, 
    @Start DateTime,
    @ID_Status varchar(6),
    @ID_Local varchar(6),
    @ID_Unidade INT = NULL
    AS
    SET NOCOUNT ON;
    BEGIN
           SELECT
                  A.[Compromisso] as 'AppointmentID'
                 ,A.[CódMédico] as 'DiaryID'
    ,D.[Nome] AS 'Diary'
                 ,(CAST(A.[Data] as datetime) + CONVERT(DATETIME, cast(A.[HI] as time))) as 'Start'
                 ,A.[HF] as 'End'
    ,A.[CódCliente] as 'PatientID'
                 ,A.[NomeCliente] AS 'PatientName'
    ,CASE 
    WHEN [Patient Tracking Status].[Status]='AGENDADO' 
       AND A.HorárioChegada IS NULL
       AND Data<cast(getdate() as date) THEN 'FALTOU'
    ELSE [Patient Tracking Status].[Status]
      END as 'Status'
      ,Locais.[Local] as [Local]
      ,CASE 
    WHEN ISNULL([Patient Tracking].[ID_Status],-1)=-1 
    AND A.HorárioChegada IS NULL 
    AND A.HorárioAtendimento IS NULL
    AND A.HorárioSaída IS NULL
    AND Data<cast(getdate() as date) THEN null 
    WHEN [Patient Tracking].[ID_Status]>0 THEN [Patient Tracking].[DataHoraStatus]
    ELSE A.DataHoraMarcação
       END AS 'DataHoraStatus'
      ,[Patient Tracking].Observação as StatusObs
      ,CASE
    WHEN [Patient Tracking Status].[Status] IN('AGENDADO','CHECK OUT','CHECK-OUT') OR [Patient Tracking].[DataHoraStatus] = NULL THEN NULL
    ELSE CAST((GETDATE() - [Patient Tracking].[DataHoraStatus]) AS DATETIME) 
       END AS 'TimeSinceLastStatus'

      ,A.[CódAtendente] as 'UserID'
      ,ISNULL(A.[NomeUsuário], U.[Nome]) AS 'UserName'
                  ,A.[CódConvênio] as 'HealthInsuranceCompanyID'
      ,H.[Empresa] AS 'HealthInsuranceName'
                  ,A.[ID_Plano] as 'HealthInsurancePlanID'
      ,A.[CódProc] as 'DiaryProcedureID'
      ,A.[Procedimento] AS 'DiaryProcedure'
                  ,A.[HorárioSaída] as 'DepartureTime'
                  ,A.[HorárioAtendimento] as 'ConsultationTime'
                  ,A.[HorárioChegada] as 'ArrivalTime'
                  ,A.[FlagEspera] as 'Waiting'
                  ,A.[FlagConflito] as 'AppointmentLayer'             
                  ,A.[DataHoraMarcação] as 'InclusionDate'
      ,A.[Confirmado] as 'Confirmed'
                  ,A.[DataConfirmação] as 'ConfirmationDate'
                  ,A.[UserConfirmação] as 'ConfirmationUserID'
      ,US.[Nome] AS 'ConfirmationUserName'
      ,A.[Observação] as 'Notes'
                  ,A.[ID_Protocolo] AS 'Protocol'
      ,A.[Indicação] as 'IndicationID'
      ,A.FlagEspera as 'Waiting'
      ,A.[FlagConflito] as 'AppointmentLayer'
      ,A.[TempoTotal] as 'AttendanceTime'
      ,A.[ID_SMS] AS 'SMSId'
      ,A.FlagEmergencia AS 'FlagEmergency'
      ,SM.[TextoMsgRecebida] AS 'SMSMessage'
      ,UN.ID as 'UnitID'
      ,UN.NomeUnidade AS 'Unit'
      ,CASE 
    WHEN ((FLOOR(DATEDIFF(DAY, A.DtNasc, GETDATE()) / 365.25)) <= 12) THEN 1
    ELSE 0
       END AS 'PatientIsChild'
      ,CASE 
    WHEN ((FLOOR(DATEDIFF(DAY, A.DtNasc, GETDATE()) / 365.25)) >= 65) THEN 1
    ELSE 0
       END AS 'PatientIsElderly'

      ,c.[FlagPF1] AS 'PatientIsPF1'
      ,c.[FlagPF2] AS 'PatientIsPF2'
      ,c.[FlagPF3] AS 'PatientIsPF3'
      ,c.[FlagPF4] AS 'PatientIsPF4'

                FROM [Agenda por Médico] A 
    INNER JOIN [Médicos] D ON(A.CódMédico = D.CódMédico)
    INNER JOIN [Fatura].[dbo].[Unidades] UN ON(UN.Sigla = D.Unidade) 
                INNER JOIN [Convênios] H ON(A.CódConvênio = H.CódConvênio)
    LEFT JOIN [Clientes].[dbo].[Clientes] c ON CAST(c.Prontuário AS VARCHAR) = a.CódCliente  
    LEFT JOIN [ResultMD].dbo.[Usuários] US ON (A.[UserConfirmação] = US.ID)
    LEFT JOIN [ResultMD].dbo.[Usuários] U ON (A.[CódAtendente] = U.ID)
    LEFT JOIN [Patient Tracking] ON A.ID_StatusAtual=[Patient Tracking].ID
    LEFT JOIN [Patient Tracking Status] ON isnull([Patient Tracking].ID_Status,'0')=[Patient Tracking Status].ID
    LEFT JOIN [Locais] ON [Patient Tracking].ID_LocalEncaminhamento=Locais.ID
    LEFT JOIN [SMS] SM ON (A.ID_SMS = SM.ID)

                WHERE (@DiaryID IS NULL OR A.[CódMédico] = @DiaryID)   
    AND (CAST(A.[Data] AS DATE) =  @Start )  
    AND (@ID_Status = '0' or ISNULL([Patient Tracking].ID_Status ,'0') = @ID_Status)   
    AND (@ID_Local = '0' or ISNULL([Patient Tracking].ID_LocalEncaminhamento,'0') = @ID_Local )   
    AND (@ID_Unidade IS NULL OR @ID_Unidade = UN.ID)

                ORDER BY A.Data, A.HI, A.FlagConflito, A.NomeCliente
    END

    sexta-feira, 15 de junho de 2018 15:04

Todas as Respostas

  • Gabriel,

    Você esta utilizando a linha com a função Cast para receber um valor de data que esta sendo passado via aplicação.

    Ai eu lhe pergunto:

    1 - Qual é o formato e tipo de dados que sua aplicação esta enviando para o SQL Server?

    2 -  O porque você esta fazendo esta conversão?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 15 de junho de 2018 23:36
  • Deleted
    sexta-feira, 15 de junho de 2018 23:37
  • Pedro.

    1- O formato que vem da minha aplicação é datetime.

    2-Estou fazendo a conversão para date porque, quando eu tiro a conversão o sistema fica lento.

    o tipo de dado do campo que estou convertendo (A.[Data] ) e um datetime.

    o tipo de dado do campo(@Start) que minha aplicação envia também é um datetime. 

    terça-feira, 19 de junho de 2018 17:51
  • 546	1	SELECT                A.[Compromisso] as 'AppointmentID'               ,A.[CódMédico] as 'DiaryID'      ,D.[Nome] AS 'Diary'               ,(CAST(A.[Data] as datetime) + CONVERT(DATETIME, cast(A.[HI] as time))) as 'Start'               ,A.[HF] as 'End'      ,A.[CódCliente] as 'PatientID'               ,A.[NomeCliente] AS 'PatientName'      ,CASE         WHEN [Patient Tracking Status].[Status]='AGENDADO'          AND A.HorárioChegada IS NULL         AND Data<cast(getdate() as date) THEN 'FALTOU'        ELSE [Patient Tracking Status].[Status]       END as 'Status'       ,Locais.[Local] as [Local]       ,CASE         WHEN ISNULL([Patient Tracking].[ID_Status],-1)=-1       AND A.HorárioChegada IS NULL       AND A.HorárioAtendimento IS NULL      AND A.HorárioSaída IS NULL      AND Data<cast(getdate() as date) THEN null         WHEN [Patient Tracking].[ID_Status]>0 THEN [Patient Tracking].[DataHoraStatus]        ELSE A.DataHoraMarcação        END AS 'DataHoraStatus'       ,[Patient Tracking].Observação as StatusObs       ,CASE      WHEN [Patient Tracking Status].[Status] IN('AGENDADO','CHECK OUT','CHECK-OUT') OR [Patient Tracking].[DataHoraStatus] = NULL THEN NULL      ELSE CAST((GETDATE() - [Patient Tracking].[DataHoraStatus]) AS DATETIME)         END AS 'TimeSinceLastStatus'         ,A.[CódAtendente] as 'UserID'       ,ISNULL(A.[NomeUsuário], U.[Nome]) AS 'UserName'                ,A.[CódConvênio] as 'HealthInsuranceCompanyID'       ,H.[Empresa] AS 'HealthInsuranceName'                ,A.[ID_Plano] as 'HealthInsurancePlanID'           ,A.[CódProc] as 'DiaryProcedureID'       ,A.[Procedimento] AS 'DiaryProcedure'                ,A.[HorárioSaída] as 'DepartureTime'                ,A.[HorárioAtendimento] as 'ConsultationTime'                ,A.[HorárioChegada] as 'ArrivalTime'                ,A.[FlagEspera] as 'Waiting'                ,A.[FlagConflito] as 'AppointmentLayer'                             ,A.[DataHoraMarcação] as 'InclusionDate'       ,A.[Confirmado] as 'Confirmed'                ,A.[DataConfirmação] as 'ConfirmationDate'                ,A.[UserConfirmação] as 'ConfirmationUserID'       ,US.[Nome] AS 'ConfirmationUserName'       ,A.[Observação] as 'Notes'                ,A.[ID_Protocolo] AS 'Protocol'       ,A.[Indicação] as 'IndicationID'           ,A.FlagEspera as 'Waiting'       ,A.[FlagConflito] as 'AppointmentLayer'       ,A.[TempoTotal] as 'AttendanceTime'       ,A.[ID_SMS] AS 'SMSId'       ,A.FlagEmergencia AS 'FlagEmergency'       ,SM.[TextoMsgRecebida] AS 'SMSMessage'       ,UN.ID as 'UnitID'       ,UN.NomeUnidade AS 'Unit'       ,CASE        WHEN ((FLOOR(DATEDIFF(DAY, A.DtNasc, GETDATE()) / 365.25)) <= 12) THEN 1       ELSE 0        END AS 'PatientIsChild'       ,CASE        WHEN ((FLOOR(DATEDIFF(DAY, A.DtNasc, GETDATE()) / 365.25)) >= 65) THEN 1       ELSE 0        END AS 'PatientIsElderly'               ,c.[FlagPF1] AS 'PatientIsPF1'       ,c.[FlagPF2] AS 'PatientIsPF2'       ,c.[FlagPF3] AS 'PatientIsPF3'       ,c.[FlagPF4] AS 'PatientIsPF4'                FROM [Agenda por Médico] A      INNER JOIN [Médicos] D ON(A.CódMédico = D.CódMédico)     INNER JOIN [Fatura].[dbo].[Unidades] UN ON(UN.Sigla = D.Unidade)               INNER JOIN [Convênios] H ON(A.CódConvênio = H.CódConvênio)     LEFT JOIN [Clientes].[dbo].[Clientes] c ON CAST(c.Prontuário AS VARCHAR) = a.CódCliente       LEFT JOIN [ResultMD].dbo.[Usuários] US ON (A.[UserConfirmação] = US.ID)     LEFT JOIN [ResultMD].dbo.[Usuários] U ON (A.[CódAtendente] = U.ID)     LEFT JOIN [Patient Tracking] ON A.ID_StatusAtual=[Patient Tracking].ID     LEFT JOIN [Patient Tracking Status] ON isnull([Patient Tracking].ID_Status,'0')=[Patient Tracking Status].ID     LEFT JOIN [Locais] ON [Patient Tracking].ID_LocalEncaminhamento=Locais.ID     LEFT JOIN [SMS] SM ON (A.ID_SMS = SM.ID)                 WHERE  (CAST(A.[Data] AS DATE) =  @Start )            ORDER BY A.Data DESC, A.HI, A.FlagConflito, A.NomeCliente	1	1	0	NULL	NULL	NULL	NULL	351,2836	NULL	NULL	NULL	4,345965	NULL	NULL	SELECT	0	NULL
    0	0	  |--Compute Scalar(DEFINE:([Expr1015]=CASE WHEN [Agenda].[dbo].[Patient Tracking Status].[Status]='AGENDADO' AND [Agenda].[dbo].[Agenda por Médico].[HorárioChegada] as [A].[HorárioChegada] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data]<CONVERT(date,getdate(),0) THEN 'FALTOU' ELSE [Agenda].[dbo].[Patient Tracking Status].[Status] END, [Expr1016]=CASE WHEN [Expr1026]=(-1) AND [Agenda].[dbo].[Agenda por Médico].[HorárioChegada] as [A].[HorárioChegada] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[HorárioAtendimento] as [A].[HorárioAtendimento] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[HorárioSaída] as [A].[HorárioSaída] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data]<CONVERT(date,getdate(),0) THEN NULL ELSE CASE WHEN [Agenda].[dbo].[Patient Tracking].[ID_Status]>(0) THEN [Agenda].[dbo].[Patient Tracking].[DataHoraStatus] ELSE CONVERT_IMPLICIT(datetime,[Agenda].[dbo].[Agenda por Médico].[DataHoraMarcação] as [A].[DataHoraMarcação],0) END END, [Expr1017]=CASE WHEN [Agenda].[dbo].[Patient Tracking Status].[Status]='CHECK-OUT' OR [Agenda].[dbo].[Patient Tracking Status].[Status]='CHECK OUT' OR [Agenda].[dbo].[Patient Tracking Status].[Status]='AGENDADO' OR NULL THEN NULL ELSE getdate()-[Agenda].[dbo].[Patient Tracking].[DataHoraStatus] END, [Expr1018]=isnull([Agenda].[dbo].[Agenda por Médico].[NomeUsuário] as [A].[NomeUsuário],[ResultMD].[dbo].[Usuários].[Nome] as [U].[Nome]), [Expr1019]=CASE WHEN floor(CONVERT_IMPLICIT(numeric(10,0),datediff(day,[Agenda].[dbo].[Agenda por Médico].[DtNasc] as [A].[DtNasc],getdate()),0)/(365.25))<=(12.) THEN (1) ELSE (0) END, [Expr1020]=CASE WHEN floor(CONVERT_IMPLICIT(numeric(10,0),datediff(day,[Agenda].[dbo].[Agenda por Médico].[DtNasc] as [A].[DtNasc],getdate()),0)/(365.25))>=(65.) THEN (1) ELSE (0) END))	1	2	1	Compute Scalar	Compute Scalar	DEFINE:([Expr1015]=CASE WHEN [Agenda].[dbo].[Patient Tracking Status].[Status]='AGENDADO' AND [Agenda].[dbo].[Agenda por Médico].[HorárioChegada] as [A].[HorárioChegada] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data]<CONVERT(date,getdate(),0) THEN 'FALTOU' ELSE [Agenda].[dbo].[Patient Tracking Status].[Status] END, [Expr1016]=CASE WHEN [Expr1026]=(-1) AND [Agenda].[dbo].[Agenda por Médico].[HorárioChegada] as [A].[HorárioChegada] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[HorárioAtendimento] as [A].[HorárioAtendimento] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[HorárioSaída] as [A].[HorárioSaída] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data]<CONVERT(date,getdate(),0) THEN NULL ELSE CASE WHEN [Agenda].[dbo].[Patient Tracking].[ID_Status]>(0) THEN [Agenda].[dbo].[Patient Tracking].[DataHoraStatus] ELSE CONVERT_IMPLICIT(datetime,[Agenda].[dbo].[Agenda por Médico].[DataHoraMarcação] as [A].[DataHoraMarcação],0) END END, [Expr1017]=CASE WHEN [Agenda].[dbo].[Patient Tracking Status].[Status]='CHECK-OUT' OR [Agenda].[dbo].[Patient Tracking Status].[Status]='CHECK OUT' OR [Agenda].[dbo].[Patient Tracking Status].[Status]='AGENDADO' OR NULL THEN NULL ELSE getdate()-[Agenda].[dbo].[Patient Tracking].[DataHoraStatus] END, [Expr1018]=isnull([Agenda].[dbo].[Agenda por Médico].[NomeUsuário] as [A].[NomeUsuário],[ResultMD].[dbo].[Usuários].[Nome] as [U].[Nome]), [Expr1019]=CASE WHEN floor(CONVERT_IMPLICIT(numeric(10,0),datediff(day,[Agenda].[dbo].[Agenda por Médico].[DtNasc] as [A].[DtNasc],getdate()),0)/(365.25))<=(12.) THEN (1) ELSE (0) END, [Expr1020]=CASE WHEN floor(CONVERT_IMPLICIT(numeric(10,0),datediff(day,[Agenda].[dbo].[Agenda por Médico].[DtNasc] as [A].[DtNasc],getdate()),0)/(365.25))>=(65.) THEN (1) ELSE (0) END)	[Expr1015]=CASE WHEN [Agenda].[dbo].[Patient Tracking Status].[Status]='AGENDADO' AND [Agenda].[dbo].[Agenda por Médico].[HorárioChegada] as [A].[HorárioChegada] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data]<CONVERT(date,getdate(),0) THEN 'FALTOU' ELSE [Agenda].[dbo].[Patient Tracking Status].[Status] END, [Expr1016]=CASE WHEN [Expr1026]=(-1) AND [Agenda].[dbo].[Agenda por Médico].[HorárioChegada] as [A].[HorárioChegada] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[HorárioAtendimento] as [A].[HorárioAtendimento] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[HorárioSaída] as [A].[HorárioSaída] IS NULL AND [Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data]<CONVERT(date,getdate(),0) THEN NULL ELSE CASE WHEN [Agenda].[dbo].[Patient Tracking].[ID_Status]>(0) THEN [Agenda].[dbo].[Patient Tracking].[DataHoraStatus] ELSE CONVERT_IMPLICIT(datetime,[Agenda].[dbo].[Agenda por Médico].[DataHoraMarcação] as [A].[DataHoraMarcação],0) END END, [Expr1017]=CASE WHEN [Agenda].[dbo].[Patient Tracking Status].[Status]='CHECK-OUT' OR [Agenda].[dbo].[Patient Tracking Status].[Status]='CHECK OUT' OR [Agenda].[dbo].[Patient Tracking Status].[Status]='AGENDADO' OR NULL THEN NULL ELSE getdate()-[Agenda].[dbo].[Patient Tracking].[DataHoraStatus] END, [Expr1018]=isnull([Agenda].[dbo].[Agenda por Médico].[NomeUsuário] as [A].[NomeUsuário],[ResultMD].[dbo].[Usuários].[Nome] as [U].[Nome]), [Expr1019]=CASE WHEN floor(CONVERT_IMPLICIT(numeric(10,0),datediff(day,[Agenda].[dbo].[Agenda por Médico].[DtNasc] as [A].[DtNasc],getdate()),0)/(365.25))<=(12.) THEN (1) ELSE (0) END, [Expr1020]=CASE WHEN floor(CONVERT_IMPLICIT(numeric(10,0),datediff(day,[Agenda].[dbo].[Agenda por Médico].[DtNasc] as [A].[DtNasc],getdate()),0)/(365.25))>=(65.) THEN (1) ELSE (0) END	351,2836	0	3,512836E-05	1220	4,345965	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [Agenda].[dbo].[Patient Tracking].[Observação], [Agenda].[dbo].[Locais].[Local], [SM].[TextoMsgRecebida], [Expr1014], [Expr1015], [Expr1016], [Expr1017], [Expr1018], [Expr1019], [Expr1020]	NULL	PLAN_ROW	0	1
    546	1	       |--Nested Loops(Inner Join, PASSTHRU:([IsBaseRow1013] IS NULL), OUTER REFERENCES:([SM].[DataCompromisso], [SM].[Celular], [SM].[Prontuário]))	1	3	2	Nested Loops	Inner Join	PASSTHRU:([IsBaseRow1013] IS NULL), OUTER REFERENCES:([SM].[DataCompromisso], [SM].[Celular], [SM].[Prontuário])	NULL	351,2836	0	0,001468365	1272	4,34593	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [U].[Nome], [Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[Observação], [Agenda].[dbo].[Patient Tracking Status].[Status], [Agenda].[dbo].[Locais].[Local], [SM].[TextoMsgRecebida], [Expr1014], [Expr1026]	NULL	PLAN_ROW	0	1
    546	1	            |--Nested Loops(Left Outer Join, OUTER REFERENCES:([A].[ID_SMS], [Expr1037]) WITH ORDERED PREFETCH)	1	4	3	Nested Loops	Left Outer Join	OUTER REFERENCES:([A].[ID_SMS], [Expr1037]) WITH ORDERED PREFETCH	NULL	351,2836	0	0,0014677	1113	4,024535	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [U].[Nome], [Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[Observação], [Agenda].[dbo].[Patient Tracking Status].[Status], [Agenda].[dbo].[Locais].[Local], [IsBaseRow1013], [SM].[DataCompromisso], [SM].[Celular], [SM].[Prontuário], [Expr1014], [Expr1026]	NULL	PLAN_ROW	0	1
    546	1	            |    |--Sort(ORDER BY:([A].[Data] DESC, [A].[HI] ASC, [A].[FlagConflito] ASC, [A].[NomeCliente] ASC))	1	6	4	Sort	Sort	ORDER BY:([A].[Data] DESC, [A].[HI] ASC, [A].[FlagConflito] ASC, [A].[NomeCliente] ASC)	NULL	351,1244	0,01126126	0,00473279	1070	3,705377	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [U].[Nome], [Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[Observação], [Agenda].[dbo].[Patient Tracking Status].[Status], [Agenda].[dbo].[Locais].[Local], [Expr1014], [Expr1026]	NULL	PLAN_ROW	0	1
    546	1	            |    |    |--Hash Match(Right Outer Join, HASH:([Agenda].[dbo].[Locais].[ID])=([Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento]), RESIDUAL:([Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento]=[Agenda].[dbo].[Locais].[ID]))	1	7	6	Hash Match	Right Outer Join	HASH:([Agenda].[dbo].[Locais].[ID])=([Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento]), RESIDUAL:([Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento]=[Agenda].[dbo].[Locais].[ID])	NULL	351,1244	0	0,02213096	1070	3,689383	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [U].[Nome], [Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[Observação], [Agenda].[dbo].[Patient Tracking Status].[Status], [Agenda].[dbo].[Locais].[Local], [Expr1014], [Expr1026]	NULL	PLAN_ROW	0	1
    52	1	            |    |         |--Clustered Index Scan(OBJECT:([Agenda].[dbo].[Locais].[PK_Locais]))	1	8	7	Clustered Index Scan	Clustered Index Scan	OBJECT:([Agenda].[dbo].[Locais].[PK_Locais])	[Agenda].[dbo].[Locais].[ID], [Agenda].[dbo].[Locais].[Local]	52	0,003125	0,0002142	40	0,0033392	[Agenda].[dbo].[Locais].[ID], [Agenda].[dbo].[Locais].[Local]	NULL	PLAN_ROW	0	1
    546	1	            |    |         |--Hash Match(Right Outer Join, HASH:([Agenda].[dbo].[Patient Tracking Status].[ID])=([Expr1027]), RESIDUAL:([Expr1027]=[Agenda].[dbo].[Patient Tracking Status].[ID]))	1	9	7	Hash Match	Right Outer Join	HASH:([Agenda].[dbo].[Patient Tracking Status].[ID])=([Expr1027]), RESIDUAL:([Expr1027]=[Agenda].[dbo].[Patient Tracking Status].[ID])	NULL	351,1244	0	0,02003773	1047	3,66391	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [U].[Nome], [Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento], [Agenda].[dbo].[Patient Tracking].[Observação], [Agenda].[dbo].[Patient Tracking Status].[Status], [Expr1014], [Expr1026]	NULL	PLAN_ROW	0	1
    18	1	            |    |              |--Clustered Index Scan(OBJECT:([Agenda].[dbo].[Patient Tracking Status].[PK_Patient Tracking Status]))	1	10	9	Clustered Index Scan	Clustered Index Scan	OBJECT:([Agenda].[dbo].[Patient Tracking Status].[PK_Patient Tracking Status])	[Agenda].[dbo].[Patient Tracking Status].[ID], [Agenda].[dbo].[Patient Tracking Status].[Status]	18	0,003125	0,0001768	40	0,0033018	[Agenda].[dbo].[Patient Tracking Status].[ID], [Agenda].[dbo].[Patient Tracking Status].[Status]	NULL	PLAN_ROW	0	1
    0	0	            |    |              |--Compute Scalar(DEFINE:([Expr1026]=isnull([Agenda].[dbo].[Patient Tracking].[ID_Status],(-1)), [Expr1027]=isnull([Agenda].[dbo].[Patient Tracking].[ID_Status],(0))))	1	11	9	Compute Scalar	Compute Scalar	DEFINE:([Expr1026]=isnull([Agenda].[dbo].[Patient Tracking].[ID_Status],(-1)), [Expr1027]=isnull([Agenda].[dbo].[Patient Tracking].[ID_Status],(0)))	[Expr1026]=isnull([Agenda].[dbo].[Patient Tracking].[ID_Status],(-1)), [Expr1027]=isnull([Agenda].[dbo].[Patient Tracking].[ID_Status],(0))	351,1244	0	3,511244E-05	1024	3,640568	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [U].[Nome], [Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento], [Agenda].[dbo].[Patient Tracking].[Observação], [Expr1014], [Expr1026], [Expr1027]	NULL	PLAN_ROW	0	1
    546	1	            |    |                   |--Nested Loops(Left Outer Join, OUTER REFERENCES:([A].[ID_StatusAtual], [Expr1036]) WITH UNORDERED PREFETCH)	1	12	11	Nested Loops	Left Outer Join	OUTER REFERENCES:([A].[ID_StatusAtual], [Expr1036]) WITH UNORDERED PREFETCH	NULL	351,1244	0	0,001466958	1016	3,640532	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [U].[Nome], [Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento], [Agenda].[dbo].[Patient Tracking].[Observação], [Expr1014]	NULL	PLAN_ROW	0	1
    546	1	            |    |                        |--Hash Match(Right Outer Join, HASH:([U].[ID])=([A].[CódAtendente]))	1	14	12	Hash Match	Right Outer Join	HASH:([U].[ID])=([A].[CódAtendente])	NULL	350,9469	0	0,02827448	875	3,41765	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [U].[Nome], [Expr1014]	NULL	PLAN_ROW	0	1
    253	1	            |    |                        |    |--Index Scan(OBJECT:([ResultMD].[dbo].[Usuários].[IX_Usuários] AS [U]))	1	15	14	Index Scan	Index Scan	OBJECT:([ResultMD].[dbo].[Usuários].[IX_Usuários] AS [U])	[U].[ID], [U].[Nome]	253	0,004606482	0,0004353	65	0,005041781	[U].[ID], [U].[Nome]	NULL	PLAN_ROW	0	1
    546	1	            |    |                        |    |--Merge Join(Right Outer Join, MERGE:([US].[ID])=([A].[UserConfirmação]), RESIDUAL:([Agenda].[dbo].[Agenda por Médico].[UserConfirmação] as [A].[UserConfirmação]=[ResultMD].[dbo].[Usuários].[ID] as [US].[ID]))	1	16	14	Merge Join	Right Outer Join	MERGE:([US].[ID])=([A].[UserConfirmação]), RESIDUAL:([Agenda].[dbo].[Agenda por Médico].[UserConfirmação] as [A].[UserConfirmação]=[ResultMD].[dbo].[Usuários].[ID] as [US].[ID])	NULL	350,9469	0	0,006903383	822	3,384331	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [US].[Nome], [Expr1014]	NULL	PLAN_ROW	0	1
    241	1	            |    |                        |         |--Clustered Index Scan(OBJECT:([ResultMD].[dbo].[Usuários].[PK_Usuários] AS [US]), ORDERED FORWARD)	1	17	16	Clustered Index Scan	Clustered Index Scan	OBJECT:([ResultMD].[dbo].[Usuários].[PK_Usuários] AS [US]), ORDERED FORWARD	[US].[ID], [US].[Nome]	253	0,01349537	0,0004353	65	0,01393067	[US].[ID], [US].[Nome]	NULL	PLAN_ROW	0	1
    546	1	            |    |                        |         |--Sort(ORDER BY:([A].[UserConfirmação] ASC))	1	18	16	Sort	Sort	ORDER BY:([A].[UserConfirmação] ASC)	NULL	350,9469	0,01126126	0,00472975	770	3,363494	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [Expr1014]	NULL	PLAN_ROW	0	1
    546	1	            |    |                        |              |--Hash Match(Left Outer Join, HASH:([A].[CódCliente])=([Expr1028]), RESIDUAL:([Expr1028]=[Agenda].[dbo].[Agenda por Médico].[CódCliente] as [A].[CódCliente]))	1	19	18	Hash Match	Left Outer Join	HASH:([A].[CódCliente])=([Expr1028]), RESIDUAL:([Expr1028]=[Agenda].[dbo].[Agenda por Médico].[CódCliente] as [A].[CódCliente])	NULL	350,9469	0	1,82463	770	3,347503	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [Expr1014]	NULL	PLAN_ROW	0	1
    546	1	            |    |                        |                   |--Hash Match(Inner Join, HASH:([H].[CódConvênio])=([A].[CódConvênio]), RESIDUAL:([Agenda].[dbo].[Convênios].[CódConvênio] as [H].[CódConvênio]=[Agenda].[dbo].[Agenda por Médico].[CódConvênio] as [A].[CódConvênio]))	1	20	19	Hash Match	Inner Join	HASH:([H].[CódConvênio])=([A].[CódConvênio]), RESIDUAL:([Agenda].[dbo].[Convênios].[CódConvênio] as [H].[CódConvênio]=[Agenda].[dbo].[Agenda por Médico].[CódConvênio] as [A].[CódConvênio])	NULL	350,9469	0	0,02428639	770	0,9715664	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [H].[Empresa], [Expr1014]	NULL	PLAN_ROW	0	1
    79	1	            |    |                        |                   |    |--Index Scan(OBJECT:([Agenda].[dbo].[Convênios].[IX_Convênios] AS [H]))	1	21	20	Index Scan	Index Scan	OBJECT:([Agenda].[dbo].[Convênios].[IX_Convênios] AS [H])	[H].[CódConvênio], [H].[Empresa]	79	0,003125	0,0002439	65	0,0033689	[H].[CódConvênio], [H].[Empresa]	NULL	PLAN_ROW	0	1
    0	0	            |    |                        |                   |    |--Compute Scalar(DEFINE:([Expr1014]=CONVERT(datetime,[Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data],0)+CONVERT(datetime,CONVERT(time(7),[Agenda].[dbo].[Agenda por Médico].[HI] as [A].[HI],0),0)))	1	22	20	Compute Scalar	Compute Scalar	DEFINE:([Expr1014]=CONVERT(datetime,[Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data],0)+CONVERT(datetime,CONVERT(time(7),[Agenda].[dbo].[Agenda por Médico].[HI] as [A].[HI],0),0))	[Expr1014]=CONVERT(datetime,[Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data],0)+CONVERT(datetime,CONVERT(time(7),[Agenda].[dbo].[Agenda por Médico].[HI] as [A].[HI],0),0)	350,9594	0	3,509595E-05	718	0,9439081	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID], [Expr1014]	NULL	PLAN_ROW	0	1
    546	1	            |    |                        |                   |         |--Nested Loops(Inner Join, OUTER REFERENCES:([D].[CódMédico]))	1	23	22	Nested Loops	Inner Join	OUTER REFERENCES:([D].[CódMédico])	NULL	350,9594	0	0,00146701	710	0,943873	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia], [D].[Nome], [UN].[NomeUnidade], [UN].[ID]	NULL	PLAN_ROW	0	1
    279	1	            |    |                        |                   |              |--Hash Match(Inner Join, HASH:([UN].[Sigla])=([D].[Unidade]), RESIDUAL:([Fatura].[dbo].[Unidades].[Sigla] as [UN].[Sigla]=[Agenda].[dbo].[Médicos].[Unidade] as [D].[Unidade]))	1	24	23	Hash Match	Inner Join	HASH:([UN].[Sigla])=([D].[Unidade]), RESIDUAL:([Fatura].[dbo].[Unidades].[Sigla] as [UN].[Sigla]=[Agenda].[dbo].[Médicos].[Unidade] as [D].[Unidade])	NULL	279	0	0,01991687	89	0,03123632	[D].[CódMédico], [D].[Nome], [UN].[NomeUnidade], [UN].[ID]	NULL	PLAN_ROW	0	1
    1	1	            |    |                        |                   |              |    |--Clustered Index Scan(OBJECT:([Fatura].[dbo].[Unidades].[PK__Unidades__3214EC277B113988] AS [UN]))	1	25	24	Clustered Index Scan	Clustered Index Scan	OBJECT:([Fatura].[dbo].[Unidades].[PK__Unidades__3214EC277B113988] AS [UN])	[UN].[Sigla], [UN].[NomeUnidade], [UN].[ID]	1	0,003125	0,0001581	51	0,0032831	[UN].[Sigla], [UN].[NomeUnidade], [UN].[ID]	NULL	PLAN_ROW	0	1
    279	1	            |    |                        |                   |              |    |--Clustered Index Scan(OBJECT:([Agenda].[dbo].[Médicos].[PK_Médicos] AS [D]))	1	26	24	Clustered Index Scan	Clustered Index Scan	OBJECT:([Agenda].[dbo].[Médicos].[PK_Médicos] AS [D])	[D].[CódMédico], [D].[Nome], [D].[Unidade]	279	0,007569444	0,0004639	63	0,008033345	[D].[CódMédico], [D].[Nome], [D].[Unidade]	NULL	PLAN_ROW	0	1
    546	279	            |    |                        |                   |              |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1034], [Expr1035], [Expr1033]))	1	27	23	Nested Loops	Inner Join	OUTER REFERENCES:([Expr1034], [Expr1035], [Expr1033])	NULL	1,257919	0,003125	0,0001583837	633	0,9109661	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia]	NULL	PLAN_ROW	0	279
    279	279	            |    |                        |                   |                   |--Compute Scalar(DEFINE:(([Expr1034],[Expr1035],[Expr1033])=GetRangeThroughConvert([@Start],[@Start],(62))))	1	28	27	Compute Scalar	Compute Scalar	DEFINE:(([Expr1034],[Expr1035],[Expr1033])=GetRangeThroughConvert([@Start],[@Start],(62)))	([Expr1034],[Expr1035],[Expr1033])=GetRangeThroughConvert([@Start],[@Start],(62))	1	0	0	27	0	[Expr1034], [Expr1035], [Expr1033]	NULL	PLAN_ROW	0	1
    279	279	            |    |                        |                   |                   |    |--Constant Scan	1	29	28	Constant Scan	Constant Scan	NULL	NULL	1	0	0	0	0	NULL	NULL	PLAN_ROW	0	1
    546	279	            |    |                        |                   |                   |--Clustered Index Seek(OBJECT:([Agenda].[dbo].[Agenda por Médico].[PK_Agenda por Médico] AS [A]), SEEK:([A].[CódMédico]=[Agenda].[dbo].[Médicos].[CódMédico] as [D].[CódMédico] AND [A].[Data] > [Expr1034] AND [A].[Data] < [Expr1035]),  WHERE:(CONVERT(date,[Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data],0)=[@Start]) ORDERED FORWARD)	1	30	27	Clustered Index Seek	Clustered Index Seek	OBJECT:([Agenda].[dbo].[Agenda por Médico].[PK_Agenda por Médico] AS [A]), SEEK:([A].[CódMédico]=[Agenda].[dbo].[Médicos].[CódMédico] as [D].[CódMédico] AND [A].[Data] > [Expr1034] AND [A].[Data] < [Expr1035]),  WHERE:(CONVERT(date,[Agenda].[dbo].[Agenda por Médico].[Data] as [A].[Data],0)=[@Start]) ORDERED FORWARD	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia]	1,257919	0,003125	0,0001583837	633	0,9109661	[A].[Compromisso], [A].[CódMédico], [A].[Data], [A].[HI], [A].[HF], [A].[FlagConflito], [A].[CódProc], [A].[CódCliente], [A].[NomeCliente], [A].[DtNasc], [A].[CódConvênio], [A].[Procedimento], [A].[Observação], [A].[Indicação], [A].[CódAtendente], [A].[DataHoraMarcação], [A].[Confirmado], [A].[DataConfirmação], [A].[UserConfirmação], [A].[HorárioChegada], [A].[HorárioAtendimento], [A].[HorárioSaída], [A].[TempoTotal], [A].[FlagEspera], [A].[ID_Protocolo], [A].[ID_SMS], [A].[ID_Plano], [A].[ID_StatusAtual], [A].[NomeUsuário], [A].[FlagEmergencia]	NULL	PLAN_ROW	0	279
    0	0	            |    |                        |                   |--Compute Scalar(DEFINE:([Expr1028]=CONVERT_IMPLICIT(nvarchar(30),CONVERT(varchar(30),[Clientes].[dbo].[Clientes].[Prontuário] as [c].[Prontuário],0),0)))	1	31	19	Compute Scalar	Compute Scalar	DEFINE:([Expr1028]=CONVERT_IMPLICIT(nvarchar(30),CONVERT(varchar(30),[Clientes].[dbo].[Clientes].[Prontuário] as [c].[Prontuário],0),0))	[Expr1028]=CONVERT_IMPLICIT(nvarchar(30),CONVERT(varchar(30),[Clientes].[dbo].[Clientes].[Prontuário] as [c].[Prontuário],0),0)	248660	0	0,024866	42	0,5513036	[c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4], [Expr1028]	NULL	PLAN_ROW	0	1
    248660	1	            |    |                        |                        |--Index Scan(OBJECT:([Clientes].[dbo].[Clientes].[IX_Clientes_9] AS [c]))	1	32	31	Index Scan	Index Scan	OBJECT:([Clientes].[dbo].[Clientes].[IX_Clientes_9] AS [c])	[c].[Prontuário], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4]	248660	0,2527546	0,273683	12	0,5264376	[c].[Prontuário], [c].[FlagPF1], [c].[FlagPF2], [c].[FlagPF3], [c].[FlagPF4]	NULL	PLAN_ROW	0	1
    342	546	            |    |                        |--Index Seek(OBJECT:([Agenda].[dbo].[Patient Tracking].[IX_Patient Tracking_5]), SEEK:([Agenda].[dbo].[Patient Tracking].[ID]=[Agenda].[dbo].[Agenda por Médico].[ID_StatusAtual] as [A].[ID_StatusAtual]) ORDERED FORWARD)	1	33	12	Index Seek	Index Seek	OBJECT:([Agenda].[dbo].[Patient Tracking].[IX_Patient Tracking_5]), SEEK:([Agenda].[dbo].[Patient Tracking].[ID]=[Agenda].[dbo].[Agenda por Médico].[ID_StatusAtual] as [A].[ID_StatusAtual]) ORDERED FORWARD	[Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento], [Agenda].[dbo].[Patient Tracking].[Observação]	1	0,003125	0,0001581	154	0,2214155	[Agenda].[dbo].[Patient Tracking].[DataHoraStatus], [Agenda].[dbo].[Patient Tracking].[ID_Status], [Agenda].[dbo].[Patient Tracking].[ID_LocalEncaminhamento], [Agenda].[dbo].[Patient Tracking].[Observação]	NULL	PLAN_ROW	0	350,9469
    319	546	            |    |--Index Seek(OBJECT:([Agenda].[dbo].[SMS].[IX_SMS] AS [SM]), SEEK:([SM].[ID]=[Agenda].[dbo].[Agenda por Médico].[ID_SMS] as [A].[ID_SMS]) ORDERED FORWARD)	1	34	4	Index Seek	Index Seek	OBJECT:([Agenda].[dbo].[SMS].[IX_SMS] AS [SM]), SEEK:([SM].[ID]=[Agenda].[dbo].[Agenda por Médico].[ID_SMS] as [A].[ID_SMS]) ORDERED FORWARD	[IsBaseRow1013], [SM].[DataCompromisso], [SM].[Celular], [SM].[Prontuário]	1	0,003125	0,0001581	52	0,3176901	[IsBaseRow1013], [SM].[DataCompromisso], [SM].[Celular], [SM].[Prontuário]	NULL	PLAN_ROW	0	351,1244
    319	319	            |--Clustered Index Seek(OBJECT:([Agenda].[dbo].[SMS].[PK_SMS] AS [SM]), SEEK:([SM].[DataCompromisso]=[Agenda].[dbo].[SMS].[DataCompromisso] as [SM].[DataCompromisso] AND [SM].[Celular]=[Agenda].[dbo].[SMS].[Celular] as [SM].[Celular] AND [SM].[Prontuário]=[Agenda].[dbo].[SMS].[Prontuário] as [SM].[Prontuário]) LOOKUP ORDERED FORWARD)	1	36	3	Clustered Index Seek	Clustered Index Seek	OBJECT:([Agenda].[dbo].[SMS].[PK_SMS] AS [SM]), SEEK:([SM].[DataCompromisso]=[Agenda].[dbo].[SMS].[DataCompromisso] as [SM].[DataCompromisso] AND [SM].[Celular]=[Agenda].[dbo].[SMS].[Celular] as [SM].[Celular] AND [SM].[Prontuário]=[Agenda].[dbo].[SMS].[Prontuário] as [SM].[Prontuário]) LOOKUP ORDERED FORWARD	[SM].[TextoMsgRecebida]	1	0,003125	0,0001581	211	0,3198212	[SM].[TextoMsgRecebida]	NULL	PLAN_ROW	0	351,2836

    terça-feira, 19 de junho de 2018 18:50
  • Bom dia , inicialmente vou elencar alguns problemas

    1) quando tempos campos que aceitam valores nulos, 
    temos o instinto de fazer algo semelhante a isso 

    SELECT 
    EL.country,
    EL.region,
    EL.city,
    EL.numemps,
    CL.numcusts
    FROM dbo.EmpLocations AS EL
    INNER JOIN dbo.CustLocations AS CL ON EL.country = CL.country
    where ISNULL(EL.region, N'<N/A>') = ISNULL(CL.region, N'<N/A>')

    O problema com essa abordagem é que, depois de aplicar a manipulação a uma coluna, o SQL Server
     não pode confiar que os valores de resultado preservam o mesmo comportamento de ordenação dos valores  originais.
    Isso pode afetar negativamente a capacidade do SQL Server de confiar na ordem de índice na fase de otimização

    Você pode manipular NULLs de uma maneira que lhe dê o significado lógico desejado e que
    o mesmo tempo  seja considerado  pelo otimizador  no predicate 

    Escrita Correta 
    SELECT EL.country, EL.region, EL.city, EL.numemps, CL.numcusts
    FROM dbo.EmpLocations AS EL
    INNER JOIN dbo.CustLocations AS CL ON EL.country = CL.country
    Where (EL.region = CL.region OR (EL.region IS NULL AND CL.region IS NULL))


    2) qual é a necessidade desse trecho
    ON CAST(c.Prontuário AS VARCHAR)  ?  já testou sem , qual e o impacto se for assim  c.Prontuário = A.CódCliente


    3) Agora como quesitos de otimização 

    retorna por favor um count de cada tabela 
    usada na query

    select count(*) from [Agenda por Médico];
    select count(*) from [[Médicos];
    select count(*) from [Fatura].[dbo].[Unidades]
    select count(*) from [Convênios]
    select count(*) from [Clientes].[dbo].[Clientes]
    select count(*) from [ResultMD].dbo.[Usuários]
    select count(*) from [Patient Tracking]
    select count(*) from [Patient Tracking Status]
    select count(*) from [Locais]
    select count(*) from [SMS]


    4) Como teste crie esse indice abaixo , rode a query e compare os tempos
    CREATE NONCLUSTERED INDEX IdxAgendaMedicoData ON [Agenda por Médico](Data,HI,FlagConflito,NomeCliente)

    5) poste o plano de execução no formato grafico por favor











    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    quarta-feira, 20 de junho de 2018 12:41
  • Olá Wesley.

    1- 

    2- Eu utilizo este: CAST(c.Prontuário AS VARCHAR)  = A.CódCliente 

    porque o campo  A.CódCliente   e um código VARCHAR que possui um valor "p" no inicio de alguns códigos ex: (p1, p2, p3, p4, p5, 1, 2, 3, 4, 5); 

    é o campo c.Prontuário e um INT que não possui o "p" na frente do código.  mas se associa com alguns codigo da coluna A.CódCliente  como no exemplo(1,2,3,4,5);

    3- 

    select count(*) from agenda.dbo.[Agenda por Médico];   ---1516911
    select count(*) from agenda.dbo.[Médicos]; ---279
    select count(*) from [Fatura].[dbo].[Unidades]   ---1
    select count(*) from agenda.dbo.[Convênios]   ---79
    select count(*) from [Clientes].[dbo].[Clientes]   ---248754
    select count(*) from [ResultMD].dbo.[Usuários]   ---253 
    select count(*) from agenda.dbo.[Patient Tracking]   ---1126312
    select count(*) from agenda.dbo.[Patient Tracking Status] ---18
    select count(*) from agenda.dbo.[Locais]                  ---52
    select count(*) from agenda.dbo.[SMS]   ---265175

    quinta-feira, 21 de junho de 2018 18:42
  • 1-

    2-  ON CAST(c.Prontuário AS VARCHAR)  ?  já testou sem , qual e o impacto se for assim  c.Prontuário = A.CódCliente.

    Eu faço esté cast porque o A.CódCliente e um VARCHAR é em alguns codigos ele possui a letra "p".

    Já o c.Prontuário é um INT  possui apenas codigo numericos.

    3- 

    select count(*) from agenda.dbo.[Agenda por Médico];                                         ---1516911

    select count(*) from agenda.dbo.[Médicos];   ---279
    select count(*) from [Fatura].[dbo].[Unidades]   ---1
    select count(*) from agenda.dbo.[Convênios]   ---79
    select count(*) from [Clientes].[dbo].[Clientes]                            ---248754
    select count(*) from [ResultMD].dbo.[Usuários]   ---253 
    select count(*) from agenda.dbo.[Patient Tracking]   ---1126312
    select count(*) from agenda.dbo.[Patient Tracking Status]      ---18
    select count(*) from agenda.dbo.[Locais]                                   ---52
    select count(*) from agenda.dbo.[SMS]    ---265175                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        4- Eu criei o Indice.                                                                            

    5- Plano de execução enviado por e-mail.

    • Editado Gabriel Sl quinta-feira, 21 de junho de 2018 19:01
    quinta-feira, 21 de junho de 2018 18:57
  •  Dei uma reescrevida muito pouco no where , gostaria que vc testasse 

    também estou ajustando o [IXClientes_9] para a query 

    Se melhorar   ótimo ,

    entretanto acredito que o problema não seja sua query propriamente

    o gargalo está aqui.

    LEFT JOIN dbo.Clientes.[dbo].[Clientes] c ON CAST(c.Prontuário AS VARCHAR)             = A.CódCliente

    Isso e um JOIN de uma tabela A ( agenda.dbo.[Agenda por Médico]) com 1.516.911,00 registros
    contra uma tabela B ([Clientes].[dbo].[Clientes]) com  248.754,00 registros

    entre dois bancos diferentes que aparentementes estão sem Ligação 

    Me mostre p modelo ER das duas tabelas por favor, a imagem do diagrama que o SQL,

    quero saber como essas tabelas se relacionam.

    veja parte do plano de execução 

    2) tem mensagens de Statisticas Desatualizadas para o banco , vc tem alguma rotina de manutenção de Statisticas e Indices , se não tiver providencie , 

    -Aconselho inicialmente rodar SP

    EXEC sp_updatestats;

    --Code

    SELECT A.[Compromisso] AS 'AppointmentID',
           A.[CódMédico] AS 'DiaryID',
           D.[Nome] AS 'Diary',
           (CAST(A.[Data] AS DATETIME) + CONVERT(DATETIME, CAST(A.[HI] AS TIME))) AS 'Start',
           A.[HF] AS 'End',
           A.[CódCliente] AS 'PatientID',
           A.[NomeCliente] AS 'PatientName',
           CASE
                WHEN [Patient Tracking Status].[Status] = 'AGENDADO'
                 AND A.HorárioChegada IS NULL
                 AND Data < CAST(GETDATE() AS DATE) THEN 'FALTOU'
                ELSE [Patient Tracking Status].[Status] END AS 'Status',
           Locais.[Local] AS [Local],
           CASE
                WHEN ISNULL([Patient Tracking].[ID_Status], -1) = -1
                 AND A.HorárioChegada IS NULL
                 AND A.HorárioAtendimento IS NULL
                 AND A.HorárioSaída IS NULL
                 AND Data < CAST(GETDATE() AS DATE) THEN NULL
                WHEN [Patient Tracking].[ID_Status] > 0 THEN [Patient Tracking].[DataHoraStatus]
                ELSE A.DataHoraMarcação END AS 'DataHoraStatus',
           [Patient Tracking].Observação AS StatusObs,
           CASE
                WHEN [Patient Tracking Status].[Status] IN ( 'AGENDADO', 'CHECK OUT', 'CHECK-OUT' )
                  OR [Patient Tracking].[DataHoraStatus] = NULL THEN NULL
                ELSE CAST((GETDATE() - [Patient Tracking].[DataHoraStatus]) AS DATETIME)END AS 'TimeSinceLastStatus',
           A.[CódAtendente] AS 'UserID',
           ISNULL(A.[NomeUsuário], U.[Nome]) AS 'UserName',
           A.[CódConvênio] AS 'HealthInsuranceCompanyID',
           H.[Empresa] AS 'HealthInsuranceName',
           A.[ID_Plano] AS 'HealthInsurancePlanID',
           A.[CódProc] AS 'DiaryProcedureID',
           A.[Procedimento] AS 'DiaryProcedure',
           A.[HorárioSaída] AS 'DepartureTime',
           A.[HorárioAtendimento] AS 'ConsultationTime',
           A.[HorárioChegada] AS 'ArrivalTime',
           A.[FlagEspera] AS 'Waiting',
           A.[FlagConflito] AS 'AppointmentLayer',
           A.[DataHoraMarcação] AS 'InclusionDate',
           A.[Confirmado] AS 'Confirmed',
           A.[DataConfirmação] AS 'ConfirmationDate',
           A.[UserConfirmação] AS 'ConfirmationUserID',
           US.[Nome] AS 'ConfirmationUserName',
           A.[Observação] AS 'Notes',
           A.[ID_Protocolo] AS 'Protocol',
           A.[Indicação] AS 'IndicationID',
           A.FlagEspera AS 'Waiting',
           A.[FlagConflito] AS 'AppointmentLayer',
           A.[TempoTotal] AS 'AttendanceTime',
           A.[ID_SMS] AS 'SMSId',
           A.FlagEmergencia AS 'FlagEmergency',
           SM.[TextoMsgRecebida] AS 'SMSMessage',
           UN.ID AS 'UnitID',
           UN.NomeUnidade AS 'Unit',
           CASE
                WHEN ((FLOOR(DATEDIFF(DAY, A.DtNasc, GETDATE()) / 365.25)) <= 12) THEN 1
                ELSE 0 END AS 'PatientIsChild',
           CASE
                WHEN ((FLOOR(DATEDIFF(DAY, A.DtNasc, GETDATE()) / 365.25)) >= 65) THEN 1
                ELSE 0 END AS 'PatientIsElderly',
           c.[FlagPF1] AS 'PatientIsPF1',
           c.[FlagPF2] AS 'PatientIsPF2',
           c.[FlagPF3] AS 'PatientIsPF3',
           c.[FlagPF4] AS 'PatientIsPF4'
      FROM [Agenda por Médico] A
     INNER JOIN [Médicos] D
        ON (A.CódMédico                              = D.CódMédico)
     INNER JOIN [Fatura].[dbo].[Unidades] UN
        ON (UN.Sigla                                 = D.Unidade)
     INNER JOIN [Convênios] H
        ON (A.CódConvênio                            = H.CódConvênio)
      LEFT JOIN dbo.Clientes.[dbo].[Clientes] c
        ON CAST(c.Prontuário AS VARCHAR)             = A.CódCliente
      LEFT JOIN [ResultMD].dbo.[Usuários] US
        ON (A.[UserConfirmação]                      = US.ID)
      LEFT JOIN [ResultMD].dbo.[Usuários] U
        ON (A.[CódAtendente]                         = U.ID)
      LEFT JOIN [Patient Tracking]
        ON A.ID_StatusAtual                          = [Patient Tracking].ID
      LEFT JOIN [Patient Tracking Status]
        ON ISNULL([Patient Tracking].ID_Status, '0') = [Patient Tracking Status].ID
      LEFT JOIN [Locais]
        ON [Patient Tracking].ID_LocalEncaminhamento = Locais.ID
      LEFT JOIN [SMS] SM
        ON (A.ID_SMS                                 = SM.ID)
     WHERE (   @DiaryID IS NULL
          OR   A.[CódMédico]                                          = @DiaryID)
       AND (CAST(A.[Data] AS DATE)                                    = @Start)
       AND (   @ID_Status                                             = '0'
          OR   ISNULL([Patient Tracking].ID_Status, '0')              = @ID_Status)
       AND (   @ID_Local                                              = '0'
          OR   ISNULL([Patient Tracking].ID_LocalEncaminhamento, '0') = @ID_Local)
       AND (   @ID_Unidade IS NULL
          OR   @ID_Unidade                                            = UN.ID)
     ORDER BY A.Data,
              A.HI,
              A.FlagConflito,
              A.NomeCliente;

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves


    • Editado Wesley Neves sexta-feira, 22 de junho de 2018 16:34 complemento
    sexta-feira, 22 de junho de 2018 16:32
  • Olá Wesley.

    1- Realmente o gargalo está aqui: LEFT JOIN Clientes.[dbo].[Clientes] c ON CAST(c.Prontuário AS VARCHAR) = A.CódCliente

    Mas infelizmente estás tabelas([Clientes] e [Agenda por Médico]) não possuem associação alem do fato de estarem em bases de dados diferentes.

    Não posso disponibilizar a estrutura total das tabelas mas deixo o seguinte print com a chave primaria de cada tabela:

    

    OBS: As tabelas não possuem FK e não é possível mudar isto por motivo de regras de negocio que implicam na estrutura de outras tabelas associadas [Agenda por Médico].

    2- Eu tenho rotinas de manutenção para estatísticas que roda nos domingos e nas quintas de madrugada.Tenho rotinas manutenção de índices diárias.

    3- Rodei a consulta que você ajustou mas não mudou o resultado.

    segunda-feira, 25 de junho de 2018 21:26
  • Gabriel,

    Quando realizamos conversão de dados na cláusula Where, estamos forçando o SQL Server a mudar em tempo de execução toda estratégia pré definida de execução que estava estabelecida anteriormente.

    Você disse que esta trabalhando com dados Date, sendo que os mesmos estão vindo via aplicação em DateTime.

    Só de mudar de DateTime para Date você melhorar a performance? Se realmente é isso, o que provavelmente pode estar acontecendo é que o SQL Server tem que buscar os dados de data e hora e isso força uma mudança no processamento da query.

    Você por acaso já pensou em utilizar algum função específica para dados DateTime na cláusula hora justamente para pegar a parte de referente a Data sem fazer nenhum tipo de conversão.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 27 de junho de 2018 22:46
  • Olá Pedro,

    Então... no banco de dados não tenho problemas como eu disse no primeiro post dia 15 de junho de 2018

    O meu codigo SQL está funcionando corretamente(retornando os dados que eu preciso) e com o desempenho esperado mas ao remover o cast da da data na clausula where :(CAST(A.[Data] AS DATE) =  @Start )  o sistema que faz uso dessa procedure fica muito lento .

    O que não entendo é porque o sistema fica lento quando tiro esté CAST sendo que o tipo de dado do campo A.[Data] é um datetime e o tipo de dado da variável @Start  tambem é um datetime.?

    Porque  where datetime = datetime  causa lentidão no sistema?


    quinta-feira, 28 de junho de 2018 21:17
  • Olá Pedro,

    Então... no banco de dados não tenho problemas como eu disse no primeiro post dia 15 de junho de 2018

    O meu codigo SQL está funcionando corretamente(retornando os dados que eu preciso) e com o desempenho esperado mas ao remover o cast da da data na clausula where :(CAST(A.[Data] AS DATE) =  @Start )  o sistema que faz uso dessa procedure fica muito lento .

    O que não entendo é porque o sistema fica lento quando tiro esté CAST sendo que o tipo de dado do campo A.[Data] é um datetime e o tipo de dado da variável @Start  tambem é um datetime.?

    Porque  where datetime = datetime  causa lentidão no sistema?


    Vc notou alguma conversão implícita  no plano de execução ??


    Wesley Neves

    sexta-feira, 29 de junho de 2018 11:20
  • Não notei conversões implícitas no plano de execução.

    sexta-feira, 29 de junho de 2018 15:55
  • Gabriel,

    Realmente é algo estranho, mas me parece que isso esta conflitando com as configurações de idioma, collate ou linguagem do usuário.

    Você esta utilizando qual idioma para seu Windows e SQL Server?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 29 de junho de 2018 18:46
  • 1-Idioma = Inglês.

    2-Collate = Latin1_General_CI_AS.

    Eu vi algo relacionado ao nível de compatibilidade(encontrado em propriedades da base de dados -> opções -> Compatibility level).

    Meu banco de dados foi atualizado de 2014 para 2017 tem cerca de 6 meses, mas notei que o  Compatibility level das bases de dados permanecem  como 2014(120).

    Isso pode ocasionar algum tipo de problema?

    segunda-feira, 2 de julho de 2018 17:44
  • Oi Gabriel.
    Olha, tentou alterar o seu declare da variável @start para somente DATE? 

    E uma coisa que eu faria para essa query, seria fazer uma pré filtragem dos dados, principalmente da tabela que tem mais de 1 milhão de registros. Com uma @table ou até mesmo uma CTE. Com uma pré filtragem e até mesmo as conversões já realizadas, o relatório final é muito mais leve. Abuse da memória do SQL, que é fominha! rs

    E se não se importar em usar dados não commitados, coloque alguns NOLOCK, pra te ajudar.
    segunda-feira, 2 de julho de 2018 20:24
  • Olá Wesley.

    1- Realmente o gargalo está aqui: LEFT JOIN Clientes.[dbo].[Clientes] c ON CAST(c.Prontuário AS VARCHAR) = A.CódCliente

    Mas infelizmente estás tabelas([Clientes] e [Agenda por Médico]) não possuem associação alem do fato de estarem em bases de dados diferentes.

    Não posso disponibilizar a estrutura total das tabelas mas deixo o seguinte print com a chave primaria de cada tabela:

    

    OBS: As tabelas não possuem FK e não é possível mudar isto por motivo de regras de negocio que implicam na estrutura de outras tabelas associadas [Agenda por Médico].

    2- Eu tenho rotinas de manutenção para estatísticas que roda nos domingos e nas quintas de madrugada.Tenho rotinas manutenção de índices diárias.

    3- Rodei a consulta que você ajustou mas não mudou o resultado.

    Bom dia veja que essa modelagem está muito estranha ,isso se da ao fato que criaram uma PK de indentifica algo único na regra de negocio, com certeza a PK da tabela "Clientes" fica a mostra no sistema , isso para a modelagem conceitual , é diferente , a PK tem que identificar unicamente a tupla é somente isso, não deve ter outro sentido ,

    o que fiz na query abaixo foi uma tentativa de eliminar o problema do cast , altere a consulta de criação da tabela temporária para trazer somente os dados que são usados na SP , e se possivel fação um filtro , que inda não identifiquei.

    1) Criei uma tabela temporária para evitar o cast no LEFT JOIN, de uma melhorada nisso identificando possível filtro no insert da tabela temporária

    2) Criei um índice único  

    Prontuariovarchar

    3) vc tem algum índice no campo Data da tabela  [Agenda por Médico] se tiver poste sua estrutura por favor

    --ALTER PROCEDURE [dbo].[Compromissos] -- @DiaryID INT = NULL, -- @Start DATETIME, -- @ID_Status VARCHAR(6), -- @ID_Local VARCHAR(6), -- @ID_Unidade INT = NULL --AS --SET NOCOUNT ON; BEGIN IF ( OBJECT_ID('TEMPDB..#TempClientes') IS NOT NULL ) DROP TABLE #TempClientes; CREATE TABLE #TempClientes ( [Prontuario] INT NOT NULL, Prontuariovarchar VARCHAR(20) UNIQUE, --[Somentes campos utilizados pela sp] CONSTRAINT PKProntuario PRIMARY KEY(Prontuario) ); INSERT INTO #TempClientes SELECT [Somentes campos utilizados pela sp] FROM [Clientes].[dbo].[Clientes] UPDATE TC SET TC.Prontuariovarchar =CAST(TC.Prontuario AS VARCHAR(20)) FROM #TempClientes AS TC SELECT A.[Compromisso] AS 'AppointmentID', A.[CódMédico] AS 'DiaryID', D.[Nome] AS 'Diary', (CAST(A.[Data] AS DATETIME) + CONVERT(DATETIME, CAST(A.[HI] AS TIME))) AS 'Start', A.[HF] AS 'End', A.[CódCliente] AS 'PatientID', A.[NomeCliente] AS 'PatientName', CASE WHEN [Patient Tracking Status].[Status] = 'AGENDADO' AND A.HorárioChegada IS NULL AND Data < CAST(GETDATE() AS DATE) THEN 'FALTOU' ELSE [Patient Tracking Status].[Status] END AS 'Status', Locais.[Local] AS [Local], CASE WHEN ISNULL([Patient Tracking].[ID_Status], -1) = -1 AND A.HorárioChegada IS NULL AND A.HorárioAtendimento IS NULL AND A.HorárioSaída IS NULL AND Data < CAST(GETDATE() AS DATE) THEN NULL WHEN [Patient Tracking].[ID_Status] > 0 THEN [Patient Tracking].[DataHoraStatus] ELSE A.DataHoraMarcação END AS 'DataHoraStatus', [Patient Tracking].Observação AS StatusObs, CASE WHEN [Patient Tracking Status].[Status] IN ( 'AGENDADO', 'CHECK OUT', 'CHECK-OUT' ) OR [Patient Tracking].[DataHoraStatus] = NULL THEN NULL ELSE CAST((GETDATE() - [Patient Tracking].[DataHoraStatus]) AS DATETIME)END AS 'TimeSinceLastStatus', A.[CódAtendente] AS 'UserID', ISNULL(A.[NomeUsuário], U.[Nome]) AS 'UserName', A.[CódConvênio] AS 'HealthInsuranceCompanyID', H.[Empresa] AS 'HealthInsuranceName', A.[ID_Plano] AS 'HealthInsurancePlanID', A.[CódProc] AS 'DiaryProcedureID', A.[Procedimento] AS 'DiaryProcedure', A.[HorárioSaída] AS 'DepartureTime', A.[HorárioAtendimento] AS 'ConsultationTime', A.[HorárioChegada] AS 'ArrivalTime', A.[FlagEspera] AS 'Waiting', A.[FlagConflito] AS 'AppointmentLayer', A.[DataHoraMarcação] AS 'InclusionDate', A.[Confirmado] AS 'Confirmed', A.[DataConfirmação] AS 'ConfirmationDate', A.[UserConfirmação] AS 'ConfirmationUserID', US.[Nome] AS 'ConfirmationUserName', A.[Observação] AS 'Notes', A.[ID_Protocolo] AS 'Protocol', A.[Indicação] AS 'IndicationID', A.FlagEspera AS 'Waiting', A.[FlagConflito] AS 'AppointmentLayer', A.[TempoTotal] AS 'AttendanceTime', A.[ID_SMS] AS 'SMSId', A.FlagEmergencia AS 'FlagEmergency', SM.[TextoMsgRecebida] AS 'SMSMessage', UN.ID AS 'UnitID', UN.NomeUnidade AS 'Unit', CASE WHEN ((FLOOR(DATEDIFF(DAY, A.DtNasc, GETDATE()) / 365.25)) <= 12) THEN 1 ELSE 0 END AS 'PatientIsChild', CASE WHEN ((FLOOR(DATEDIFF(DAY, A.DtNasc, GETDATE()) / 365.25)) >= 65) THEN 1 ELSE 0 END AS 'PatientIsElderly', c.[FlagPF1] AS 'PatientIsPF1', c.[FlagPF2] AS 'PatientIsPF2', c.[FlagPF3] AS 'PatientIsPF3', c.[FlagPF4] AS 'PatientIsPF4' FROM [Agenda por Médico] A INNER JOIN [Médicos] D ON (A.CódMédico = D.CódMédico) INNER JOIN [Fatura].[dbo].[Unidades] UN ON (UN.Sigla = D.Unidade) INNER JOIN [Convênios] H ON (A.CódConvênio = H.CódConvênio) LEFT JOIN #TempClientes c ON c.Prontuariovarchar = A.CódCliente LEFT JOIN [ResultMD].dbo.[Usuários] US ON (A.[UserConfirmação] = US.ID) LEFT JOIN [ResultMD].dbo.[Usuários] U ON (A.[CódAtendente] = U.ID) LEFT JOIN [Patient Tracking] ON A.ID_StatusAtual = [Patient Tracking].ID LEFT JOIN [Patient Tracking Status] ON ISNULL([Patient Tracking].ID_Status, '0') = [Patient Tracking Status].ID LEFT JOIN [Locais] ON [Patient Tracking].ID_LocalEncaminhamento = Locais.ID LEFT JOIN [SMS] SM ON (A.ID_SMS = SM.ID) WHERE ( @DiaryID IS NULL OR A.[CódMédico] = @DiaryID) AND (CAST(A.[Data] AS DATE) = @Start) AND ( @ID_Status = '0' OR ISNULL([Patient Tracking].ID_Status, '0') = @ID_Status) AND ( @ID_Local = '0' OR ISNULL([Patient Tracking].ID_LocalEncaminhamento, '0') = @ID_Local) AND ( @ID_Unidade IS NULL OR @ID_Unidade = UN.ID) ORDER BY A.Data, A.HI, A.FlagConflito, A.NomeCliente; END;


    Me envia novamente o plano de execução dessa alteração por favor

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    terça-feira, 3 de julho de 2018 12:02
  • Olá.

    Resolvi o problema da seguinte forma:

    Atualizei o Compatibility level das bases de dados para 2017(140).

    terça-feira, 3 de julho de 2018 13:26
  • Olá

    Resolvi o problema da seguinte forma:

    Atualizei o Compatibility level das bases de dados para 2017(140).

    Agradeço a todos pela ajuda.

    • Editado Gabriel Sl terça-feira, 3 de julho de 2018 13:32
    terça-feira, 3 de julho de 2018 13:28