我在 sql 服务器中的搜索速度很慢
My search is very slow in sql server
我有一个 table,你可以在我的 sql 服务器中看到它:
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])
我在这个 table 里面有 16000000 条记录。所以你知道这个 table 存储了关于 cars.so 的所有信息我决定创建基于车型的文件组,这意味着我保存了如您所见,同一个文件组中有相同型号的汽车:
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 在我的 table 上创建这些索引:
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'
我的问题是:
我怎样才能做更多的事情来提高性能?我的索引会有帮助吗?
我是调音新手
你的查询是这个
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 *
有了这个,您将有维护一个单独结构的开销...但这有助于您的查询..如果您不需要所有列,那么开销会更少
我有一个 table,你可以在我的 sql 服务器中看到它:
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])
我在这个 table 里面有 16000000 条记录。所以你知道这个 table 存储了关于 cars.so 的所有信息我决定创建基于车型的文件组,这意味着我保存了如您所见,同一个文件组中有相同型号的汽车:
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 在我的 table 上创建这些索引:
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'
我的问题是:
我怎样才能做更多的事情来提高性能?我的索引会有帮助吗?
我是调音新手
你的查询是这个
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 *
有了这个,您将有维护一个单独结构的开销...但这有助于您的查询..如果您不需要所有列,那么开销会更少