gpt4 book ai didi

sql - 为什么 SQLServerCE 查询执行表扫描,这是一个问题?

转载 作者:行者123 更新时间:2023-12-04 19:52:56 25 4
gpt4 key购买 nike

我正在尝试优化对在 Windows Mobile 设备上运行的 SQLServerCE 数据库的查询。该查询用于根据不再从另一个表中引用来识别要在一个表中删除的行。原始查询使用 DISTINCT 来标识匹配的行:

SELECT TestGroupId, TestNameId, ServiceTypeId
FROM ServiceTypeInspection
WHERE ServiceTypeId NOT IN
(SELECT DISTINCT ServiceTypeId
FROM PurchaseOrder)

一个快速的谷歌建议通过以下方式使用 EXISTS:
SELECT TestGroupId, TestNameId, ServiceTypeId
FROM ServiceTypeInspection AS STI
WHERE NOT EXISTS
(SELECT PurchaseOrderId
FROM PurchaseOrder AS PO
WHERE (ServiceTypeId = STI.ServiceTypeId))

但后来我也在 SO 和 MSDN 上找到了建议,用听起来很有希望的 LEFT JOIN 替换这两个选项:
SELECT TestGroupId, TestNameId, STI.ServiceTypeId ServiceTypeId
FROM ServiceTypeInspection STI
LEFT JOIN PurchaseOrder PO ON STI.ServiceTypeId = PO.ServiceTypeId
WHERE PO.ServiceTypeId IS NULL

当我将这些查询作为显示执行计划的批处理运行时,相对于原始查询批处理的成本为 21%,NOT EXISTS 版本为 11%,LEFT JOIN 负责 68% 的余额。 SSMS 不表示有任何缺失的索引,但最快的 NOT EXISTS 查询在表扫描中的成本为 25%。我在两个表中的 ServiceTypeId 上都有非唯一索引。我是否正确读取了执行计划的输出,在这种情况下 NOT EXISTS 版本是最佳方法?表扫描是潜在的瓶颈还是对于非唯一索引来说这是正常的?

表定义为:
CREATE TABLE [PurchaseOrder](
[PurchaseOrderId] [uniqueidentifier] NOT NULL,
[ServiceTypeId] [nvarchar](8) NOT NULL,
CONSTRAINT [PK_PurchaseOrder] PRIMARY KEY
(
[PurchaseOrderId]
)
);

CREATE TABLE [ServiceTypeInspection](
[TestGroupId] [int] NOT NULL,
[TestNameId] [nvarchar](10) NOT NULL,
[ServiceTypeId] [nvarchar](8) NOT NULL,
CONSTRAINT [PK_ServiceTypeInspection] PRIMARY KEY
(
[TestGroupId],[TestNameId]
)
);

CREATE INDEX IX_PurchaseOrder_ServiceTypeId ON [PurchaseOrder] (ServiceTypeId);
CREATE INDEX IX_ServiceTypeInspection_ServiceTypeId ON [ServiceTypeInspection] (ServiceTypeId);

最佳答案

我的猜测是,与表大小相比,您的 NC 索引的大小相对较大(大主键,我假设它也是默认的聚集索引,这意味着您有大的 NC 索引),因此优化器决定表扫描。

此外,如果索引 IX_PurchaseOrder_ServiceTypeIdIX_ServiceTypeInspection_ServiceTypeId具有小于大约 10% 的选择性,优化器可能不会使用它们。

关于sql - 为什么 SQLServerCE 查询执行表扫描,这是一个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3920415/

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