2

Я выполняю ниже запрос, который возвращает в основном 25 записей. Но это занимает почти 20 секунд. Также общее количество записей в таблице составляет менее 400 000.Производительность SQL, план выполнения, показывающий главным образом индексный поиск вместо индекса Seek

SELECT * FROM Tickets 
LEFT OUTER JOIN HouseAccounts ON (Tickets.lHouseAccount_ID = HouseAccounts.lAccountID) 
LEFT OUTER JOIN Customers ON (Tickets.lCustomerID = Customers.lCustomerID) 
LEFT OUTER JOIN Vehicles ON (Tickets.lVehicleID = Vehicles.lVehicleID) 
WHERE (Tickets.sTicket_Number) NOT LIKE 'ADJ%' AND dbo.DateOnly(Tickets.dtCreated) between DATEADD(day, -60, dbo.DateOnly(GETDATE())) 
and dbo.DateOnly(GETDATE()) AND (Tickets.bDeleted = 0 or Tickets.bDeleted IS NULL) 

Ниже представлена ​​структура

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[Tickets](
[Ticket_ID] [int] IDENTITY(1,1) NOT NULL, 
[lLocationID] [int] NULL, 
[dtCreated] [datetime] NULL, 
[dtUpdated] [datetime] NULL, 
[dtIn] [datetime] NULL, 
[dtOut] [datetime] NULL, 
[sTicket_Number] [nvarchar](10) NULL, 
[dblTotal] [float] NULL, 
[dblTaxes] [float] NULL, 
[dblTendered] [float] NULL, 
[dblChangeDue] [float] NULL, 
[bPaid] [smallint] NULL, 
[bCash] [smallint] NULL, 
[bCreditCard] [smallint] NULL, 
[bGiftCard] [smallint] NULL, 
[bHouseAccount] [smallint] NULL, 
[lHouseAccount_ID] [int] NULL, 
[sUserName] [nvarchar](25) NULL, 
[lUserID] [int] NULL, 
[lShiftNumber] [int] NULL, 
[imgSignature] [image] NULL, 
[sSignatureFileName] [nvarchar](25) NULL, 
[sPlate] [nvarchar](10) NULL, 
[sMake] [nvarchar](20) NULL, 
[sCarNumber] [nvarchar](25) NULL, 
[sDriverName] [nvarchar](64) NULL, 
[sZipcode] [nvarchar](5) NULL, 
[sAge] [nvarchar](10) NULL, 
[sGender] [nvarchar](10) NULL, 
[sFleetCard] [nvarchar](25) NULL, 
[sFleetCardExp] [nvarchar](8) NULL, 
[bCheck] [smallint] NULL, 
[lVIPAccountID] [int] NULL, 
[lPointsThisVisit] [float] NULL, 
[lGreeterID] [int] NULL, 
[lCustomerID] [int] NULL, 
[lVehicleID] [int] NULL, 
[lWorkOrderID] [int] NULL, 
[sWorkOrderNumber] [nvarchar](8) NULL, 
[sVehicleMake] [nvarchar](20) NULL, 
[sVehicleColor] [nvarchar](20) NULL, 
[sVehicleState] [nvarchar](2) NULL, 
[sVehiclePlate] [nvarchar](9) NULL, 
[sVehicleDamage] [nvarchar](100) NULL, 
[sCustomerName] [nvarchar](25) NULL, 
[dtReturnDate] [datetime] NULL, 
[lOdometer] [int] NULL, 
[sRoomNumber] [nvarchar](6) NULL, 
[sSpaceNumber] [nvarchar](50) NULL, 
[bExpressTicket] [smallint] NULL, 
[lRateStructureId] [int] NULL, 
[sRateStructure] [nvarchar](25) NULL, 
[mRate] [money] NULL, 
[mSurcharge] [money] NULL, 
[mValidation] [money] NULL, 
[mPrepaid] [money] NULL, 
[mRefund] [money] NULL, 
[mMisc] [money] NULL, 
[bVoided] [smallint] NULL, 
[bCheckedOut] [smallint] NULL, 
[bClosedOut] [smallint] NULL, 
[bRefunded] [smallint] NULL, 
[lParkerId] [int] NULL, 
[bUpdated] [smallint] NULL, 
[bIndoor] [smallint] NULL, 
[iTimesPrinted] [smallint] NULL, 
[bAudit] [bit] NULL, 
[bArchived] [bit] NULL, 
[lCounterId] [int] NULL, 
[bPaymentOther] [bit] NULL, 
[sPaymentDescription] [nvarchar](50) NULL, 
[bScanned] [bit] NULL, 
[bPrinted] [bit] NULL, 
[bReversed] [bit] NULL, 
[sCashierTerminal] [nvarchar](50) NULL, 
[sGreeterTerminal] [nvarchar](50) NULL, 
[bLocked] [bit] NULL, 
[bWash] [bit] NULL, 
[bDeleted] [bit] NULL, 
[sDeletedBy] [nvarchar](125) NULL, 
[dtClosed] [datetime] NULL, 
[lCloserId] [int] NULL, 
[lCloserId2] [int] NULL, 
[bBarcodeScanned] [bit] NULL, 
CONSTRAINT [aaaaaTickets_PK] PRIMARY KEY NONCLUSTERED 
(
[Ticket_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 65) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Tickets] ADD CONSTRAINT [DF__Tickets__dblTota__014935CB] DEFAULT ((0)) FOR [dblTotal] 
GO 

ALTER TABLE [dbo].[Tickets] ADD CONSTRAINT [DF__Tickets__bPaid__023D5A04] DEFAULT ((0)) FOR [bPaid] 
GO 

ALTER TABLE [dbo].[Tickets] ADD CONSTRAINT [DF__Tickets__bCash__03317E3D] DEFAULT ((0)) FOR [bCash] 
GO 

ALTER TABLE [dbo].[Tickets] ADD CONSTRAINT [DF__Tickets__bCredit__0425A276] DEFAULT ((0)) FOR [bCreditCard] 
GO 

ALTER TABLE [dbo].[Tickets] ADD CONSTRAINT [DF__Tickets__bGiftCa__0519C6AF] DEFAULT ((0)) FOR [bGiftCard] 
GO 

Билеты таблица А, вот индекс и выполнение план-

enter image description here

enter image description here

Я уже попробовал обновить статистику и обновить индексы. Однако ничего не помогло. Пожалуйста, предложите, как я могу улучшить производительность запроса.

Execution Plan.sqlplan

Execution Plan.xml

Indexes.xlsx

+0

1-й - хорошая работа по включению DDL, а также план выполнения, что редко случается. 2. Есть ли способ включить сохраненный план выполнения в файл, чтобы мы могли открыть его для себя? Думаю, это было бы более выгодно. – Igor

+0

Также копия/вставка индексов в виде текста была бы лучше, чем скриншот, этот скриншот не очень разборчивый (оба они в этом отношении). Индекс DDL также хорошо, если это проще. – Igor

+0

Ни один из предикатов в «Билетах» и их комбинации не может быть эффективно реализован путем поиска индекса по существующим индексам, поэтому сканирование индексов не вызывает удивления. – mustaccio

ответ

0

Вы должны избегать скаляр и multistatement UDF, если это возможно, потому что они медленно. И вы должны обязательно избегать их в условиях, потому что они не поддаются нагибу. Замена dbo.DateOnly( на Convert(date, должна помочь.

Что мне любопытно - есть ли билеты из будущего? И если есть, вы действительно хотите пропустить их? Скорее всего, вы можете заменить это between простым Tickets.dtCreated >= convert(date, DATEADD(day, -60, GETDATE())).

+0

Есть ли предложение, которое я могу улучшить на стороне БД, поскольку запрос недоступен. – Krunal

+0

Sql-сервер не имеет встроенного скалярного UDF, поэтому для оптимизатора это черный ящик по дизайну. Я не вижу способ улучшить это, не меняя запрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^