2

私は以下のクエリを実行しています。これは主に25レコードを返します。しかし、それは約20秒かかる。また、テーブル内のレコードの総数は400,000未満です。以下はSQLパフォーマンス、実行プランのほとんどがインデックスの代わりにインデックススキャンを表示します。シーク

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も簡単ですがOKです。 – Igor

+0

既存の索引に対する索引探索によって、 'Tickets'の述語もその組合せも効率的に実装できないため、索引走査は驚くことではありません。 – mustaccio

答えて

0

可能な場合、彼らは遅いので、あなたは、スカラーと複数ステートメントのUDFを避ける必要があります。そして、あなたは絶対に避けなければなりません。 dbo.DateOnly(Convert(date,に置き換えると役立ちます。

私が興味があるのは、将来のチケットはありますか?そしてもしあれば、あなたは本当にそれらをスキップしたいですか?チャンスは、betweenを簡単にTickets.dtCreated >= convert(date, DATEADD(day, -60, GETDATE()))に置き換えることができます。

+0

クエリにアクセスできないため、DB側で改善できる提案はありますか? – Krunal

+0

SQL ServerにはインラインスカラーUDFがありません。そのため、オプティマイザでは設計上ブラックボックスです。私はクエリを変更せずに改善する方法は見当たりません。 –

関連する問題