Таблица без первичного ключа из-за большого количества дубликатов, попытки ускорить мой запрос, чтобы избавиться от дубликатов и т. Д. - PullRequest
0 голосов
/ 31 мая 2019

У меня есть таблица продуктов от разных поставщиков, все вместе, так что есть много дубликатов SKU (ManuPartNo), есть другие элементы, цена, кол-во и т. Д. Однако я хочу выбрать самую высокую цену на основе SKU (ManuPartNo), а также сложите все кол-во для любого соответствующего SKU.У меня есть рабочий запрос, но мне было интересно, кто-нибудь может подсказать, как его ускорить, у таблицы, к которой я обращаюсь, 1,3 миллиона строк, и мой запрос выполняется около 40 секунд.Это не слишком медленно, но я пытаюсь узнать больше об оптимизации, и этот вопрос очень трудно найти в Google, поэтому, если кто-нибудь может дать мне какие-либо советы или указать мне правильное направление, это будет очень цениться.

Вотструктура таблицы, к которой я обращаюсь, и мой запрос сам по себе.

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

Как я уже сказал, это прекрасно работает, но я ищу предложения по его ускорению.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Хотя вы не можете создать первичный ключ из-за дубликатов, вы все равно можете создать кластеризованный индекс , который не требует уникальности, но все же повысит производительность запросов, которые группируют или объединяют в столбцах индексов , Например:

CREATE CLUSTERED INDEX [IX_AllProductsFromAllDistis] ON [dbo].[AllProductsFromAllDistis] ([ManuPartNo])
0 голосов
/ 31 мая 2019

Я рекомендую вам это

SELECT t.ProdName, t.ManuPartNo, t.Price, t.TotalQty, t.Weight, t.UPCCode, t.Supplier, 
t.Manufacturer
FROM
(SELECT ProdName,ManuPartNo,Price,Weight,UPCCode,Supplier,Manufacturer
    ROW_NUMBER() OVER(PARTITION BY ManuPartNo ORDER BY Price ASC) AS RN,
    SUM(Qty) OVER(PARTITION BY ManuPartNo) AS TotalQty
        FROM AllProductsFromAllDistis (Nolock) ) AS t
WHERE t.RN = 1
ORDER BY t.ManuPartNo
  1. Никогда не забывайте всегда указывать все столбцы (НЕ -> Выбрать * из TableProduction)
  2. Если вы используете подзапросы, поставьте "t""во всех ваших столбцах
  3. Никогда не забывайте, что установите (Nolock) ... может привести к блокировке
  4. Используйте" План выполнения "в Меню-> Запрос

Я надеюсь, что это может немного помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...