當面臨在數據庫中複製記錄並修改少量值的任務時,我傾向於使用臨時表來避免寫出所有未更改的列。有誰知道這將如何影響大規模系統的性能?值得使用臨時表複製行的開銷?
一個簡單的例子(這也說明了爲什麼我喜歡的臨時表法):
比方說,我有一個表mytbl
50列col1
... col50
。我想插入一個新記錄,該記錄與col5 = 'Some Value'
的行完全相同,但col45
將設置爲'Some other value'
。
方法1
CREATE GLOBAL TEMPORARY TABLE tmptbl AS
SELECT * FROM myschema.mytbl;
INSERT INTO tmptbl
(SELECT *
FROM myschema.mytbl
WHERE mytbl.col5 = 'Some Value');
UPDATE tmptbl
SET col45 = 'Some Other Value';
INSERT INTO myschema.mytbl
(SELECT * FROM tmptbl);
DROP TABLE tmptbl;
方法2
INSERT INTO myschema.mytbl (col1,
col2,
col3,
col4,
col5,
col6,
col7,
col8,
col9,
col10,
col11,
col12,
col13,
col14,
col15,
col16,
col17,
col18,
col19,
col20,
col21,
col22,
col23,
col24,
col25,
col26,
col27,
col28,
col29,
col30,
col31,
col32,
col33,
col34,
col35,
col36,
col37,
col38,
col39,
col40,
col41,
col42,
col43,
col44,
col45,
col46,
col47,
col48,
col49,
col50)
SELECT col1,
col2,
col3,
col4,
col5,
col6,
col7,
col8,
col9,
col10,
col11,
col12,
col13,
col14,
col15,
col16,
col17,
col81,
col19,
col20,
col21,
col22,
col23,
col24,
col25,
col26,
col27,
col28,
col29,
col30,
col31,
col32,
col33,
col34,
col35,
col36,
col37,
col38,
col39,
col40,
col41,
col42,
col43,
col44,
'Some Other Value',
col46,
col47,
col48,
col49,
col50
FROM myschema.mytbl
WHERE col5 = 'Some Value';
多少開銷不創建/刪除臨時表介紹?例如,如果這是生產規模系統的日常流程的一部分,額外的開銷是否會顯着?我意識到這很大程度上取決於系統的具體情況,但總體思路會很棒。
當你說「當面臨在數據庫中複製記錄的任務時」,你真的指*一個記錄*嗎?因爲使用一個臨時表來處理這些數據是一個瘋狂的開銷。 – APC 2010-10-29 22:06:37