NOTE : Table Valued Paramter is having 196 rows & MST_DOC Table is having 10,000 rows There are no indexes on the MST_DOC Table
WAY 1 WITH NOT IN (this is taking 30 second to execute one Query)
ALTER PROC [dbo].[BULK_INSERT_DOC]
(
@pCREATED_BY VARCHAR(50),
@dt as [dbo].[MST_DOC_02] readonly --Table valued Parameter
)
AS
BEGIN
--Inserted Into Temp Table From @DT which is Table Valued Parameter
SELECT * INTO #TEMP_INSERT FROM @DT WHERE
DOC_CODE + DOC_NAME + doc_desc
NOT IN(SELECT DOC_CODE + DOC_NAME + doc_desc FROM MST_DOC with(nolock))
--Inserted Into Temp Table From @DT which is Table Valued Parameter
SELECT * INTO #TEMP_UPDATE FROM @DT
WHERE DOC_CODE + DOC_NAME + doc_desc
IN (SELECT DOC_CODE + DOC_NAME + doc_desc FROM MST_DOC with(nolock))
--Remaining Logic
END
WAY 2 WITH NOT EXIST (this is taking 10 seconds)
ALTER PROC [dbo].[BULK_INSERT_DOC]
(
@pCREATED_BY VARCHAR(50),
@dt as [dbo].[MST_DOC_02] readonly --Table valued Parameter
)
AS
BEGIN
Begin --Creation Of Temp Tables
Create Table #TempMST_Doc (
[DOC_CODE] Varchar(500) COLLATE database_default,
[DOC_NAME] Varchar(500) COLLATE database_default,
[DOC_DESC] Varchar(500) COLLATE database_default,
[ENTRYDATE] Varchar(100) COLLATE database_default,
[DEPT_ID] Varchar(100) COLLATE database_default,
[FACILITY_ID] Varchar(100) COLLATE database_default,
[ACT_LOCID] Varchar(50) COLLATE database_default,
[Doc_Data] Varchar(5000) COLLATE database_default)
CREATE nonCLUSTERED INDEX IX_1 on #TempMST_Doc ([DOC_CODE])
CREATE nonCLUSTERED INDEX IX_2 on #TempMST_Doc ([DOC_NAME])
CREATE nonCLUSTERED INDEX IX_3 on #TempMST_Doc ([DOC_DESC])
Create Table #TEMP_INSERT ([DOC_CODE] Varchar(5000) COLLATE database_default,
[DOC_NAME] Varchar(5000) COLLATE database_default,
[DOC_DESC] Varchar(5000) COLLATE database_default,
[ENTRYDATE] Varchar(100) COLLATE database_default,
[DEPT_ID] Varchar(100) COLLATE database_default,
[FACILITY_ID] Varchar(100) COLLATE database_default,
[ACT_LOCID] Varchar(50) COLLATE database_default)
Create Table #TEMP_UPDATE ([DOC_CODE] Varchar(5000) COLLATE database_default,
[DOC_NAME] Varchar(5000) COLLATE database_default,
[DOC_DESC] Varchar(5000) COLLATE database_default,
[ENTRYDATE] Varchar(100) COLLATE database_default,
[DEPT_ID] Varchar(100) COLLATE database_default,
[FACILITY_ID] Varchar(100) COLLATE database_default,
[ACT_LOCID] Varchar(50) COLLATE database_default)
End
Insert Into #TempMST_Doc ([DOC_CODE] ,[DOC_NAME] ,[DOC_DESC], [Doc_Data] )
Select [DOC_CODE] ,[DOC_NAME] ,[DOC_DESC],([DOC_CODE]+[DOC_NAME]+[DOC_DESC]) From @dt
Insert Into #TEMP_INSERT ([DOC_CODE] ,[DOC_NAME] ,[DOC_DESC] ,[ENTRYDATE] ,[DEPT_ID] ,[FACILITY_ID] ,[ACT_LOCID])
Select [DOC_CODE] ,[DOC_NAME] ,[DOC_DESC] ,[ENTRYDATE] ,[DEPT_ID] ,[FACILITY_ID] ,[ACT_LOCID] From
#TempMST_Doc Tempdoc
WHERE
NOT Exists
(SELECT null FROM MST_DOC With (NoLock) Where
([Doc_Data]) =
(MST_DOC.DOC_CODE + MST_DOC.DOC_NAME + MST_DOC.doc_desc))
Insert Into #TEMP_UPDATE ([DOC_CODE] ,[DOC_NAME] ,[DOC_DESC] ,[ENTRYDATE] ,[DEPT_ID] ,[FACILITY_ID] ,[ACT_LOCID])
Select [DOC_CODE] ,[DOC_NAME] ,[DOC_DESC] ,[ENTRYDATE] ,[DEPT_ID] ,[FACILITY_ID] ,[ACT_LOCID] From
#TempMST_Doc Tempdoc
WHERE
Exists
(SELECT null FROM MST_DOC With (NoLock) Where
([Doc_Data]) =
(MST_DOC.DOC_CODE + MST_DOC.DOC_NAME + MST_DOC.doc_desc))
END
I have used both the method with NOT IN & also with Not Exists but not able to get proper output.
I have thought of creating indexes in temporary table but it is not giving me any enhanced output.
Below is the Indexing used in the Temporary table
CREATE nonCLUSTERED INDEX IX_1 on #TempMST_Doc ([DOC_CODE])
CREATE nonCLUSTERED INDEX IX_2 on #TempMST_Doc ([DOC_NAME])
CREATE nonCLUSTERED INDEX IX_3 on #TempMST_Doc ([DOC_DESC])
I have also referred the articles for indexing on to the Temporary table & Table variable. I get to know that it is not the best practice to write the indexes on to both.
I need one more Suggestion that If I use index on Table Variable & on temporary table then what will be good. or any disadvantage of creating the index on the both