【发布时间】:2011-06-07 13:33:48
【问题描述】:
有没有办法在 MySql 中使用 .Net / Connector 批量存储过程调用以提高性能?
这是场景...我正在使用一个接受一些参数作为输入的存储过程。此过程基本上检查是否应该更新现有记录或插入新记录(我没有使用 INSERT INTO .. ON DUPLICATE KEY UPDATE 因为检查涉及日期范围,所以我不能真正制作主键的标准)。
我想多次调用此过程(比如说 1000 个左右的批次)。我当然可以使用一个 MySqlConnection 和一个 MySqlCommand 实例并不断更改参数值,并调用 .ExecuteNonQuery()。
我想知道是否有更好的方法来批处理这些调用?
想到的唯一想法是手动构造一个字符串,如'call sp_myprocedure(@parama_1,@paramb_1);call sp_myprocedure(@parama_2,@paramb2);...',然后创建所有适当的参数.我不相信这会比多次调用 .ExecuteNonQuery() 更好。
有什么建议吗?谢谢!
编辑:更多信息
我实际上是在尝试定期存储来自外部数据源的数据。基本上,我正在获取域拍卖的 RSS 提要(来自 Godaddy、pool 等各种来源),并使用此存储过程(我们称之为 sp_storeSale)更新带有拍卖信息的表。现在,在这个存储销售信息的表中,我想保留给定域的销售历史记录,所以我有一个 domain 表和一个 sale 表. sale 表与 domain 表具有多对一的关系。
这是存储过程:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
CREATE PROCEDURE `DomainFace`.`sp_storeSale`
(
middle VARCHAR(63),
extension VARCHAR(10),
brokerId INT,
endDate DATETIME,
url VARCHAR(500),
category INT,
saleType INT,
priceOrBid DECIMAL(10, 2),
currency VARCHAR(3)
)
BEGIN
DECLARE existingId BIGINT DEFAULT NULL;
DECLARE domainId BIGINT DEFAULT 0;
SET @domainId = fn_getDomainId(@middle, @extensions);
SET @existingId = (
SELECT id FROM sale
WHERE
domainId = @domainId
AND brokerId = @brokerId
AND UTC_TIMESTAMP() BETWEEN startDate AND endDate
);
IF @existingId IS NOT NULL THEN
UPDATE sale SET
endDate = @endDate,
url = @url,
category = @category,
saleType = @saleType,
priceOrBid = @priceOrBid,
currency = @currency
WHERE
id = @existingId;
ELSE
INSERT INTO sale (domainId, brokerId, startDate, endDate, url,
category, saleType, priceOrBid, currency)
VALUES (@domainId, @brokerId, UTC_TIMESTAMP(), @endDate, @url,
@category, @saleType, @priceOrBid, @currency);
END IF;
END
如您所见,我基本上是在寻找未“过期”但具有相同域和经纪人的现有记录,在这种情况下,我假设拍卖尚未结束,并且数据是更新现有的拍卖。否则,我假设拍卖结束,这是一个历史记录,而我得到的数据是新的拍卖,所以我创建了一个新记录。
希望这能清除我想要实现的目标:)
【问题讨论】: