J'ai le tableau suivant:Pourquoi ma requête SELECT dure-t-elle si longtemps?
CREATE TABLE [dbo].[Notifications](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Fk_institutionId] [int] NOT NULL,
[Fk_userId] [int] NOT NULL,
[Read] [bit] NOT NULL,
[CategoryId] [int] NOT NULL,
[Title] [nvarchar](150) NULL,
[NotificationText] [text] NULL,
[CreateDate] [datetime] NOT NULL,
[ReadDate] [datetime] NULL,
[DisplayDate] [datetime] NULL,
[ReadBy] [nvarchar](100) NULL,
CONSTRAINT [PK_Notifications] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
un select * from Notifications
simple, prend 30 secondes alors qu'il n'y a que 800 000 lignes dans ce tableau.
Cette situation réelle est chaque utilisateur exécute la requête select * from notifications where DisplayDate is null and Fk_userId = [the user id]
et cela crée une erreur de serveur dans mon application web .NET en disant quelque chose sur un interblocage.
Le plan d'exécution pour cette requête est assez simple
Qu'est-ce que je fais mal? Ou pourquoi crée-t-il une erreur de blocage?
il semble qu'il y ait plus de colonnes que ci-dessus - que vous créez déclaration n'est pas complète –
puis-je savoir, pourquoi vous voulez sélectionner toute la table ? autant que je sache SQL Server effectuera un balayage de table simple. implique l'analyse de chaque ligne de la table, l'allocation de mémoire, et le retour qui sera le moyen le plus rapide pour retourner le résultat –
30 secondes pour aller chercher 800 000 lignes est 26,667 lignes par seconde. Un réseau lent est 100 Mbps ou environ 12,5 Mo par seconde. Donc, si vos enregistrements de base de données ont en moyenne environ 500 octets chacun (assez facile si vous avez de longues données texte), le réseau pourrait limiter votre vitesse de transfert. –