2017-08-08 76 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