2010-07-01 101 views
0

我有3個存儲過程AddProductAddProductPropertiesAddOffer添加大量的數據到數據庫中。 我需要使用此過程從數據庫中的各種數據源導入數據。數據源的結構是可變的,所以它可能只包含產品或報價或兩者兼而有之。 我的算法是從數據源讀取記錄,然後調用必要的過程。 要調用程序,我使用帶參數的MySqlCommand使用多個存儲過程

問題:

  1. 什麼叫以這種方式 程序最快的方法?
  2. 我需要儲存3個MySqlCommand對象,並只更改參數 或者它沒有問題?
  3. 我如何可以緩存這些呼叫(每個呼叫我看到在跟蹤日誌記錄 「Retreiving程序元數據 PROCEDURENAME」)?

回答

0

多記錄SQL更新是關鍵

速度和插入各個呼叫就像油和水。 (哦,這不是一個好的聲明在這些時間使用)。

策略...

  • 導入各種數據源到匹配其佈局臨時表。使用數據庫的內置導入實用程序導入平面文件(或連接到其他數據庫或odbc等的表格 - 如果可以使外部數據源顯示爲附加表格,則可以跳過臨時表格部分)
  • 使用INSERT INTO AddProduct ...(從TempProducts1中選擇...)這樣的語句 - 或者鏈接表 - 將所有記錄放入一次
  • 如果您必須從多個輸入格式管理同一個目標表中的衝突,你仍然可以從sql批量查詢中做到這一點。
    • 你必須使用臨時表,然後
    • 如果temp1中導入之前勝過TEMP2然後
      Delete from temp2 where temp2.id in (select id from temp1)
      或simliar。
  • 你可以做通過更新連接表的相似,左外連接檢查空或不在右側的PK場等
  • 刪除臨時表。不抱怨臨時表!你不是我打賭的多用戶。你是我打賭的DBA。極端速度=極端措施。

一旦我甚至擺動這樣的東西,其後在文件中衝突的項目必須覆蓋更早的項目,與建立更新/插入/刪除查詢和臨時表,從外部平面文件。採取了5 +巨大的醜陋的SQL語句。沒有趣味,但比在同一個盒子上進行插入的代碼快100倍。這是一個單一的SP插入的模擬(好吧,也許不是那麼糟糕,它是vb4和訪問jet2.0 :-)。但是,網絡客戶端會因爲往返等而做WORSE。

您還可以通過多記錄SQL更新來治癒癌症。

+0

如果你有時間前後,我會好奇,看看他們是什麼;-)如果你得到一分鐘,就會發表評論。謝謝 – FastAl 2010-07-08 15:52:00

2

兩個建議:

使用上的MySqlCommand

的的MySqlCommand類上有一個準備方法的準備方法。如果您必須重複調用這些存儲過程,那麼我會使用它來儘量減少每次執行必須完成的工作量。下面大概是我認爲會涉及的步驟:

  1. 設置命令對象(每個存儲過程一個),包括任何必要的參數。

  2. 打開您的數據

    4.1連接到數據庫

  3. 呼籲每個命令一次

  4. 迭代Prepare方法。根據您的數據

    4.2更新命令的參數值。在命令中調用相應的執行方法

雖然我不確定您會從中獲得多少性能好處。

如果您正在執行臨時語句而不是過程(或者甚至是過程),那麼我認爲需要注意的一件重要事情是使用參數,而不是簡單地將您的值連接到命令文本中。如果您要使用字符串連接方法(在大多數情況下我認爲這通常是一個壞主意),那麼您可能無法利用Prepare方法,因爲您將不得不修改每個執行的命令。

是否有BulkInsert/bulkcopy選項可用?

我不熟悉MySQL作爲與SQL Server; ADO.Net具有可用於將大量數據插入SQL Server的大容量複製功能。我不知道MySQL是否具有類似的功能,但如果是,並且您有大量數據要插入,請考慮使用該功能,而不是重複調用存儲過程。

+0

如果我打電話準備三個程序,那麼對於所有三個程序或只有最後一個程序纔會實際執行? – 2010-07-01 14:54:26