I am writing several Azure script functions that read and write from / to an internal database and display relevant information on a web page.
I noticed extreme slowness or even a timeout in the web interface when loading a web page that calls the Azure Function script. After further research, I realized that the following:
- Azure function scripts sometimes take from 10 seconds to more than 1 minute to connect to an SQL database.
- Sometimes scripts will run in a few milliseconds, and it will take more than 3 minutes to fully run the script.
Here is my Azure Function script:
module.exports = function(context, req) { context.log("Function Started: " + new Date()); // Import package const sql = require('mssql'); var _ = require('underscore-node'); var moment = require('moment'); var Promise = require('promise'); // Create a configuration object for our Azure SQL connection parameters var config = { server: "***", // Use your SQL server name database: "***", // Database to connect to user: "***", // Use your username password: "***", // Use your password port: ***, // Since we're on Windows Azure, we need to set the following options options: { encrypt: true }, multipleStatements: true, parseJSON: true }; var flagDefinitionId = null; if (req.query.Id == null || req.query.Id == "" || req.query.Id.length == 0) { context.res = { // status: 200, /* Defaults to 200 */ body: "No have flagDefinitionId " }; context.done(); // return; } var listTicketsFlag = []; flagDefinitionId = req.query.Id; sql.close(); var DBSchema = "b8akjsms2_st."; sql.connect(config).then(function() { context.log("SQL Connected: " + new Date()); var getAllEventTicketGoToMarket = new Promise(function(resolve, reject) { var queryGetEvent = ";WITH EventLog1 AS(" + " SELECT MD1, max([DateTime]) as LTime from " + DBSchema + "EventLog" + " where ([Event] = 'Ticket_Go_To_Market' OR [Event] = 'Acknowledge_Timeout')" + " group by MD1 )" + " SELECT * from ( SELECT EV.MD1 , EV.MD2," + " (SELECT COUNT(*) from " + DBSchema + "EventLog where MD1 = EV.MD1 and [Event] = 'Market_Ticket_Clear') as TotalClear" + " FROM " + DBSchema + "[Ticket] T" + " JOIN (SELECT E.* from " + DBSchema + "EventLog E join EventLog1 E1 on E.MD1 = E1.MD1 and E.[DateTime] = E1.LTime) EV ON T.Id = EV.MD1" + " WHERE T.IsInMarket = 1 and EV.MD2 <> ''" + " AND T.Id NOT IN (Select TicketId from " + DBSchema + "TicketFlag where FlagDefinitionId = " + flagDefinitionId + ")" + " ) R where R.TotalClear > 0"; context.log("get event log - Ticket_Go_To_Market" + queryGetEvent); new sql.Request().query(queryGetEvent, (err, result) => { context.log("this is --------> EventLog " + result.recordset.length); resolve(result.recordset); }); }); Promise.all([getAllEventTicketGoToMarket]).then(function(values) { var ticketGoToMarket = values[0]; context.log("this is --------> values: " + values[0].length + " ==+++++==== " + JSON.stringify(values[0], null, 2)); if (ticketGoToMarket.length != 0) { listTicketsFlag = _.filter(ticketGoToMarket, function(num) { var countSP = num.MD2.split(','); // context.log("countSP =====> " + countSP.length + "num.TotalClear ==>" + num.TotalClear) if (num.TotalClear > countSP.length) { return num.MD1; } }); // context.log("listTicketsFlag =====> " + JSON.stringify(listTicketsFlag, null, 2)); } insertTicketFlag(); }); function insertTicketFlag() { context.log("this is ----- ===> Insert: " + listTicketsFlag); // insert var insertTicketFlagPromise = new Promise(function(resolve, reject) { context.log("listTicketFlag ----- ===> " + listTicketsFlag.length); if (listTicketsFlag.length == 0) { context.log(" -------------------- No have ticket need FLAG"); resolve(); } else { // insert new data to TicketFlag FlagTickets var listTicketInsert = ""; //convertArrayToSQLString(listTicketsFlag, true, flagDefinitionId); var len = listTicketsFlag.length - 1; for (var j = 0; j <= len; j++) { listTicketInsert += '(\'' + listTicketsFlag[j] + '\', \'' + flagDefinitionId + '\')'; if (j != len) { listTicketInsert += ","; } } context.log("HERE : " + listTicketInsert); var insertQuery = 'Insert into ' + DBSchema + '[TicketFlag] (TicketId, FlagDefinitionId) values ' + listTicketInsert + ''; context.log("this is --------> InsertQuery" + insertQuery); // return; context.log("read data of FlagRule"); new sql.Request().query(insertQuery, (err, result) => { context.log("this is --------> insertQuery"); resolve(result); }); } }); Promise.all([insertTicketFlagPromise]).then(function(values) { context.log("DONE ALL"); sql.close(); context.done(); }) } }).catch(function(err) { console.log(err); context.done(); });
};


How to solve this problem of slowness?
source share