Sample Header Ad - 728x90

Why is the SQL Server query plan not using indexes in a query almost similar to one that uses indexes?

3 votes
3 answers
1930 views
I have two UPDATE queries that are similar in structure, yet the SQL Server query plan for one shows indexes being used, and for the other it shows only a regular table scan. The following are the queries (as per the query plan, #1 does not use indexes, #2 does)- UPDATE Payment_Metadata SET Payment_Metadata.CommodityCode = 'RAW MATERIALS', Payment_Metadata.C1 = 'RAW MATERIALS', Payment_Metadata.C2 = 'INGREDIENTS', Payment_Metadata.C3 = 'OTHER ', Payment_Metadata.RuleText = '---', Payment_Metadata.LastUpdatedIndex = Payment_Metadata.LastUpdatedIndex + 1, Payment_Metadata.IsExcluded = 0, Payment_Metadata.LogText = 'Commodity>Raw Materials>Ingredients>Other' FROM Payment_Metadata WHERE Payment_Metadata.IsProcessed = 0 AND (Payment_Metadata.EnrichedVendor = 'NFL' OR Payment_Metadata.Vendor_No = 'NFL') The second query uses an index: UPDATE Payment_Metadata SET Payment_Metadata.CommodityCode = 'RAW MATERIALS', Payment_Metadata.C1 = 'RAW MATERIALS', Payment_Metadata.C2 = 'INGREDIENTS', Payment_Metadata.C3 = 'OTHER ', Payment_Metadata.RuleText = '---', Payment_Metadata.LastUpdatedIndex = Payment_Metadata.LastUpdatedIndex + 1, Payment_Metadata.IsExcluded = 0, Payment_Metadata.LogText = 'Commodity>Raw Materials>Ingredients>Other' FROM Payment_Metadata WHERE Payment_Metadata.IsProcessed = 0 AND (Payment_Metadata.EnrichedVendor = '0202054' OR Payment_Metadata.Vendor_No = '0202054') The following is the table definition: CREATE TABLE [dbo].[Payment_Metadata]( [ID] [int] IDENTITY(1,1) NOT NULL, [Company_Code] [varchar](1024) NULL, [Comp_Code_Desc] [varchar](1024) NULL, [Vendor_Acct_Group] [varchar](1024) NULL, [Vendor_No] [varchar](10) NULL, [Vendor_Name] [varchar](1024) NULL, [Vendor_ABN] [varchar](1024) NULL, [Vendor_PTerm] [varchar](1024) NULL, [Vendor_PTerm_Desc] [varchar](1024) NULL, [Purchasing_Group] [varchar](1024) NULL, [Purchasing_Group_Des] [varchar](1024) NULL, [PO_DocType] [varchar](1024) NULL, [PO_DocType_Desc] [varchar](1024) NULL, [Purchasing_Document] [varchar](1024) NULL, [PO_Date] [varchar](1024) NULL, [PO_CreatedBy] [varchar](1024) NULL, [Plant] [int] NULL, [Item_Number] [varchar](1024) NULL, [Material_Number] [varchar](1024) NULL, [Material_Group] [varchar](7) NULL, [Material_Group_Desc] [varchar](1024) NULL, [Account_Assignment] [varchar](32) NULL, [Acct_Assignment_Desc] [varchar](1024) NULL, [GL_Account] [varchar](7) NULL, [GL_Account_Desc] [varchar](1024) NULL, [PO_Desc] [varchar](64) NULL, [PO_Quantity] [decimal](10, 2) NULL, [Order_UOM] [varchar](1024) NULL, [Order_Price_Unit] [varchar](1024) NULL, [Invoice_Receipt] [varchar](1024) NULL, [Invoice_Reference] [varchar](1024) NULL, [Invoice_Date] [datetime] NOT NULL, [Invoice_Scan_Date] [datetime] NULL, [Invoice_Item] [int] NULL, [Invoice_Amount] [decimal](15, 2) NULL, [GST] [decimal](10, 2) NOT NULL, [Invoice_Gross_Amount] [decimal](15, 2) NULL, [Currency] [varchar](1024) NULL, [Document_Type] [varchar](1024) NULL, [Document_Number] [varchar](1024) NULL, [Document_Date] [datetime] NOT NULL, [Posting_Date] [datetime] NOT NULL, [Payment_Term] [varchar](1024) NULL, [Baseline_Date] [datetime] NOT NULL, [Due_Date] [datetime] NOT NULL, [Payment_Document] [varchar](1024) NULL, [Clearing_Date] [datetime] NOT NULL, [CommodityCode] [varchar](128) NULL, [RuleText] [nvarchar](max) NULL, [IsProcessed] [bit] NOT NULL, [DataSource] [varchar](5) NULL, [IsContracted] [bit] NOT NULL, [IsPreferred] [bit] NOT NULL, [VendorRiskScore] [varchar](5) NULL, [EnrichedVendor] [varchar](128) NULL, [LastUpdatedIndex] [int] NOT NULL, [LogText] [nvarchar](max) NULL, [IsExcluded] [bit] NOT NULL, [C1] [varchar](50) NULL, [C2] [varchar](50) NULL, [C3] [varchar](50) NULL, [OriginalVendor] [varchar](60) NULL, [AdjustedAmount] [decimal](15, 2) NULL ) ON [PRIMARY] As you can see, the only change in the WHERE clause is the usage of numeric vs non-numeric characters (which I suspect should not impact the query plan?) There is one non-clustered index on each of the columns EnrichedVendor and Vendor_No. Any help would be appreciated. UPDATE: Including the query plans below, and I noticed that query #1 suggests an index (in green). That may be the solution to the answer. Without indexes enter image description here
Asked by Faredoon (133 rep)
Apr 14, 2015, 08:49 AM
Last activity: Mar 30, 2023, 11:03 AM