I have two tables related to each other, each with roughly 200M records.
CREATE TABLE [dbo].[AS_tblTBCDEF](
[CDEF_SOC_NUM] [numeric](5, 0) NULL,
[CDEF_EFF_DATE] [date] NULL,
[CDEF_TYP_BUS] [nvarchar](1) NULL,
[CDEF_CLASS_NUM] [smallint] NULL,
[CDEF_GROUP] [smallint] NULL,
[CDEF_COV_EXP_TYP] [nvarchar](1) NULL,
[CDEF_SCHEDULE] [nvarchar](9) NULL,
[CDEF_LIMIT] [numeric](9, 2) NULL,
[CDEF_LIMIT_PCTILE] [nvarchar](2) NULL,
[CDEF_WHY_NOT_COV] [smallint] NULL,
[CDEF_PROVIEW_GRP] [smallint] NULL,
[CDEF_BAS_ADJ_IND] [nvarchar](1) NULL,
[CDEF_BAS_ADJ_AMT] [numeric](9, 2) NULL,
[CDEF_DEF_TYPE] [nvarchar](1) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[AS_tblTBCDEFD](
[CDEF_DESC_SOC_NUM] [numeric](5, 0) NULL,
[CDEF_DESC_EFF_DATE] [date] NULL,
[CDEF_DESC_TYP_BUS] [nvarchar](1) NULL,
[CDEF_DESC_CLASS] [smallint] NULL,
[CDEF_DESC_GROUP] [smallint] NULL,
[CDEF_DESC_TEXT] [nvarchar](77) NULL
) ON [PRIMARY]
GO
They are joined like this:
FROM [dbo].[AS_tblTBCDEF] GC_TBCDEF
LEFT JOIN [dbo].[AS_tblTBCDEFD] GC_TBCDEFD
ON (GC_TBCDEF.CDEF_GROUP = GC_TBCDEFD.CDEF_DESC_GROUP)
AND (GC_TBCDEF.CDEF_CLASS_NUM = GC_TBCDEFD.CDEF_DESC_CLASS)
AND (GC_TBCDEF.CDEF_TYP_BUS = GC_TBCDEFD.CDEF_DESC_TYP_BUS)
AND (GC_TBCDEF.CDEF_EFF_DATE = GC_TBCDEFD.CDEF_DESC_EFF_DATE)
AND (GC_TBCDEF.CDEF_SOC_NUM = GC_TBCDEFD.CDEF_DESC_SOC_NUM)
These two tables get re-created monthly via an ETL script that is run by a different department. I'm trying to figure out the best way to key/index these tables so that it will actually return data. Right now, it just times out and returns nothing.
I have the following lines I run which add indexes, but it's clearly not enough. I'm looking for suggestions to optimize the join.
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEF]') AND NAME ='idx_Soc_Num')
CREATE INDEX idx_Soc_Num
ON [dbo].[AS_tblTBCDEF] (CDEF_SOC_NUM);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEF]') AND NAME ='idx_Class_Num')
CREATE INDEX idx_Class_Num
ON [dbo].[AS_tblTBCDEF] (CDEF_CLASS_NUM);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEF]') AND NAME ='idx_Eff_Date')
CREATE INDEX idx_Eff_Date
ON [dbo].[AS_tblTBCDEF] (CDEF_EFF_DATE);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEF]') AND NAME ='idx_Typ_Bus')
CREATE INDEX idx_Typ_Bus
ON [dbo].[AS_tblTBCDEF] (CDEF_TYP_BUS);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEF]') AND NAME ='idx_Group')
CREATE INDEX idx_Group
ON [dbo].[AS_tblTBCDEF] (CDEF_GROUP);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEFD]') AND NAME ='idx_Soc_Num')
CREATE INDEX idx_Soc_Num
ON [dbo].[AS_tblTBCDEFD] (CDEF_DESC_SOC_NUM);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEFD]') AND NAME ='idx_Class_Num')
CREATE INDEX idx_Class_Num
ON [dbo].[AS_tblTBCDEFD] (CDEF_DESC_CLASS);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEFD]') AND NAME ='idx_Eff_Date')
CREATE INDEX idx_Eff_Date
ON [dbo].[AS_tblTBCDEFD] (CDEF_DESC_EFF_DATE);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEFD]') AND NAME ='idx_Typ_Bus')
CREATE INDEX idx_Typ_Bus
ON [dbo].[AS_tblTBCDEFD] (CDEF_DESC_TYP_BUS);
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = object_id('[dbo].[AS_tblTBCDEFD]') AND NAME ='idx_Group')
CREATE INDEX idx_Group
ON [dbo].[AS_tblTBCDEFD] (CDEF_DESC_GROUP);
INSERTstatements. Fixing such things before submitting it to re-open review generally works a lot better than just expressing disagreement in a comment.