Отображение одной записи на основе идентификатора docid


У меня есть таблица с ~900,000 записи. Мне нужно, чтобы отобразить одну запись на основе идентификатора docid, используя этот запрос. Запись последняя запись, которая попала изменен другой программой.

Этот кусок запроса пробег ~7 секунд:

SELECT        TOP 1 t.Register
FROM            PxStats AS s INNER JOIN Therapy AS t ON s.ID = t.ID
WHERE        (s.Date = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))) AND (t.DocID = 1)
ORDER BY s.Time DESC

Я не имею доступа на изменение структуры таблицы, таблица индексируется по ID, но я не могу отфильтровать записи по ИД за последний ID не гарантируется последней записи изменен.



127
1
задан 11 апреля 2018 в 01:04 Источник Поделиться
Комментарии
2 ответа

Начиная с SQL 2008 есть оконная функция, которая делает это красиво.

900,000 записи даже при отсутствии индекса, похоже, это должно быть быстрее.

Я сомневаюсь, что движется условие в Join будет исправить производительность, но стоит попробовать.

SELECT TOP 1 t.Register
FROM PxStats AS s
INNER JOIN Therapy AS t
ON s.ID = t.ID
AND s.Date = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
AND t.DocID = 1
ORDER BY s.Time DESC;

Если вы можете выложить план запроса.

Если убрать топ-1 в среднем, сколько записей будет возвращено?

Дойдут, но попробовать

declare @today datetime = (select DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())));

SELECT TOP 1 t.Register
FROM PxStats AS s
INNER JOIN Therapy AS t
ON s.ID = t.ID
AND s.Date = @today
AND t.DocID = 1
ORDER BY s.Time DESC;

3
ответ дан 11 апреля 2018 в 09:04 Источник Поделиться

Я решил это с помощью обходного пути, запрашивая последние 10000 идентификатор на временной базе, 10000 в 10 раз среднее количество новой добавляемой записи каждый день, делая это, я могу гарантировать, что все записи в определенный день возвращается.

После этого просто запрос на временную таблицу с помощью запроса @Папараццо выше.

USE MedicalSql;  
IF OBJECT_ID('tempdb..#Temp_PxStats') IS NOT NULL DROP TABLE #Temp_PxStats;
GO
SELECT TOP 10000 *
INTO #Temp_PxStats
FROM dbo.PxStats
ORDER BY ID DESC;
GO
SELECT TOP 1 t.Register
FROM #Temp_PxStats AS s
INNER JOIN Therapy AS t
ON s.ID = t.ID
AND s.Date = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
AND t.DocID = 1
ORDER BY s.Time DESC;
GO

0
ответ дан 18 апреля 2018 в 01:04 Источник Поделиться