我正在为Sybase数据库编写存储过程。我正在使用Sybase Central 16.0作为开发环境。我正在使用的计算机运行Microsoft Windows Server 2012 R2 Standard,并在2.8GHz CPU上运行16GB RAM。
我的存储过程使用游标遍历具有大约40万记录的表中的记录。每条记录将递增地写入LONG VARCHAR
变量中,而每N条记录将proc对该变量运行MD5哈希值,并将该值存储在单独的表中。
TABLE_NAME, DATE_TIME_RAN, FROM_RECORD, TO_RECORD, HASH_VALUE
如果我仅运行存储过程以将该表作为SQL Anywhere中的SQL块进行哈希处理(例如:BEGIN ... <hash the table here> ... END;
),它将遍历所有记录并在大约两分钟内成功完成。但是,如果我将此存储过程作为嵌入式命令运行在另一个存储过程(例如:CALL <MY_SCHEMA>.<MY_STORED_PROCEDURE>
)中,则它将永远不会完成。
为什么在另一个存储过程中运行存储过程(在同一数据集上)会有不同的表现?
答案 0 :(得分:0)
设法找到了一个更好的解决方案,而无需浏览表格。我以为我会将解决方案发布给可能遇到类似问题的任何人。
对存储过程的要求是一次循环遍历一张大表,将行中每一列的内容连接成一个字符串,并将其分配给一个变量。每N行此变量的值将被写入一个单独的表。以前,我一直使用游标执行此操作,但是我们团队的开发人员发现了使用WITH子句的更快方法。
INSERT INTO <MY_SCHEMA>.<MY_TABLE_THAT_WILL_CONTAIN_THE_CONCATENATED_VALUES_OF_EVERY_N_ROWS>
WITH
CONCATENATE_ROWS AS (
SELECT RANK() OVER (ORDER BY <PRIMARY_KEY_COLUMN>) AS ROWID, <PRIMARY_KEY_COLUMN>, <COLUMN_1> || '' || <COLUMN_2> || '' || ... <COLUMN_N> AS ROW_DETAIL
FROM <MY_TABLE_THAT_I_AM_QUERYING>
ORDER BY <PRIMARY_KEY_COLUMN>
),
GROUPED_ROWS AS (
SELECT (((CONCATENATE_ROWS.ROWID-1)/ <number of rows I want to concatenate, e.g.: 10>)+1) AS GROUPID, CAST(LIST(CONCATENATE_ROWS.ROW_DETAIL, '' ORDER BY <PRIMARY_KEY_COLUMN>) AS VARCHAR(4000)) AS CONCAT_DETAILS
FROM CONCATENATE_ROWS
GROUP BY (((CONCAT_ORDERS.ROWID-1)/ <number of rows I want to concatenate, e.g.: 10>)+1)
)
SELECT <Whatever columns I want to insert into <MY_TABLE_THAT_WILL_CONTAIN_THE_CONCATENATED_VALUES_OF_EVERY_N_ROWS>>
FROM GROUPED_ROWS;