【问题标题】:My search is very slow in sql server我在 sql server 中的搜索很慢
【发布时间】:2017-08-08 07:31:54
【问题描述】:

我有一张表,你可以在我的 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])

我在这个表中有 16000000 条记录。所以你知道这个表存储了有关汽车的所有信息。所以我决定根据汽车型号创建文件组,这意味着我在一个文件组中保存了相同型号的汽车,如你所见:

 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。我在我的表上创建这些索引:

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'

我的问题是:
我怎样才能做更多的事情来提高性能?我的索引会有帮助吗?

我是调音新手

【问题讨论】:

  • 请投反对票
  • 我没有DV,但使用的问题和查询是什么
  • 我建议看看这个链接(spaghettidba.com/2015/04/24/…) 来改进问题
  • @TheGameiswar 谢谢
  • 能否也请分享一下查询

标签: sql-server performance indexing database-tuning


【解决方案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 *,所以所有的列都是必需的

这样,您将有维护单独结构的开销...但这有助于您的查询..如果您不需要所有列,则开销会更少

【讨论】:

  • 谢谢。作为最后一个问题,我想知道最好有一个文件组或每个文件都有一个文件组?
  • 文件组或文件的每个文件组不会有太大帮助,如果您不将它们放在单独的磁盘上。放置在单独的磁盘上有助于更快的备份。这是根据我的理解
  • 您还需要遵循最佳实践,例如在单独的驱动器和 tempdb 磁盘配置上的数据和日志文件。如果您看到为单个表完成大量 IO,则创建一个新文件组并放置它在单独的磁盘上可能会有所帮助
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2012-12-17
  • 1970-01-01
  • 2012-06-25
  • 2012-09-10
相关资源
最近更新 更多