首页 > 解决方案 > 由于大量重复而没有主键的表,试图加快我的查询以消除重复等

问题描述

我有一张来自不同供应商的产品表全部加在一起,所以有很多重复的 SKU(ManuPartNo),还有其他元素,价格,数量等。但是我想根据 SKU(ManuPartNo)选择最高价格和还将任何匹配 SKU 的所有数量加在一起。我有一个有效的查询,但想知道是否有人可以建议如何加快速度,我正在查询的表有 130 万行,我的查询大约需要 40 秒才能运行。它并不太慢,但我正在尝试更多地了解优化,这个问题很难用谷歌搜索,所以如果有人能给我任何提示或指出正确的方向,我将不胜感激。

这是我正在查询的表的结构和我的查询本身。

CREATE TABLE [dbo].[AllProductsFromAllDistis](
[ProdName] [varchar](max) NULL,
[ManuPartNo] [varchar](150) NULL,
[Manufacturer] [varchar](150) NULL,
[Price] [decimal](10, 2) NOT NULL,
[Qty] [int] NOT NULL,
[Weight] [decimal](10, 2) NULL,
[UpcCode] [varchar](50) NULL,
[Supplier] [varchar](50) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我的查询只返回价格最高的值并添加任何重复 sku 的所有数量。

SELECT ProdName, ManuPartNo, Price, TotalQty, Weight, UPCCode, Supplier, 
Manufacturer
FROM
(SELECT dbo.AllProductsFromAllDistis. *,
    ROW_NUMBER() OVER(PARTITION BY ManuPartNo ORDER BY Price ASC) AS RN,
    SUM(Qty) OVER(PARTITION BY ManuPartNo) AS TotalQty
        FROM AllProductsFromAllDistis) AS t
WHERE RN = 1
ORDER BY ManuPartNo

正如我所说,这很好用,但我正在寻找加快速度的建议。

标签: sql-server

解决方案


尽管由于重复而无法创建主键,但您仍然可以创建不需要唯一性的聚集索引,但仍会提高对索引列进行分组或连接的查询的性能。例如:

CREATE CLUSTERED INDEX [IX_AllProductsFromAllDistis] ON [dbo].[AllProductsFromAllDistis] ([ManuPartNo])

推荐阅读