Я новичок в интеграции рекламы в мое приложение для Android. Я не знаю, как это будет работать с Android Devices и как интегрировать его в мой проект. Но только из-за требования я должен поместить рекламу в свой проект.
Мне понадобятся подробности для следующего.
Было бы лучше, если бы был простой демонстрационный проект, который может объяснить.
-121--1193906-Вот сценарий, в котором я оказался.
У меня есть достаточно большая таблица, из которой мне нужно запросить последние записи. Вот создание для основных столбцов для запроса:
CREATE TABLE [dbo].[ChannelValue](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[UpdateRecord] [bit] NOT NULL,
[VehicleID] [int] NOT NULL,
[UnitID] [int] NOT NULL,
[RecordInsert] [datetime] NOT NULL,
[TimeStamp] [datetime] NOT NULL
) ON [PRIMARY]
GO
Столбец ID является первичным ключом и существует некластеризованный индекс для VehicleID и TimeStamp
CREATE NONCLUSTERED INDEX [IX_ChannelValue_TimeStamp_VehicleID] ON [dbo].[ChannelValue]
(
[TimeStamp] ASC,
[VehicleID] ASC
)ON [PRIMARY]
GO
Таблица, над которой я работаю для оптимизации запроса, составляет чуть более 23 миллионов строк и составляет только 10-ю часть от размера, с которым должен работать запрос.
Мне нужно вернуть последнюю строку для каждого идентификатора транспортного средства.
Я просмотрел ответы на этот вопрос здесь, на StackOverflow, и я сделал довольно много гуглинга, и, похоже, есть 3 или 4 общих способа сделать это на SQL Server 2005 и выше.
До сих пор самый быстрый метод, который я нашел, это следующий запрос:
SELECT cv.*
FROM ChannelValue cv
WHERE cv.TimeStamp = (
SELECT
MAX(TimeStamp)
FROM ChannelValue
WHERE ChannelValue.VehicleID = cv.VehicleID
)
С текущим объемом данных в таблице требуется около 6 с для выполнения, что находится в разумных пределах, но с объемом данных, которые таблица будет содержать в рабочей среде, запрос начинает выполняться слишком медленно.
Рассматривая план выполнения, я беспокоюсь о том, что делает SQL Server для возврата строк.
Я не могу опубликовать образ плана выполнения, потому что моя репутация недостаточно высока, но сканирование индекса анализирует каждую строку в таблице, что замедляет запрос настолько сильно.
Я попробовал переписать запрос несколькими различными методами, в том числе с помощью метода разбиения SQL 2005 следующим образом:
WITH cte
AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY VehicleID ORDER BY TimeStamp DESC) AS seq
FROM ChannelValue
)
SELECT
VehicleID,
TimeStamp,
Col1
FROM cte
WHERE seq = 1
Но производительность этого запроса еще хуже в значительной степени.
Я пытался переструктурировать запрос так, но скорость результата и план выполнения запроса почти идентичны:
SELECT cv.*
FROM (
SELECT VehicleID
,MAX(TimeStamp) AS [TimeStamp]
FROM ChannelValue
GROUP BY VehicleID
) AS [q]
INNER JOIN ChannelValue cv
ON cv.VehicleID = q.VehicleID
AND cv.TimeStamp = q.TimeStamp
У меня есть некоторая гибкость вокруг структуры таблицы (хотя и в ограниченной степени), так что я могу добавлять индексы, индексированные представления и т.д. или даже дополнительные таблицы в базу данных.
Я был бы очень признателен за любую помощь здесь.
Изменить Добавлена ссылка на образ плана выполнения.