Colaboración para acelerar esta consulta

61 views
Skip to first unread message

Alejandro Garcia G.

unread,
Jul 27, 2017, 10:13:47 PM7/27/17
to Comunidad de Visual Foxpro en Español
SELECT a.codsuc, a.fuecom, a.comcon, a.codter, IFNULL(b.nomter, 'No Existe') AS Tercero_existe
    FROM cn_contable a
    LEFT JOIN cn_terceros b ON a.codter = b.codter
    WHERE a.feccom BETWEEN '2000-01-30' AND '2017-07-31'
    GROUP BY a.codter
    HAVING Tercero_existe = 'No Existe'
    ORDER BY a.codter   

Les explico, cn_contable contiene registros contables, una tabla que manejo puede contener cerca de 500 mil registros. La otra tabla es cn_terceros, que puede tener, 20 o 30 mil terceros. Quiero saber si tengo registros contables que no tengan un tercero valido o que exista en la tabla cn_terceros, hice esta consulta pero me demora cerca de 15 minutos y no se como agilizarla para que no tarde tanto. ¿Me pueden dar opiniones?.

Trabajo con MySQL. Gracias a todos.

Víctor Hugo Espínola Domínguez

unread,
Jul 27, 2017, 10:48:43 PM7/27/17
to publice...@googlegroups.com
Prueba así:

SELECT a.codsuc, a.fuecom, a.comcon, a.codter, Cast('No Existe' As Char(9)) AS Tercero_existe
    FROM cn_contable a
    RIGHT JOIN cn_terceros b ON a.codter = b.codter
    WHERE b.codter IS NULL
                     And a.feccom BETWEEN '2000-01-30' AND '2017-07-31'
    GROUP BY a.codter
    ORDER BY a.codter   

Saludos,
Víctor.
Lambaré - Paraguay.

Carlos Miguel FARIAS

unread,
Jul 28, 2017, 7:15:36 AM7/28/17
to Grupo Fox
SELECT a.codsuc, a.fuecom, a.comcon, a.codter, 'No Existe' as Tercero_existe
   FROM cn_contable a
   WHERE a.feccom BETWEEN '2000-01-30' AND '2017-07-31' AND
         a.codter NOT IN (SELECT codter FROM cn_terceros)

   GROUP BY a.codter
   ORDER BY a.codter    

Alejandro Garcia G.

unread,
Jul 28, 2017, 10:05:05 AM7/28/17
to Comunidad de Visual Foxpro en Español
Gracias Victor, Miguel.

Voy a probrarlas y comparar. Ahora me surge otra inquietud, si estas son mas rapidas que la que yo hice

¿Cual es el motivo?.
¿Cuando es recomendable hacer un JOIN o colocar un filtro en el WHERE?.
¿Por que utilizar un SELECT en el WHERE?.

Me gusta aprender y no quedarme con la inquietud, o inquietudes en este caso.

Viejos, gracias nuevamente, pruebo y les digo cuál es mas rápido.

Alejandro Garcia G.

unread,
Jul 28, 2017, 10:09:37 AM7/28/17
to Comunidad de Visual Foxpro en Español
Resultados que me dieron las tres:

El mio, original, conectado remotamente a un base de datos MySQL: 1336.365s
El de Victor: 0.479s
El de Miguel: 5.254s

Todos fueron hechos desde Premiumsoft Navicat Premium, la versión 12.0.10 para Windows 10 x64.

Hago otras pruebas y decido con cual quedarme, voy a probrar dentro del programa.

Víctor Hugo Espínola Domínguez

unread,
Jul 28, 2017, 10:36:41 AM7/28/17
to publice...@googlegroups.com
Prueba modificando el orden del WHERE en la consulta de Carlos Miguel

SELECT a.codsuc, a.fuecom, a.comcon, a.codter, 'No Existe' as Tercero_existe
   FROM cn_contable a
   WHERE a.codter NOT IN (SELECT codter FROM cn_terceros)
            AND a.feccom BETWEEN '2000-01-30' AND '2017-07-31'

   GROUP BY a.codter
   ORDER BY a.codter    

Saludos,
Víctor.
Lambaré - Paraguay.


Carlos Miguel FARIAS

unread,
Jul 28, 2017, 10:44:06 AM7/28/17
to Grupo Fox
Alejandro: Mi consulta es más rápida que la tuya porque no hago apareo de registros, la segunda tabla se lee una sola vez (30000 registros en un saque) y la lista resultante la consulta por cada una de la tabla grande.
La consulta de Victor es más rápida, porque las preguntas las hace por la tabla chica (10 veces menos registros, 10 veces más rápida) y debe buscar por índice en la grande.
Otro factor que puede cambiar completamente el tiempo de respuesta es si sobre a.feccom tienes creado un índice (uno común es suficiente).
Saludos: Miguel, La Pampa (RA)
Reply all
Reply to author
Forward
0 new messages