2015-02-27 2 views
1

В настоящее время я работаю с большими данными. Я импортирую данные в таблицу, которая составляет около 200 миллионов записей на импорт. Я хочу посмотреть, сколько записей загружено для текущего импорта. Но в настоящее время мой скрипт работает через 1 миллиард записей, чтобы, наконец, подсчитать последние импортированные данные.Выберите последние N строк SQL Server 2012

SELECT Datum, COUNT(Datum) AS recCount 
FROM PF161DailyAggregates 
GROUP BY Datum 

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

В настоящее время этот вопрос занимает около часа. Как я могу сделать это быстро, чтобы считать только последние N строк?

Заранее спасибо

+0

Авто тег, удален Теперь –

+0

насчет 'выбрать сверху п ... от ... для того, by .. desc ' –

+1

Это не большие данные, это проблема SQL с большой таблицей. Во-первых, убедитесь, что 'Datum' проиндексирован. Предполагая, что импорт только добавляет более поздние даты, выберите максимальную дату перед импортом, а затем используйте его для фильтрации таблицы с помощью 'WHERE'. Рассмотрите сжатие, разбиение на разделы и/или индексы столбцов, чтобы повысить скорость, они могут привести к значительно лучшей производительности. –

ответ

0

это ограничит результат 100 строк, и вы можете получить последние строки, давая заказ по п desc

SELECT Datum, COUNT(Datum) AS recCount 
FROM PF161DailyAggregates 
GROUP BY Datum 
order by datum desc 
OFFSET 1 ROWS 
FETCH NEXT 100 ROWS ONLY; 
+0

, и если мне захочется пропустить первые N строк, это будет: order by datum OFFSET n ROWS FETCH NEXT N ROWS ONLY; Правильно? –

+1

Извините, это не помогает.OFFSET будет работать над набором конечных результатов и НЕ поможет уменьшить количество строк, которые считаются выполняющими порядок, группу и количество! OFFSET также НЕ поможет уменьшить время вычисления, потому что все, что он делает, сокращает набор результатов, который возвращается клиенту ПОСЛЕ того, как он был определен! – Oliver

0

То жесткий один. Я думаю, что пока вы хотите узнать последние записи ПОСЛЕ импорта, вы должны использовать некоторый порядок в столбце Datum. Вы можете попробовать различные трюки, но пока этот столбец не имеет индекса, вы будете потеряны, поскольку для любого заказа требуется полное сканирование таблицы. Так что мое первое предложение, чтобы сделать индекс по этому колонку, то вы можете использовать любую технику, которая ограничивает свой результат до последнего момента, как:

select top 1 Datum, count(Datum) 
from PF161DailyAggregates 
group by Datum 
order by Datum desc 

или

select count(*) 
from PF161DailyAggregates 
where Datum = (select top 1 Datum 
       from PF161DailyAggregates 
       order by Datum desc) 

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

+1

Нет необходимости в TOP. MAX (Datum) вернет последнюю дату. Что касается отдельной таблицы - вам все равно придется использовать тот же оператор, что и OP, используемый для создания этой таблицы. –

0

быстрый способ найти рассчитывать на одну таблицу,

SELECT T.name AS [TABLE NAME], 
     I.rows AS [ROWCOUNT] 
FROM sys.tables AS T 
     INNER JOIN sys.sysindexes AS I 
       ON T.object_id = I.id 
        AND I.indid < 2 
where T.name ='PF161DailyAggregates' 
ORDER BY I.rows DESC 

В качестве альтернативы,

вы можете создать один столбец идентификаторов. Перед вставкой find max id == легко и быстро затем после вставки найдите SCOPE_IDENTITY() в переменной. , то вычтите эти два.

Если таблица уже содержит один тип ROWNUMBER в последовательности, то также вы можете использовать ту же технику, с помощью FIRST_VALUE В SQL Server 2012

Смежные вопросы