我有一個數據庫,我用一個自動生成的索引鍵存儲一些值。我也有一個:M映射表是這樣的:選擇所有的ID和插入缺失的數據
create table data(id int not null identity(1,1), col1 int not null, col2 varchar(256) not null);
create table otherdata(id int not null identity(1.1), value varchar(256) not null);
create table data_map(dataid int not null, otherdataid int not null);
每天data
表需要用新的值,其中很多都是已經存在的名單進行更新,但需要插入data_map
(然後生成密鑰otherdata
,因此在此表中數據總是新的)。
做這將是第一次嘗試將所有值的方法,然後選擇生成的ID,然後插入data_map
:
mydata = [] # list of tuples
cursor.executemany("if not exists (select * from data where col1 = %d and col2 = %d) insert into data (col1, col2) values (%d, %d)", mydata);
# now select the id's
# [...]
但是這顯然是很糟糕,因爲我需要選擇所有的東西沒有使用密鑰,我也需要做檢查而不使用密鑰,所以我需要先索引數據,否則一切都很慢。
我的下一個方法是使用散列函數(如md5或crc64)在col1和col2上生成我自己的散列,以便能夠在不使用select的情況下插入所有值,並且能夠在插入缺失時使用索引鍵值。
這可以優化,還是我可以做的最好的事情? 每行更改> 500k,其中可能有20-50%將在數據庫中。 時序明智,它看起來像計算散列比插入數據到數據庫要快得多。
這與OP的問題沒有關係。雖然是真的,但它應該是一個評論。 –
我很想去,但我仍然沒有聲望在其他叉子上發表評論。 – EvilAnton
好吧,這是afaik只是在郵件列表上的共識,並沒有嚴格定義在PEP左右的地方。 PEP只是定義你可以使用某種格式化字符串。 – reox