2017-08-08 33 views
-1

我有一個表,你可以在我的SQL Server看到:我的搜索是SQL Server很慢

CREATE TABLE [dbo].[Cars](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [VIN] [nvarchar](max) NULL, 
    [ChassisNumber] [nvarchar](max) NULL, 
    [PlaqueCoded] [nvarchar](max) NULL, 
    [EngineNumber] [nvarchar](max) NULL, 
    [SystemType] [nvarchar](max) NULL, 
    [CarType] [nvarchar](max) NULL, 
    [CarTipe] [nvarchar](max) NULL, 
    [FuelType] [nvarchar](max) NULL, 
    [FuelSystem] [nvarchar](max) NULL, 
    [Model] [int] NULL, 
    [Color] [nvarchar](max) NULL, 
    [SubmitDatetime] [datetime] NOT NULL, 
    [ExpireDatetime] [datetime] NOT NULL, 
    [ReferenceOrganization] [nvarchar](max) NULL, 
    [ReferenceId] [nvarchar](max) NULL, 
    [Comment] [nvarchar](max) NULL, 
CONSTRAINT [PK_Cars] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [FullOrderDateRangePScheme]([Model]) 

我有1600萬條記錄這個表裏面。所以,你知道該表存儲有關汽車的所有信息。所以我決定根據車型來創建文件組,這意味着我保存汽車的同型號一個文件組中,你可以看到:

FILEGROUP [Filegroup_1395] 
(NAME = N'data_1395', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\data_1395.ndf' , SIZE = 10240KB , MAXSIZE = 10240000KB , FILEGROWTH = 512000KB), 
FILEGROUP [Filegroup_1396] 
(NAME = N'data_1396', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\data_1396.ndf' , SIZE = 10240KB , MAXSIZE = 10240000KB , FILEGROWTH = 512000KB), 
FILEGROUP [Filegroup_1397] 
(NAME = N'data_1397', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\data_1397.ndf' , SIZE = 566976KB , MAXSIZE = 10240000KB , FILEGROWTH = 512000KB) 

所以我創建這個函數來

CREATE PARTITION FUNCTION [FullOrderDateKeyRangePFN](int) AS RANGE LEFT FOR VALUES (1395, 1396, 1397) 
GO 
/****** Object: PartitionScheme [FullOrderDateRangePScheme] Script Date: 8/8/2017 11:51:38 PM ******/ 
CREATE PARTITION SCHEME [FullOrderDateRangePScheme] AS PARTITION [FullOrderDateKeyRangePFN] TO ([Filegroup_1395], [Filegroup_1396], [Filegroup_1397]) 
GO 

作爲一個說明的VIN是獨一無二的。我的主要搜索vin.i創建我的表這些指標:

CREATE CLUSTERED INDEX [ClusteredIndex-20170808-232559] ON [dbo].[Cars] 
(
    [Model] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [FullOrderDateRangePScheme]([Model]) 
GO 
SET ANSI_PADDING ON 
GO 

CREATE NONCLUSTERED INDEX [NonClusteredIndex-20170808-232524] ON [dbo].[Cars] 
(
    [Id] ASC 
) 
INCLUDE ( [VIN]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [FullOrderDateRangePScheme]([Model]) 
GO 

我的查詢是這樣的:

select * from cars where vin='IRFC1374GH7162K' 

我的問題是:
我該如何做更多的事情來提高性能?我的索引能幫忙嗎?

我在調,使得新

+0

請投票評論請您 –

+1

我沒有DV,但問題和查詢使用的是什麼 – TheGameiswar

+1

我建議看看這個鏈接(https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)來提出問題 – TheGameiswar

回答

1

您的查詢是這樣的

select * from cars where vin='IRFC1374GH7162K' 

當前的指數是不是在所有有幫助您查詢..

所以讓你的查詢有更好的表現,我建議..添加非聚集索引

CREATE NONCLUSTERED INDEX [NonClusteredIndex-20170808-232524] ON [dbo].[Cars] 
(
    [vin] ASC 
) 
INCLUDE ( remaining columns) 

這將是一個問題,因爲如果您使用的是sql2016之前的版本,則最大索引密鑰大小爲900字節,對於大於2016的版本,限制爲1700字節。

另外我看到,您的搜索欄不是那麼龐大(IRFC1374GH7162K) ,所以我建議調整爲nvarchar(100)。所有列都需要,因爲你正在做select *

有了這個,你將有維護一個單獨的結構的開銷......但這有助於你的查詢..如果你不需要所有的列將會有更少的開銷

+0

謝謝。最後一個問題,我想知道最好是有一個文件組的文件或每個文件有一個文件組? –

+0

如果不將文件組放在單獨的磁盤上,則包含文件或文件的每個文件組的文件組將不會有太大幫助。將磁盤放置在單獨的磁盤上有助於加快備份速度。這是根據我的理解 – TheGameiswar

+0

,您還需要遵循最佳實踐,如單獨的驅動器和tempdb磁盤配置中的數據和日誌文件。如果您爲單個表看到很多IO,然後創建一個新文件組並將其放置在單獨的磁盤上可能會有所幫助 – TheGameiswar