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

标签 sql-server azure

我有以下内容:

查询:

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/

相关文章:

从 Web 应用程序访问 Azure 管理 API

sql-server - 启动订阅者同步的脚本

azure - Azure 存储如何计费?

azure - ARM模板,服务器名称已经存在,但实际上不存在

azure - 如何在 Azure 自动化帐户中运行的 PowerShell 脚本中建立凭据

c# - 将 blob 上传到具有指定 ContentType 的 Azure Blob 存储并同时覆盖(.NET v12 SDK)?

sql-server - 使用 Microsoft SQL Server Management Studio 的西里尔字母

sql - SQL 查询帮助结构化结果

sql-server - SQL Server 中列名周围的括号是什么意思?

sql-server - 从 Postgres 迁移到 SQL Server 2008