हमारे पास जटिल SQL कोड का एक बड़ा टुकड़ा है जो HeidiSQL और MySQL WB में चलाने पर लगातार गिर जाता है। यदि हम एक ही कोड को कम संख्या में रिकॉर्ड के साथ चलाते हैं तो यह ठीक चलता है। हम सोच रहे हैं कि अगर हम एसपी में एक लूप बनाते हैं जहां कोड प्रभावी रूप से 10 से 20 रन में विभाजित हो जाता है तो यह सफलतापूर्वक पूरा हो सकता है। मुझे लगता है कि इसमें 10 से 20 टेबल बनाना शामिल हो सकता है जो बाद में एक टेबल में यूनियन-एड होते हैं।

छोटे डेटा सेट पर चलने की कोशिश की, ठीक चलता है। सर्वर रैम और डिस्क स्थान को बढ़ाने का प्रयास किया। कोड को कई अलग-अलग तरीकों से अपनाने की कोशिश की।

मुझे एहसास है कि यह आदर्श समाधान नहीं हो सकता है लेकिन इसे इस तरह से करने के लिए कहा गया है। अगर कोई मुझे कोड के साथ मदद कर सकता है तो मैं आभारी रहूंगा।

नीचे कोड मैंने बनाया है लेकिन काम नहीं करता है ...

DELIMITER $$
 DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
 CREATE PROCEDURE test_mysql_while_loop()
 BEGIN
 DECLARE x  INT;

 SET x = 100;

 WHILE x  <= 2000 DO

   DROP TABLE if EXISTS tablex; /* want to end up with table100-table2000 */

   CREATE TABLE tablex AS (
   SELECT t1.*
    FROM bigtables t1
    WHERE urn BETWEEN x AND x+101); /* select records where the URN is between 100 and 201 in 1st instance , 200 and 301 in second etc*/

    SET x=x+100;

 END WHILE;

 END$$
DELIMITER ;

CALL test_mysql_while_loop();

20 टेबल

0
Andrew Whittam 15 मई 2019, 18:17

1 उत्तर

सबसे बढ़िया उत्तर

बयानों को तैयार करने और निष्पादित करने का एक सरल उदाहरण यहां दिया गया है

 DROP PROCEDURE IF EXISTS p;
 delimiter $$
 CREATE PROCEDURE p()
 BEGIN
 DECLARE x  INT;

 SET x = 100;

 WHILE x  <= 300 DO

   set @sql= (select concat('DROP TABLE if EXISTS table',x)); 

   select @sql;
   prepare sqlstmt from @sql;
   execute sqlstmt;
   deallocate prepare sqlstmt;

   set @sql = (select concat('CREATE TABLE table',x,' AS 
   SELECT t1.*
    FROM users t1;'));

    select @sql;
   prepare sqlstmt from @sql;
   execute sqlstmt;
   deallocate prepare sqlstmt; 

     SET x=x+100;

 END WHILE;

 END$$
DELIMITER ;

CALL p();
0
P.Salmon 15 मई 2019, 16:19