2017-08-08 1 views
-1

J'ai une table comme vous pouvez le voir dans mon serveur sql:Ma recherche est très lent dans le serveur 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]) 

Je 16000000 enregistrements dans ce tableau .Donc comme vous le savez cette table stocke toutes les informations sur les voitures .donc j'ai décidé de créer un groupe de fichiers basé sur le modèle de voiture, cela signifie que je sauvé même modèle de voitures à l'intérieur d'un groupe de fichiers que vous pouvez voir:

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) 

donc je crée cette fonction à

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 

Comme une note du VIN est la recherche principale .mon unique, est vin.i créer ces index sur ma 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 

ma requête est la suivante:

select * from cars where vin='IRFC1374GH7162K' 

Mes questions est :
Comment puis-je faire plus de choses à de meilleures performances? Mes index aideront-ils?

Je suis tellement nouveau dans l'accord

+0

Le vote de vote s'il vous plaît –

+1

Je n'ai pas DV, mais quelle est la question et la requête utilisée – TheGameiswar

+1

Je recommande de jeter un oeil à ce lien (https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) pour améliorer la question – TheGameiswar

Répondre

1

votre requête est ce

select * from cars where vin='IRFC1374GH7162K' 

vos index actuels ne sont pas du tout pour votre requête helpfull ..

afin de faire votre demande de meilleurs résultats, je recommande .. l'ajout d'un indice non clusterisé

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

ce sera un problème , puisque la taille maximale de la clé d'index est 900 octets si vous utilisez une version antérieure à sql2016 et la limite est 1700 octets pour les versions supérieures à 2016.

Aussi, je vois, votre colonne de recherche n'est pas énorme (IRFC1374GH7162K) , donc je recommande d'ajuster à nvarchar (100) .Aussi toutes les colonnes sont nécessaires puisque vous faites un select *

Avec cela, vous aurez une surcharge de maintenance d'une structure séparée ... mais cela aide votre requête .. si vous n'avez pas besoin de toutes les colonnes, il y aura moins de frais généraux

+0

merci. Comme dernière question je veux savoir qu'il est préférable d'avoir un groupe de fichiers avec des fichiers ou avoir un groupe de fichiers pour chaque fichier? –

+0

Le groupe de fichiers avec des fichiers ou chaque groupe de fichiers pour les fichiers ne sera pas d'une grande aide, si vous ne les placez pas sur des disques séparés. Le placement sur des disques séparés permet une sauvegarde plus rapide.C'est selon ma compréhension – TheGameiswar

+0

vous devez également suivre les meilleures pratiques comme, les données et les fichiers journaux sur les lecteurs séparés et les configurations de disque tempdb.IF vous voyez beaucoup d'IO fait pour une seule table, puis créer un nouveau groupe de fichiers et le placer sur un disque séparé peut aider – TheGameiswar