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

Optimizacion de QUERY SQL

Estas en el tema de Optimizacion de QUERY SQL en el foro de SQL Server en Foros del Web. Saludos tengo la siguiente duda.. estoy haciendo una carga de datos (.dat) a sql a varias tablas especificas... al final decidi trabajar todo con procedimientos ...
  #1 (permalink)  
Antiguo 19/10/2010, 14:45
 
Fecha de Ingreso: enero-2010
Ubicación: Stgo - Chile
Mensajes: 73
Antigüedad: 14 años, 3 meses
Puntos: 0
Optimizacion de QUERY SQL

Saludos tengo la siguiente duda..

estoy haciendo una carga de datos (.dat) a sql a varias tablas especificas... al final decidi trabajar todo con procedimientos almacenados.- en el sentido de que a traves de VB6, voy pasando todos los parametros correspondientes para su insercion o update como corresponde.- uno de los SP es asi:

USE [BD_Cas]
GO
/****** Object: StoredProcedure [dbo].[bd_cas_t_cara_a] Script Date: 10/19/2010 17:43:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[bd_cas_t_cara_a]
@region smallint,
@provincia smallint,
@comuna smallint,
@folio integer,
----
@c_uv varchar(3),
@c_tipo_a varchar(2),
@poblacion varchar(3),
@dc_manzana varchar(4),
@c_calle varchar(4),
@domicilio varchar(6),
@block varchar(3),
@depto varchar(4),
@encuestador smallint,
@puntaje float,
@fecha_ap varchar(8)
as
declare @folio1 integer
declare @region1 integer
declare @provincia1 integer
declare @comuna1 integer
SELECT @folio1 = dc_Folio, @region1 = dc_Region, @provincia1 = dc_Provincia, @comuna1 = dc_Comuna FROM t_cara_a WHERE dc_Region = @region AND dc_Provincia = @provincia AND dc_Comuna = @comuna AND dc_Folio = @folio

----
declare @urb_rural integer
set @urb_rural =(SELECT dc_urbano_rural FROM t_calles
WHERE dc_Region = @region
AND dc_Provincia = @provincia
AND dc_Comuna = @comuna
AND dc_Calle = @c_calle)
if @urb_rural is null
begin
set @urb_rural = 1
end
-----------------------------------------------------------------------
declare @address varchar(6)
set @address = substring(CONVERT(varchar(8), @domicilio),1,6)
-----------------------------------------------------------------------
if @block = ''
begin
set @block = 0
end
else
begin
set @block = substring(convert(varchar(3), @block),1,3)
end
if @depto = ''
begin
set @depto = 0
end
else
begin
set @depto = substring(convert(varchar(4), @depto),1,4)
end
begin
if @folio = @folio1 and @region = @region1 and @provincia = @provincia1 and @comuna = @comuna1
begin
DELETE t_cara_a where dc_Folio = @folio
INSERT INTO t_cara_a (DC_region, dc_Provincia, DC_Comuna, DC_Folio, dc_urbano_rural, dc_unidad_vecinal,
dc_agrup_habit, dc_poblacion, dc_manzana, dc_calle, dg_numero_casa, dg_numero_block_casa, dg_numero_depto_sitio,
dc_encuestador, di_Ptje_Factor_Total, df_encuesta)
VALUES (@region, @provincia, @comuna, @folio,@urb_rural, @c_uv, @c_tipo_a, @poblacion, @dc_manzana,
@c_calle, @address, @block,@depto, @encuestador,@puntaje ,@fecha_ap)
--------------------------------------------------------------------------
--UPDATE t_cara_a SET dc_urbano_rural = @urb_rural, dc_unidad_vecinal = @c_uv, dc_agrup_habit = @c_tipo_a,
--dc_poblacion = @poblacion, dc_manzana = @dc_manzana, dc_calle = @c_calle, dg_numero_casa = @domicilio,
--dg_numero_block_casa = @block, dg_numero_depto_sitio = @depto, dc_encuestador = @encuestador,
--di_Ptje_Factor_Total = @puntaje, df_encuesta = @fecha_ap
--WHERE dc_Region = @region AND dc_Provincia = @provincia AND dc_Comuna = @comuna AND dc_Folio = @folio
end
else
begin
INSERT INTO t_cara_a (DC_region, dc_Provincia, DC_Comuna, DC_Folio, dc_urbano_rural, dc_unidad_vecinal,
dc_agrup_habit, dc_poblacion, dc_manzana, dc_calle, dg_numero_casa, dg_numero_block_casa, dg_numero_depto_sitio,
dc_encuestador, di_Ptje_Factor_Total, df_encuesta)
VALUES (@region, @provincia, @comuna, @folio,@urb_rural, @c_uv, @c_tipo_a, @poblacion, @dc_manzana,
@c_calle, @address, @block,@depto, @encuestador,@puntaje ,@fecha_ap)
end

end
SET NOCOUNT ON

Ahora mi duda es ... cuando hago la 1era insercion con la Tabla vacia, la insercion la hace super rapido, pero cuando pasa la 2da ronda y inserto anteriormente los datos despues al momento de hacer el update encuentro que se demora mucho... tengo dudas no se si es mejor ocupar un UPDATE o un DELETE/INSERT ..

o si hay alguna forma de optimizar mas el procedimiento almacenado para que corra de mejor forma..

Ojala puedan dejar sus comentarios para poder resolver este enigma para mi .. jaja gracias de antemano a todos.
Saludos cordiales.
  #2 (permalink)  
Antiguo 19/10/2010, 16:52
Avatar de Inicia  
Fecha de Ingreso: octubre-2010
Ubicación: Actualmente en GDL
Mensajes: 135
Antigüedad: 13 años, 6 meses
Puntos: 1
Exclamación Respuesta: Optimizacion de QUERY SQL

Yo tengo una duda parecida, por la cantidad de datos que manejo, la consulta se me hace muy lenta en este query:


Código SQL:
Ver original
  1. [QUOTE]SELECT  
  2.     C.Clave, C.RazonSocial, C.Telefono1, C.Telefono2, Cd.Descripcion AS Ciudad, M.Descripcion AS Municipio, C.Estado, C.Email, C.Vendedor, V.Nombre,  C.ZonaVenta, C.ABCVentas,
  3.     FechaFactura = (SELECT MAX(FechaCaptura) FROM FacturaEncabezado WHERE Estatus = 'A' AND C.Clave = Cliente)
  4. INTO    #TemClientesUltimaVta
  5. FROM    Cliente C, Ciudad Cd, Vendedor V, Municipio M
  6. WHERE   C.Ciudad = Cd.Clave AND C.Vendedor = V.Clave AND M.Clave = C.Municipio[/QUOTE]
Si encuentras la respuesta espero que nos ayude a los dos y si la encuentro te aviso. =) suerte

Última edición por Inicia; 19/10/2010 a las 16:55 Razón: Quiero darle seguimiento
  #3 (permalink)  
Antiguo 19/10/2010, 16:58
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Optimizacion de QUERY SQL

Inicia

¿Porque no utilizas JOIN?
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 20/10/2010, 08:21
Avatar de Inicia  
Fecha de Ingreso: octubre-2010
Ubicación: Actualmente en GDL
Mensajes: 135
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: Optimizacion de QUERY SQL

Gracias islas en vez de usar un max use un top 1 con orden de fecha desc y con eso mi consulta dura 1 segundo al ejecutarse :)

Código SQL:
Ver original
  1. FechaFactura = (SELECT Top(1)FechaCaptura FROM FacturaEncabezado WHERE Estatus = 'A' AND C.Clave = Cliente ORDER BY fechacaptura DESC)
  #5 (permalink)  
Antiguo 20/10/2010, 08:58
 
Fecha de Ingreso: octubre-2010
Mensajes: 31
Antigüedad: 13 años, 5 meses
Puntos: 0
Pregunta Respuesta: Optimizacion de QUERY SQL

Hola buen dia!!!

Disculpen soy nuevo en el foro y no se como iniciar mi propio tema, bueno mi pregunta es:

tengo dos bases de datos en sql server 2008, en una base tengo 2 tablas que contienen miles de datos, y en la segunda base tengo una tabla, esa tabla se llenara con algunos campos de las dos tablas de la otra base. bueno para hacer esto ago un select para no repetir los datos, mi problema es que si le ago un select a la tabla 1 tiene 400000 datos y le ago un select a las dos tablas de la misma base uniendolas por un campo que tienen en comun (ojo no son llave primaria ni foranea, solo campos que tiene la misma informacion) y me devuelve datos de mas 1457000 quisiera ver si alguien me puede ayudar para que me regrese solo los datos que realmente existen, deje mi consulta haber si alguien me puede ayudar de antemano gracias.

select null, ac.CLVE_CAT, CLSE_PRE,
ac.SUP_T, ac.SUP_C, ac.VLR_T, ac.VLR_C, ac.CNS_AD, ac.BSS_GRVBLS, ac.FCHA_AVL,
um.Tpo_Mvmiento, um.Fcha_Mvmiento, ac.NMBRE_P, ac.DMCLIO_L, ac.MOV_HCHO, null, null, null, null, null,
null from BD_PADRON_CATASTRAL..Altas_Catastro as ac inner join BD_PADRON_CATASTRAL..Usuarios_Movimientos as um on
ac.CLVE_CAT = um.Cuenta_Prdial


los campos null son solo para rellenar la tabla destino.
  #6 (permalink)  
Antiguo 20/10/2010, 09:19
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Optimizacion de QUERY SQL

No hagas un INNER JOIN, cambialo por un EXISTS
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 20/10/2010, 09:20
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Optimizacion de QUERY SQL

Inicia: Yo pregunto, que porque no usas JOIN en esta sentencia:

Código SQL:
Ver original
  1. FROM    Cliente C, Ciudad Cd, Vendedor V, Municipio M
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 20/10/2010, 14:49
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Optimizacion de QUERY SQL

Esto es lo maximo que yo puedo optimizar sin tener mas conocimiento de tu base.
Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[bd_cas_t_cara_a]
  2. @region SMALLINT,
  3. @provincia SMALLINT,
  4. @comuna SMALLINT,
  5. @folio INTEGER,
  6. @c_uv VARCHAR(3),
  7. @c_tipo_a VARCHAR(2),
  8. @poblacion VARCHAR(3),
  9. @dc_manzana VARCHAR(4),
  10. @c_calle VARCHAR(4),
  11. @domicilio VARCHAR(6),
  12. @block VARCHAR(3),
  13. @depto VARCHAR(4),
  14. @encuestador SMALLINT,
  15. @puntaje FLOAT,
  16. @fecha_ap VARCHAR(8)
  17. AS
  18.  
  19. DECLARE @urb_rural INTEGER
  20. SET @urb_rural = 1
  21. SELECT @urb_rural = dc_urbano_rural
  22. FROM t_calles
  23. WHERE dc_Region = @region AND dc_Provincia = @provincia AND dc_Comuna = @comuna AND dc_Calle = @c_calle
  24.  
  25. SELECT @block = CASE WHEN @block = '' THEN 0 ELSE SUBSTRING(CONVERT(VARCHAR(3), @block),1,3) END
  26. SELECT @depto = CASE WHEN @depto = '' THEN 0 ELSE SUBSTRING(CONVERT(VARCHAR(4), @depto),1,4) END
  27.  
  28. IF EXISTS(
  29.     SELECT 1
  30.     FROM t_cara_a
  31.     WHERE dc_Region = @region AND dc_Provincia = @provincia AND dc_Comuna = @comuna AND dc_Folio = @folio
  32. )
  33. BEGIN
  34.     DELETE t_cara_a WHERE dc_Folio = @folio
  35.     INSERT INTO t_cara_a (DC_region, dc_Provincia, DC_Comuna, DC_Folio, dc_urbano_rural, dc_unidad_vecinal,
  36.     dc_agrup_habit, dc_poblacion, dc_manzana, dc_calle, dg_numero_casa, dg_numero_block_casa, dg_numero_depto_sitio,
  37.     dc_encuestador, di_Ptje_Factor_Total, df_encuesta)
  38.     VALUES (@region, @provincia, @comuna, @folio, @urb_rural, @c_uv, @c_tipo_a, @poblacion, @dc_manzana,
  39.     @c_calle, @domicilio, @block,@depto, @encuestador,@puntaje ,@fecha_ap)
  40. END
  41. ELSE
  42. BEGIN
  43.     INSERT INTO t_cara_a (DC_region, dc_Provincia, DC_Comuna, DC_Folio, dc_urbano_rural, dc_unidad_vecinal,
  44.     dc_agrup_habit, dc_poblacion, dc_manzana, dc_calle, dg_numero_casa, dg_numero_block_casa, dg_numero_depto_sitio,
  45.     dc_encuestador, di_Ptje_Factor_Total, df_encuesta)
  46.     VALUES (@region, @provincia, @comuna, @folio, @urb_rural, @c_uv, @c_tipo_a, @poblacion, @dc_manzana,
  47.     @c_calle, @domicilio, @block,@depto, @encuestador,@puntaje ,@fecha_ap)
  48. END
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #9 (permalink)  
Antiguo 21/10/2010, 14:00
 
Fecha de Ingreso: enero-2010
Ubicación: Stgo - Chile
Mensajes: 73
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Optimizacion de QUERY SQL

vale men la probare aer como me va gracias de antemano

Etiquetas: query, sql
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:45.