Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consulta Demora mas de 10 minutos

Estas en el tema de Consulta Demora mas de 10 minutos en el foro de Mysql en Foros del Web. Hola tengo un query que tarda mas de 10 minutos y termina expirando del PHP La tabla es la siguiente y tiene 49000 registros @import ...
  #1 (permalink)  
Antiguo 10/12/2012, 13:58
 
Fecha de Ingreso: diciembre-2012
Mensajes: 1
Antigüedad: 11 años, 11 meses
Puntos: 0
Consulta Demora mas de 10 minutos

Hola tengo un query que tarda mas de 10 minutos y termina expirando del PHP

La tabla es la siguiente y tiene 49000 registros

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `os_dispatch_closed` (
  2.   `EnterpriseDocumentId` text,
  3.   `SourceSystem` text,
  4.   `BusinessProcess` text,
  5.   `ObjectChangeActionType` text,
  6.   `IntegrationCreationDateTime` datetime DEFAULT NULL,
  7.   `Americas` text,
  8.   `EMEA` text,
  9.   `APG` text,
  10.   `SenderId` text,
  11.   `SenderName` text,
  12.   `OriginalPartnerId` text,
  13.   `OriginalPartnerName` text,
  14.   `PurposeCode` text,
  15.   `SPAccount` text,
  16.   `ActivityDescription` text,
  17.   `ActivityType` text,
  18.   `AdditionalInformation` text,
  19.   `BeginningTime` datetime DEFAULT NULL,
  20.   `CallNumber` text,
  21.   `CannedMessages` text,
  22.   `DiagnosticCode` text,
  23.   `Instructions` text,
  24.   `RecommendedType` text,
  25.   `ResolutionTime` datetime DEFAULT NULL,
  26.   `ServiceLevelAgreementConfirmation` text,
  27.   `ServiceRequestCommittedDate` text,
  28.   `ShipToRequest` text,
  29.   `WorkOrderNumber` text,
  30.   `WorkOrderRequestedServiceDate` datetime DEFAULT NULL,
  31.   `Severity` text,
  32.   `ActivityCreateDateTime` datetime DEFAULT NULL,
  33.   `Other` text,
  34.   `SpecialTerms` text,
  35.   `VersionOfWorkEffortIdentifier` text,
  36.   `ReliefDate` datetime DEFAULT NULL,
  37.   `ProductName` text,
  38.   `DeviceTagCustomer` text,
  39.   `DeviceTagDellService` text,
  40.   `DeviceTagOem` text,
  41.   `DeviceTagPpid` text,
  42.   `DeviceTagServiceProvider` text,
  43.   `AssetTag` text,
  44.   `SerialNumber` text,
  45.   `ProductIdentifier` text,
  46.   `Model` text,
  47.   `Type` text,
  48.   `Reading` text,
  49.   `AccountName` text,
  50.   `AddressLineOne` text,
  51.   `AddressLineTwo` text,
  52.   `AddressLineThree` text,
  53.   `City` text,
  54.   `Code` text,
  55.   `ContactName` text,
  56.   `Country` text,
  57.   `County` text,
  58.   `FirstName` text,
  59.   `LastName` text,
  60.   `Name` text,
  61.   `PostalCode` text,
  62.   `Province` text,
  63.   `PhysicalLocation1` text,
  64.   `PhysicalLocation2` text,
  65.   `PhysicalLocation3` text,
  66.   `State` text,
  67.   `StateProvince` text,
  68.   `CustomerPhone` text,
  69.   `ShipToContactTelephone` text,
  70.   `MarketingName` text,
  71.   `TLIPartNumber` text,
  72.   `Quantity` text,
  73.   `MachineTypeModelNumber` text,
  74.   `ActivityLineNumber` text,
  75.   `id_prestador` int(11) DEFAULT '0',
  76.   `observaciones` text NOT NULL,
  77.   `id_estado` int(11) NOT NULL DEFAULT '1',
  78.   `id_activitystatus` int(11) NOT NULL DEFAULT '0',
  79.   `FileID` text NOT NULL,
  80.   `fecha_registro` datetime NOT NULL,
  81.   PRIMARY KEY (`id`)
  82. );
y el query que estoy haciendo es este

Código MySQL:
Ver original
  1.     f.id,  
  2.     DATE_FORMAT(f.BeginningTime,'%d-%m-%Y %H:%i:%s') as fechacreacionsrv,
  3.     f.CallNumber as servicio,
  4.     f.WorkOrderNumber as nrocaso,
  5.     f.ResolutionTime as fecharta,
  6.     f.AdditionalInformation as sla,
  7.     f.City as localidad,
  8.     f.SerialNumber as nroserie,
  9.     f.Model as modelo,
  10.     modelos.model AS modeloReal,
  11.     AccountName as ctaem presa,
  12.     activitystatus.descripcion as estadolmk,
  13.     estado,razonsocial,
  14.     f.observaciones
  15. from  
  16.     modelos,
  17.     estados_os,
  18.     prestadores,
  19.     activitystatus,
  20.     (SELECT CallNumber, max(f echa_registro) as fechaupd  
  21.     FROM os_dispatch_closed by CallNumber) as x  
  22.     inner join os_dispatch_closed as f on f.CallNumber= x.CallNumber and f.fecha_registro= x.fechaupd
  23.     f.id_a ctivitystatus=activitystatus.id  
  24.     and f.id_estado=estados_os.id  
  25.     and f.id_prestador=prestadores.id  
  26.     and REPLACE(f.model,';','')=modelos.machinetype  
  27.     and f.id_acti vitystatus not like 82
  28. ORDER BY fecha_registro DESC;

como puedo optimizarlo?

Última edición por gnzsoloyo; 10/12/2012 a las 14:04 Razón: Código SQL sin etiquetar. Sin estructurado.
  #2 (permalink)  
Antiguo 10/12/2012, 14:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta Demora mas de 10 minutos

Es difícil decir por dónde comenzar...
- ¿Por qué tantos campos TEXT? Ese tipo de campos sólo se usa para datos que requieran ese tipo de almacenamiento, y me cuesta creer que realmente todos esos campos sean necesarios así. ¿Por qué no VARCHAR?
- Hay iteraciones de atributos que podrían estar en otras tablas, y además campos que se infieren numéricos declarados como TEXT muestran una incorrecta definición de los tipos de dato.
- Tantas columnas, y el hecho de que se esté consultando sólo a una pequeña parte de ellas, me hace sospechar que esa tabla no está adecuadamente normalizada.
- El uso de JOIN implícitos (,) puede generar productos cartesianos. No podemos establecerlo porque sin conocer la estructura de las otras tablas es una suposición.
- La relación de tablas en el WHERE es de pésima performance. Está completamente desaconsejada y sería preferible declarar los INNER JOIN correspondientes en su lugar.
- El uso del REPLACE() permite inferir que existe un campo que parecer ser multivaluado, lo que es gravísimo para la performance de las consultas (sin olvidarse que es una violación flagrante del modelo relacional).
- LIKE se usa con cadenas de caracteres y no con números.
- Hay una subconsulta con un BY del que se desconoce el uso, pero en principio generaría un error de sintaxis.
...
Como dije: Es difícil decidir por donde empezar, pero yo empezaría por depurar el modelo de la tabla, porque esos campos TEXT no parecen razonables.

¿Podrías explicar estos puntos mencionados?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: demora, join, minutos, php, registros, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:32.