gpt4 book ai didi

sql-server - SQL Server/Azure DB - 添加 JOIN 只会使 180~ 行的查询速度减慢几秒

转载 作者:行者123 更新时间:2023-12-03 01:09:31 27 4
gpt4 key购买 nike

我有以下内容:

查询:

SET STATISTICS TIME ON;
GO

SELECT *
FROM dbo.BidReviewCase
JOIN dbo.AnprEvent ON AnprEvent.Id = BidReviewCase.AnprEventId
JOIN dbo.Camera ON Camera.Id = AnprEvent.CameraId -- << SLOW JOIN HERE
SET STATISTICS TIME OFF

执行计划

enter image description here

相关架构

CREATE TABLE [dbo].[BidReviewCase] (
[CaseId] INT IDENTITY (1, 1) NOT NULL,
[AnprEventId] INT NOT NULL,
[Summary] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_BidReviewCase] PRIMARY KEY CLUSTERED ([CaseId] ASC),
CONSTRAINT [FK_BidReviewCase_AnprEvent_AnprEventId] FOREIGN KEY ([AnprEventId]) REFERENCES [dbo].[AnprEvent] ([Id]) ON DELETE CASCADE
);

CREATE TABLE [dbo].[Camera] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[CameraName] NVARCHAR (MAX) NOT NULL,
[SiteId] INT NOT NULL,
[NvrIp] NVARCHAR (MAX) NULL,
[NvrPassword] NVARCHAR (MAX) NULL,
[NvrPort] NVARCHAR (MAX) NULL,
[NvrUsername] NVARCHAR (MAX) NULL,
[ChannelA] NVARCHAR (MAX) NULL,
[ChannelB] NVARCHAR (MAX) NULL,
[Reference] UNIQUEIDENTIFIER DEFAULT ('00000000-0000-0000-0000-000000000000') NOT NULL,
CONSTRAINT [PK_Camera] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Camera_Site_SiteId] FOREIGN KEY ([SiteId]) REFERENCES [dbo].[Site] ([Id]) ON DELETE CASCADE
);

CREATE TABLE [dbo].[AnprEvent] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[DateTimeRead] DATETIME2 (7) NOT NULL,
[Reference] UNIQUEIDENTIFIER NOT NULL,
[Registration] NVARCHAR (MAX) NOT NULL,
[CameraId] INT DEFAULT ((0)) NOT NULL,
[Country] INT DEFAULT ((0)) NOT NULL,
[DateTimeCreated] DATETIME2 (7) NULL,
[Direction] INT DEFAULT ((0)) NOT NULL,
[EventReference] UNIQUEIDENTIFIER DEFAULT ('00000000-0000-0000-0000-000000000000') NOT NULL,
[LaneId] INT DEFAULT ((0)) NOT NULL,
[Region] INT DEFAULT ((0)) NOT NULL,
CONSTRAINT [PK_AnprEvent] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_AnprEvent_Camera_CameraId] FOREIGN KEY ([CameraId]) REFERENCES [dbo].[Camera] ([Id]) ON DELETE CASCADE
);

GO
CREATE NONCLUSTERED INDEX [AnprEventCameraId]
ON [dbo].[AnprEvent]([CameraId] ASC)
INCLUDE([Id]);

行数

AnprEventCount:5676

出价审核案例数:176

相机数量:2

问题

上述查询需要 3-4 秒,如果删除相机 JOIN,则需要大约 5ms

我发现我可以将 JOIN 更改为 LEFT JOIN 并且它解决了问题。不过,我正在使用 EntityFramework 查询此内容,它将使用 INNER JOINS

我不知道是什么导致了这种行为。任何解决此问题的建议将不胜感激。

最佳答案

请尝试更新更新统计信息命令涉及的表的统计信息。

问题是引擎正确地认为首先连接较小的表然后将结果与依赖表连接起来更便宜。在 anpreventid 字段上添加索引,这应该会加快查询速度

关于sql-server - SQL Server/Azure DB - 添加 JOIN 只会使 180~ 行的查询速度减慢几秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080761/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com