Поиск в первом ряду результатов - PullRequest
0 голосов
/ 10 ноября 2010

У меня есть таблица истории, содержащая снимок каждого изменения записи.Я пытаюсь вернуть определенную строку истории с первоначальной записанной датой.В настоящее время я использую это:

select
    s.Description,
    h.CaptureDate OriginalCaptureDate
from
    HistoryStock s
    left join 
        ( select 
              StockId,
              CaptureDate
          from
              HistoryStock
          where
              HistoryStockId in ( select MIN(HistoryStockId) from HistoryStock group by StockId )
        ) h on s.StockId = h.StockId
where
    s.HistoryStockId = @HistoryStockId

Это работает, но с 1 миллионами записей на медленной стороне, и я не уверен, как оптимизировать этот запрос.

Как можноэтот запрос должен быть оптимизирован?

ОБНОВЛЕНИЕ :

WITH OriginalStock (StockId, HistoryStockId)
AS  (
    SELECT  StockId, min(HistoryStockId)
    from HistoryStock group by StockId
    ),
OriginalCaptureDate (StockId, OriginalCaptureDate) 
As (
   SELECT h.StockId, h.CaptureDate
   from HistoryStock h join OriginalStock o on h.HistoryStockId = o.HistoryStockId
  )

select
    s.Description,
    h.OriginalCaptureDate
from
    HistoryStock s left join OriginalCaptureDate h on s.StockId = h.StockId
where
    s.HistoryStockId = @HistoryStockId

Я обновил код для использования CTE, но мне не повезло в производительности, только малувеличение производительности.Есть идеи?

Еще одно замечание, мне нужно перейти к первой записи в таблице истории для StockId, а не к самой ранней дате захвата.

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Я не уверен, что полностью понимаю, как работают данные из вашего запроса, но, по моему мнению, вложенные запросы никогда не влияют на производительность.Вы можете попробовать что-то вроде:

    WITH MinCaptureDate (StockID, MinCaptureDate)
AS  (
    SELECT   HS.StockID
        ,MIN(HS.CaptureDate) AS OriginalCaptureDate
    FROM    HistoryStock    HS
    GROUP BY 
         HS.Description
    )
SELECT   HS.Description
    ,MCD.OriginalCaptureDate
FROM    HistoryStock    HS
JOIN    MinCaptureDate  MCD
    ON HS.StockID = MCD.StockID
WHERE   HS.StockID = @StockID
0 голосов
/ 10 ноября 2010

Мне кажется, я вижу, чего вы пытаетесь достичь.По сути, вам нужно описание указанной истории запасов, но вам нужна дата, связанная с первой записью истории для акций ... поэтому, если ваша таблица истории выглядит следующим образом

StockId   HistoryStockId   CaptureDate   Description
1         1                Apr 1         Desc 1
1         2                Apr 2         Desc 2
1         3                Apr 3         Desc 3

, и вы задаете @HistoryStockId = 2, вам нужен следующий результат

Description   OriginalCaptureDate
Desc 2        Apr 1

Я думаю, что следующий запрос даст вам немного лучшую производительность.

WITH OriginalStock (StockId, CaptureDate, RowNumber) 
AS  ( 
    SELECT  
        StockId, 
        CaptureDate,
        RowNumber = ROW_NUMBER() OVER (PARTITION BY StockId ORDER BY HistoryStockId ASC)
    from HistoryStock 
    )

select 
    s.Description, 
    h.CaptureDate 
from 
    HistoryStock s left join OriginalStock h on s.StockId = h.StockId and h.RowNumber = 1
where 
    s.HistoryStockId = @HistoryStockId 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...