Замедлите объемную вставку для таблицы со многими индексами

Ваш объект timedelta преобразуется в числовое представление с помощью matplotlib. Вот почему вы не получаете дату на оси X. И сюжет идет по порядку. Просто '00:40:00' меньше, чем во всех остальных случаях, поэтому он изображен как самая левая точка.

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

d = ({
    'Time' : ['2019/1/1 7:00:00','2019/1/1 10:30:00','2019/1/1 12:40:00',
              '2019/1/1 16:25:00','2019/1/1 18:30:00','2019/1/1 22:40:00',
              '2019/1/2 00:40:00'],
    'Value' : [1,2,3,4,5,4,10],           
})

df = pd.DataFrame(d)
df['Time'] = pd.to_datetime(df['Time'])

df.plot(x='Time', y='Value')

enter image description here

Обновление

Для установки тиканье в ваши моменты времени немного сложно. Этот пост даст вам представление о том, как работает позиционирование. По сути, вам нужно использовать что-то вроде matplotlib.dates.date2num, чтобы получить числовое представление даты и времени:

xticks = [matplotlib.dates.date2num(x) for x in df['Time']]
xticklabels = [x.strftime('%H:%M') for x in df['Time']]

ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels)

enter image description here

26
задан Ole Lynge 17 April 2009 в 17:48
поделиться

3 ответа

You can disable and enable the indexes. Note that disabling them can have unwanted side-effects (such as having duplicate primary keys or unique indices etc.) which will only be found when re-enabling the indexes.

--Disable Index
ALTER INDEX [IXYourIndex] ON YourTable DISABLE
GO

--Enable Index
ALTER INDEX [IXYourIndex] ON YourTable REBUILD
GO
43
ответ дан 28 November 2019 в 06:48
поделиться

This sounds like a data warehouse operation. It would be normal to drop the indexes before the insert and rebuild them afterwards.

When you rebuild the indexes, build the clustered index first, and conversely drop it last. They should all have fillfactor 100%.

Code should be something like this

if object_id('Index') is not null drop table IndexList
select name into Index from dbo.sysindexes where id = object_id('Fact')

if exists (select name from Index where name = 'id1') drop index Fact.id1
if exists (select name from Index where name = 'id2') drop index Fact.id2        
if exists (select name from Index where name = 'id3') drop index Fact.id3
.
.
BIG INSERT

RECREATE THE INDEXES
8
ответ дан 28 November 2019 в 06:48
поделиться

As noted by another answer disabling indexes will be a very good start.

4 hours per 100.000 rows [...] The inserts are wrapped in a transaction per 100.000 rows.

You should look at reducing the number, the server has to maintain a huge amount of state while in a transaction (so it can be rolled back), this (along with the indexes) means adding data is very hard work.

Why not wrap each insert statement in its own transaction?

Also look at the nature of the SQL you are using, are you adding one row per statement (and network roundtrip), or adding many?

4
ответ дан 28 November 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: