优化数据比较 [英] Optimizing DATA COMPARED
问题描述
HI GUYS
有人可以告诉我我做的这对吗?
还是wich是最佳实践CLUSTERED OR NOT CLUSTERED
现在我有一个程序,其主要目标是比较5,4534,345行
vs 74,000行
这种比较需要更少的2小时..
但是我很茫然.
这是代码
HI GUYS
someone can tell me if this that i made is correct?
or wich is the best practice CLUSTERED OR NOT CLUSTERED
right now i have a procedure that the main goal is to compare 5,4534,345 rows
vs 74,000 rows
this comparation take more less 2 hrs..
But im loss.
Here is the code
---- THIS TEMP TABLE WILL SET : 5,453,345 ROWS
CREATE TABLE #int_registros_procesar_paso_2 ( id_registro_int int NOT NULL,
cod_ramo int NOT NULL,
cod_agente int NOT NULL,
cod_prefijo_company varchar(10) NOT NULL,
nro_pol_compania varchar(30),
nro_endoso_papel varchar(10),
CONSTRAINT PK_int_registros_procesar_paso_2 primary key clustered(cod_ramo asc,cod_agente asc,cod_prefijo_company asc,nro_pol_compania asc,nro_endoso_papel asc,id_registro_int asc)
)
ON [PRIMARY]
----HERE IS THE QUERY THAT FILL THE TEMP TABLE WITH 5,453,345 ROWS
INSERT INTO #int_registros_procesar_paso_2
SELECT id_registro_int,cod_ramo,cod_agente,LTRIM(RTRIM(cod_prefijo_company)),
LTRIM(RTRIM(nro_pol_compania)),nro_endoso_papel
FROM int_registros_procesar WITH(NOLOCK)
WHERE cod_tipo_interface IN (1)
AND cod_ramo in (123)
AND cod_grupo_endo=1
GROUP BY id_registro_int,cod_ramo,cod_agente,cod_prefijo_company,
nro_pol_compania,nro_endoso_papel
ORDER BY id_registro_int,cod_ramo,cod_agente,cod_prefijo_company,
nro_pol_compania,nro_endoso_papel
---在哪里比较数据
---HERE IS WHERE THE DATA IS COMPARED
IF EXISTS(SELECT 1 FROM #int_registros_procesar_paso_2 WITH(NOLOCK)
WHERE cod_ramo=123
AND cod_agente IS NOT NULL
AND cod_prefijo_company=LTRIM(RTRIM(@PrefijoPapel))--@PrefijoPapel='ABC' for example
AND nro_pol_compania=LTRIM(RTRIM(@FolioPapel)) --@FolioPapel='1234567' for example
AND nro_endoso_papel=0
AND id_registro_int IS NOT NULL)
BEGIN
另一种方法?
在此先感谢
算了吧.
上面显示的所有内容都在"While"周期内
将74,000行分配给@PrefijoPapel
和@FolioPapel
一对一
another way to do this??
Thanks in advance
Forget this.
All shown above is inside of a "While" cycle
the 74,000 rows are assigned to the @PrefijoPapel
AND @FolioPapel
One by One
ALTER PROC [dbo].[sp_EMITIR_CANCELACION_AUTO_ASEGURADORA_NUSIS3_SHORT]
@Fecha1 as DateTime,
@Fecha2 as DateTime
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Prefijo as varchar(3)
DECLARE @Registro as int
DECLARE @Folio as int
DECLARE @Vehiculo as int
DECLARE @Endoso as int
DECLARE @MovEndoso as int
DECLARE @iCant as int
DECLARE @FolioMinimoCan as integer
DECLARE @FolioMaximoCan as integer
DECLARE @FechaIniCan as DateTime
DECLARE @FechaFinCan as DateTime
DECLARE @Prefijo_web_cancelacion as varchar(3)
DECLARE @Folio_Papel as varchar(40)
DECLARE @TotalP as integer
DECLARE @TipoCancelacion as int
DECLARE @ImpPrimaCobertura as float
DECLARE @ImpPrimaPolicyFee as float
DECLARE @ImpPrimaAsistencia as float
DECLARE @ComDerecho as Float
DECLARE @ComPrima as Float
DECLARE @ComAsistencia as Float
DECLARE @TotalVehiculos as int
DECLARE @Producto as varchar(10)
DECLARE @PrefijoPapel as Varchar(5)
DECLARE @FolioPapel as Varchar(30)
DECLARE @EndosoPapel as smallint
DECLARE @PrimaXVehiculo as Float
DECLARE @ErrorValor as int
DECLARE @MensajeError as varchar(500)
SET @FechaIniCan = @Fecha1
SET @FechaFinCan = @Fecha2
SET @Prefijo_web_cancelacion = 'AXW'
SET @iCant = 1
---------INICIAMOS LA CREACION DE TABLAS TEMPORALES
CREATE TABLE #EndCan
(
Prefijo varchar(5) NOT NULL,
Poliza int NOT NULL,
Fecha DateTime NOT NULL,
Usuario int NULL,
Motivo int NULL,
Comentarios nvarchar(510) NULL,
Monto_devolver money NULL,
Identificador int NOT NULL,
Fecha_Cancelacion DateTime NULL,
Tipo int NULL,
Comision_prima money NULL,
Comision_derecho money NULL,
Endoso_Poliza int NOT Null,
Monto_Endoso money NOT NULL,
Derecho_Póliza_devuelto money Null,
COM_PRIMA float NULL,
COM_DERECHO float NULL,
Asistencia_devuelta Float NUll,
CONSTRAINT PK_CancelacionesAutosNUIC primary key clustered(Prefijo asc,Poliza asc,Endoso_Poliza asc,Identificador asc)
)
ON [PRIMARY]
--------------------------------------------------------------------------------------------------------------------------
CREATE TABLE #PolizasCanceladas
(
Prefijo varchar(5) NOT NULL,
Folio int NOT NULL,
Estado_de_Entrada varchar(4) NULL,
Motivo_de_Visita int NULL,
Fecha_de_Inicio DateTime NOT NULL,
Fecha_de_Emisión DateTime NOT NULL,
Hora_de_Inicio varchar(5) NULL,
Nombre varchar(100) NULL,
Calle varchar(70) NULL,
Colonia varchar(50) NULL,
Código_Postal int NULL,
Lada varchar(10) NULL,
Teléfono varchar(20) NULL,
Producto varchar(4) NULL,
Estado varchar(2) NULL,
Municipio varchar(50) NULL,
Agente int NOT NULL,
Prima money NULL,
Derecho_de_Póliza MONEY NULL,
Derecho_de_Póliza_Original MONEY NULL,
Asistencia MONEY NULL,
Descuento FLOAT NULL,
ExtraPrima MONEY NULL,
Vigencia SMALLINT NULL,
Fecha_de_Terminación DATETIME NULL,
Comisión_prima DECIMAL(4,2) NULL,
Comisión_derecho DECIMAL(4,2) NULL,
Prefijo_papel VARCHAR(3),
Folio_papel INT NULL,
SubAgente INT NULL,
Folio_papel_texto CHAR(20) NULL,
CONSTRAINT PK_CanAutosNUIC primary key clustered(Prefijo asc,Folio asc,Agente asc)
)
ON [PRIMARY]
-------------------------------------------------------------------------------------------------------------------------
CREATE TABLE #VehiculoPolizaDetalles
(
Prefijo varchar(5) NOT NULL,
Folio int NOT NULL,
Año int NOT NULL,
Marca int NULL,
Modelo varchar(255) NULL,
Número_de_Serie varchar(20) NULL,
Placas varchar(15) NULL,
Estado_de_las_Placas varchar(2) NULL,
Remolque bit NULL,
Prima MONEY NULL,
Estado_de_Entrada varchar(2) NULL,
DP_adicional Money NULL,
Vehículo smallint NOT NULL,
CONSTRAINT PK_CancelacionAutosNUIC primary key clustered(Prefijo asc,Folio asc,Vehículo asc)
)
ON [PRIMARY]
-------------------------------------------------------------------------------------------------------------------------
CREATE TABLE #int_registros_procesar_paso_2 ( id_registro_int int NOT NULL,
cod_ramo int NOT NULL,
cod_agente int NOT NULL,
cod_prefijo_company varchar(10) NOT NULL,
nro_pol_compania varchar(30),
nro_endoso_papel varchar(10),
CONSTRAINT PK_int_registros_procesar_paso_2 primary key clustered(cod_ramo asc,cod_agente asc,cod_prefijo_company asc,nro_pol_compania asc,nro_endoso_papel asc,id_registro_int asc)
)
ON [PRIMARY]
-------------------------------------------------------------------------------------------------------------------------
CREATE TABLE #pv_datos_adic_paso_cancelacion (id_pv int NOT NULL,
nro_pol_extendido varchar(30) NOT NULL,
nro_endoso_papel int NOT NULL,
cod_ramo int NOT NULL,
cod_agente int NOT NULL,
CONSTRAINT PK_pv_datos_adic_paso_cancelacion primary key clustered(cod_ramo asc,cod_agente asc,nro_pol_extendido asc,nro_endoso_papel asc,id_pv asc)
)
ON [PRIMARY]
-------------------------------------------------------------------------------------------------------------------------
INSERT INTO #EndCan
SELECT EC.Prefijo,
EC.Poliza ,
EC.Fecha,
EC.Usuario ,
EC.Motivo,
EC.Comentarios ,
EC.Monto_devolver,
EC.Identificador,
EC.Fecha_Cancelacion,
EC.Tipo,
EC.Comision_prima,
EC.Comision_derecho,
EC.Endoso_Poliza ,
EC.Monto_Endoso,
EC.Derecho_Póliza_devuelto,
EC.COM_PRIMA,
EC.COM_DERECHO,
EC.Asistencia_devuelta
FROM NUSIS3.dbo.Endoso_Cancelacion EC
WHERE EC.Fecha BETWEEN @FechaIniCan AND @FechaFinCan AND Ec.Monto_Endoso > 0
AND EC.Fecha BETWEEN @FechaIniCan AND @FechaFinCan
order by EC.Poliza,EC.identificador DESC
INSERT INTO #PolizasCanceladas
SELECT SUBSTRING(Prefijo,1,3),
Folio,
SUBSTRING(Estado_de_Entrada,1,2),
Motivo_de_Visita,
Fecha_de_Inicio,
Fecha_de_Emisión,
Hora_de_Inicio,
SUBSTRING(Nombre,1,100),
SUBSTRING(Calle,1,70),
SUBSTRING(Colonia,1,50),
Código_Postal,
SUBSTRING(Lada,1,5),
SUBSTRING(Teléfono,1,20),
SUBSTRING(Producto,1,4),
SUBSTRING(Estado,1,2),
SUBSTRING(Municipio,1,50),
Agente,
Prima,
Derecho_de_Póliza,
Derecho_de_Póliza_Original,
Asistencia,
Descuento,
ExtraPrima,
Vigencia,
Fecha_de_Terminación,
Comisión_prima,
Comisión_derecho,
Prefijo_papel,
Folio_papel,
SubAgente,
Folio_papel_texto
FROM NUSIS3.dbo.PolizasParaCancelaciones
WHERE Prefijo=@Prefijo_web_cancelacion
AND Folio in (SELECT DISTINCT Poliza FROM NUSIS3.dbo.Endoso_Cancelacion EC WHERE Ec.Monto_Endoso > 0
AND EC.Fecha BETWEEN @FechaIniCan AND @FechaFinCan)
INSERT INTO #VehiculoPolizaDetalles
SELECT Prefijo ,
Folio,
Año,
Marca,
Modelo,
Número_de_Serie,
Placas,
Estado_de_las_Placas,
Remolque,
Prima,
Estado_de_Entrada,
DP_adicional,
Vehículo
FROM NUSIS3.dbo.VehiculosParaCancelaciones
WHERE Prefijo=@Prefijo_web_cancelacion
AND Folio in (SELECT DISTINCT Poliza FROM NUSIS3.dbo.Endoso_Cancelacion EC WHERE Ec.Monto_Endoso > 0
AND EC.Fecha BETWEEN @FechaIniCan AND @FechaFinCan)
SELECT *
INTO #ConductorPolizaCan
FROM NUSIS3.dbo.ConductoresParaCancelaciones
WHERE Prefijo=@Prefijo_web_cancelacion
AND Folio in (SELECT DISTINCT Poliza FROM NUSIS3.dbo.Endoso_Cancelacion EC WHERE Ec.Monto_Endoso > 0
AND EC.Fecha BETWEEN @FechaIniCan AND @FechaFinCan)
--SELECT *
--INTO #VehiculoCancelacionAutos
--FROM SQLMONTERREY.NUSIS.dbo.VehiculosCancelacionAuto_Proporcional WHERE Prefijo=@Prefijo_web_cancelacion
--AND Folio IN (SELECT Folio FROM #PolizasCanceladas)
-----VehiculoCancelacionAutos
SELECT *
INTO #Marca
FROM NUSIS3.dbo.Marca_de_Auto
WHERE Subtipo_de_producto=1 AND Exclusivo_National=0
SELECT *
INTO #ProductoNUICSISE
FROM TPROD_NUICSISE
SELECT *
INTO #ConductorFake
FROM dbo.ConductorFake
INSERT INTO #int_registros_procesar_paso_2
SELECT id_registro_int,cod_ramo,cod_agente,LTRIM(RTRIM(cod_prefijo_company)),LTRIM(RTRIM(nro_pol_compania)),nro_endoso_papel
FROM int_registros_procesar WITH(NOLOCK)
WHERE cod_tipo_interface IN (1)
AND cod_ramo in (123)
AND fec_emision>='20110101'
AND cod_grupo_endo=1
GROUP BY id_registro_int,cod_ramo,cod_agente,cod_prefijo_company,nro_pol_compania,nro_endoso_papel
ORDER BY id_registro_int,cod_ramo,cod_agente,cod_prefijo_company,nro_pol_compania,nro_endoso_papel
INSERT INTO #pv_datos_adic_paso_cancelacion
SELECT ph.id_pv,pda.nro_pol_extendido,Isnull(nro_endoso_papel,0) as nro_endoso_papel,cod_ramo,cod_agente
FROM pv_datos_adic pda WITH(NOLOCK), pv_header ph WITH(NOLOCK)
WHERE ph.id_pv = pda.id_pv
AND ph.cod_ramo in (123,125,126,127)
AND ph.fec_emi>='20110901'
SELECT 'EMPIEZA LA EMISION'
SELECT @TotalP=COUNT(Poliza) FROM #EndCan
WHILE (@iCant<=@TotalP)
BEGIN
-----CONSULTA SI POLIZA EXISTE----------------------------------------------
SELECT TOP 1 @Folio=ECT.Poliza FROM #EndCan ECT
SELECT TOP 1 @Endoso=Identificador,
@ImpPrimaCobertura=Monto_Endoso,@ImpPrimaPolicyFee=Derecho_Póliza_Devuelto,@ImpPrimaAsistencia=Asistencia_Devuelta,
@ComPrima=Com_Prima,@ComDerecho=Com_Derecho,@EndosoPapel=Endoso_Poliza
FROM #EndCan WHERE Prefijo=@Prefijo_web_cancelacion
AND Poliza=@Folio AND Endoso_Poliza IS NOT NULL AND Identificador IS NOT NULL
-------------------------------------------------------------------------------
SELECT @Folio_Papel=cast(CONVERT(nvarchar(5),PA.Prefijo_Papel)+'-'+ CONVERT(nvarchar(20),PA.Folio_Papel_Texto) as nvarchar(50)),@Producto=PA.Producto,@PrefijoPapel=PA.Prefijo_Papel,@FolioPapel=PA.Folio_Papel_TextoFROM #PolizasCanceladas PA
WHERE PA.Prefijo=@Prefijo_web_cancelacion
AND PA.Folio=@Folio
AND PA.Agente IS NOT NULL
SELECT @TotalVehiculos=count(1) FROM #VehiculoPolizaDetalles VP
WHERE VP.Folio=@Folio
AND VP.Prefijo=@Prefijo_web_cancelacion
AND VP.Vehículo IS NOT NULL
IF EXISTS(SELECT 1 FROM #int_registros_procesar_paso_2 WITH(NOLOCK)
WHERE cod_ramo=123
AND cod_agente IS NOT NULL
AND cod_prefijo_company=LTRIM(RTRIM(@PrefijoPapel))--@PrefijoPapel='ABC' for example
AND nro_pol_compania=LTRIM(RTRIM(@FolioPapel)) --@FolioPapel='1234567' for example
AND nro_endoso_papel=0
AND id_registro_int IS NOT NULL)
BEGIN
the code shown above. is when i create and fill all the tmp tables. i think that in this part is the problem..
Thanks in advance
the code shown above. is when i create and fill all the tmp tables. i think that in this part is the problem..
Thanks in advance
推荐答案
reviewing the code, I realize, in the querys I did not need all the columns and I reduced the columns and greatly improved response time
Thanks people!!
reviewing the code, I realize, in the querys I did not need all the columns and I reduced the columns and greatly improved response time
Thanks people!!
IMO the best way to enhance the comparison is to do this using sets. Since you didn''t post where the values for your variables are actually coming, it''s quite impossible to modify this correctly, but you could perhaps use something like:
IMO the best way to enhance the comparison is to do this using sets. Since you didn''t post where the values for your variables are actually coming, it''s quite impossible to modify this correctly, but you could perhaps use something like:
SELECT *
FROM #int_registros_procesar_paso_2 t1, theOtherTable t2
WHERE t1.cod_ramo=123
AND t1.cod_agente IS NOT NULL
AND t1.cod_prefijo_company=LTRIM(RTRIM(t2.PrefijoPapel))
AND nro_pol_compania=LTRIM(RTRIM(t2.FolioPapel))
AND t1.nro_endoso_papel=0
AND t1.id_registro_int IS NOT NULL
AND other possible conditions to t2
Something like that should give you the matches for those tables.
Something like that should give you the matches for those tables.
这篇关于优化数据比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!