sql-server - 由于大量重复而没有主键的表,试图加快我的查询以消除重复等
问题描述
我有一张来自不同供应商的产品表全部加在一起,所以有很多重复的 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
正如我所说,这很好用,但我正在寻找加快速度的建议。
解决方案
尽管由于重复而无法创建主键,但您仍然可以创建不需要唯一性的聚集索引,但仍会提高对索引列进行分组或连接的查询的性能。例如:
CREATE CLUSTERED INDEX [IX_AllProductsFromAllDistis] ON [dbo].[AllProductsFromAllDistis] ([ManuPartNo])
推荐阅读
- kotlin - Kotlin 设计模式,观察者的问题
- mongodb - SailsJs:如何使用查找对象属性数组?
- zeromq - 通过 Pub/Sub 的并行 Req/Rep
- javascript - Date-fns 在后端被接收为空值
- sql - PostgreSQL 查询匹配列文本字符串非常慢,即使有索引
- java - 如何从String数组中获取Stream?
- python - 从第一次出现的符号中删除字符串尾部
- java - 如何使用计数器
- swiftui - SwiftUI:选项卡式视图中的 MasterDetailView 丢失“状态”
- tcl - 使用 readlink 时的错误处理问题