PL/SQL Best Practice On BULK COLLECT
On BULK COLLECT
By Steven Feuerstein Oracle ACE
Best practices for knowing your LIMIT and kicking %NOTFOUND
I have started using BULK COLLECT whenever I need to fetch large volumes of data. This has caused me some trouble with my DBA, however. He is complaining that although my programs might be running much faster, they are also consuming way too much memory. He refuses to approve them for a production rollout. What's a programmer to do?
The most important thing to remember when you learn about and start to take advantage of features such as BULK COLLECT is that there is no free lunch. There is almost always a trade-off to be made somewhere. The tradeoff with BULK COLLECT, like so many other performance-enhancing features, is "run faster but consume more memory."
Specifically, memory for collections is stored in the program global area (PGA), not the system global area (SGA). SGA memory is shared by all sessions connected to Oracle Database, but PGA memory is allocated for each session. Thus, if a program requires 5MB of memory to populate a collection and there are 100 simultaneous connections, that program causes the consumption of 500MB of PGA memory, in addition to the memory allocated to the SGA.
Fortunately, PL/SQL makes it easy for developers to control the amount of memory used in a BULK COLLECT operation by using the LIMIT clause.
Suppose I need to retrieve all the rows from the employees table and then perform some compensation analysis on each row. I can use BULK COLLECT as follows:
PROCEDURE process_all_rows
IS
TYPE employees_aat
IS TABLE OF employees%ROWTYPE
INDEX BY PLS_INTEGER;
l_employees employees_aat;
BEGIN
SELECT *
BULK COLLECT INTO l_employees
from employees;
FOR indx IN 1 .. l_employees.COUNT
&nbs
Ïà¹ØÎĵµ£º
дÁËÒ»¸öС³ÌÐò£¬Ê¹ÓÃÁËsql server 2005Êý¾Ý¿â£¬µ±Ê±¸ÃÊý¾Ý¿â·Åµ½ÁËC:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\DataÏÂÃæ£¬µ«ÊÇÏÖÔÚ¾õµÃ²»·½±ã£¬Ïë°ÑËü×ªÒÆµ½ÎÒÕâ¸öÍøÕ¾´úÂëËùÔÚµÄÄǸöĿ¼£¬±ÈÈçd£º\network\app_dataÏÂÃæ£¬ÇëÎÊÔõôת¹ýÈ¥£¬Ð»Ð»£¿
»¹ÓÐÒ»¸öÎÊÌ⣬¾ÍÊÇÎÒ¿´C:\Program Files\Microsoft SQL Serve ......
http://zhanglei1286.blog.163.com/blog/static/1895797120091112113019600/
ÔÚºǫ́´úÂëÀ
SQL 2000:
static string StrConn = "server=.;uid=sa;pwd=sa;database=MyCUDS";
SQL2005:
con = new SqlConnection(@"Server=.\SQLExpress;Database=db_CMS;Persist Security Info=True;User ID=sa;Password=Masslong");
......
²éѯËÙ¶ÈÂýµÄÔÒòºÜ¶à£¬³£¼ûÈçϼ¸ÖÖ£º
¡¡¡¡1¡¢Ã»ÓÐË÷Òý»òÕßûÓÐÓõ½Ë÷Òý(ÕâÊDzéѯÂý×î³£¼ûµÄÎÊÌ⣬ÊdzÌÐòÉè¼ÆµÄȱÏÝ)
¡¡¡¡2¡¢I/OÍÌÍÂÁ¿Ð¡£¬ÐγÉÁËÆ¿¾±Ð§Ó¦¡£
¡¡¡¡3¡¢Ã»Óд´½¨¼ÆËãÁе¼Ö²éѯ²»ÓÅ»¯¡£
¡¡¡¡4¡¢ÄÚ´æ²»×ã
¡¡¡¡5¡¢ÍøÂçËÙ¶ÈÂý
¡¡¡¡6¡¢²éѯ³öµÄÊý¾ÝÁ¿¹ý´ó(¿ÉÒÔ²ÉÓöà´Î²éѯ£¬ÆäËûµÄ·½·¨½µµÍÊý¾ÝÁ¿)
¡¡¡¡7¡¢ ......
Ëø»úÖÆ
NOLOCKºÍREADPASTµÄÇø±ð¡£
1. ¿ªÆôÒ»¸öÊÂÎñÖ´ÐвåÈëÊý¾ÝµÄ²Ù×÷¡£
BEGIN TRAN t
INSERT INTO Customer
SELECT 'a','a'
2. Ö´ÐÐÒ»Ìõ²éѯÓï¾ä¡£
SELECT * from Customer WITH (NOLOCK)
½á¹ûÖÐÏÔʾ"a"ºÍ"a"¡£µ±1ÖÐÊÂÎñ»Ø¹öºó£¬ÄÇôa½«³ÉΪÔàÊý¾Ý¡£(×¢:1ÖеÄÊÂÎñδÌá½») ¡£NOLOCK±íÃ÷ûÓжÔÊý¾Ý±íÌí¼Ó¹²Ï ......
×òÌìÎÒµÄSQL£¨Microsoft SQL Server 2005 £©µÇ¼²»ÉÏÈ¥ÁË£¬ÔÀ´ÊdzöÏÖÁ˼¸¸öСÎÊÌ⣬ÏÖÔڼǼһÏÂÎҵĽâ¾öÕ⼸¸öÇé¿öµÄ°ì·¨¡££¨½â¾ö·½·¨ÓкܶàÖÖ£¬ÕâЩֻÊÇÎҵĽâ¾ö·½·¨£¬½ö¹©²Î¿¼£©
²éÕÒÎÊÌâµÄ¹ý³Ì£º£¨×¢£ºÓÃwindowsÕ˺ݹÊÇ¿ÉÒԵǼµÄ£©
µÚÒ»²½£ºÆô¶¯ËùÓÐÓëSQLÓйصķþÎñ£¬ÎÊÌâÒÀ¾É£»
µÚ¶þ²½£º²é¿´windows·À»ðǽ£¬±»Ä¬ ......