insert l'opération dans une table bigquery

Je veux insert toutes les lignes d'une table SQL Server dans une table Bigquery ayant le même schéma. L'insertion en continu ligne par ligne est très lente: pour insert 1000 lignes, l'exécution du code ci-dessous a pris environ 10 minutes. Dans ce code, je boucle sur les 10 premiers files dans un certain dossier, et j'insère le contenu de ce file dans une table SQL Server unique. Une fois que j'ai boukey sur les files désirés, je boucle sur la table SQL Server (qui contient toutes les lignes de tous les files) et j'insère le contenu ligne par ligne dans une table Bigquery. Enfin, je supprime ces files et je vide la table du server SQL

Cette opération est très lente.

Quelqu'un peut-il avoir une meilleure solution pour insert le contenu d'une table SQL Server dans une table Bigquery automatiquement (via un code) ?? Par exemple, insérez tout le contenu de la table sql server dans la table bigquery dans un bloc (et non rangée par rangée).

Merci

C'est mon code (en coldfusion):

<cfsilent> <cfinclude template="app_locals.cfm" /> <cfinclude template="act_BigqueryApiAccess.cfm" /> </cfsilent> <!--- 1er traitement BQ: Insertion des colis traités ---> <!--- logging du début du 1er traitement BQ (TShipping)---> <cfset BigqueryTShipping_StartDate=now()> <cfset QueryName = "InsertBigqueryLogTShippingStartDate"> <cfinclude template="qry_item.cfm"> <cfdirectory action="list" directory="#FileRoot#\_data\_Bigquery\TShipping" listinfo="all" type="file" name="FList" sort="datelastmodified"> <cfset FileList = Valuelist(FList.name)> <cfoutput><h3>FileList: #FileList#</h3></cfoutput> <cfif len(sortingm(FileList))> <!--- traiter les 10 derniers files (les MaxNbFile less récents) ---> <cfset FileLoop = 1> <cfloop list="#FileList#" index="FileName"> <cfset PathFile="#FileRoot#\_data\_Bigquery\TShipping\#FileName#"> <cfset QueryName = "InsertTShipping"> <cfinclude template="qry_item.cfm"> <cfset FileLoop = FileLoop+1> <cfif FileLoop GT Atsortingbutes.MaxNbFile> <cfbreak /> </cfif> </cfloop> </cfif> <!--- instancier un object de type (class) TableRow ---> <cfobject action="create" type="java" class="com.google.api.services.bigquery.model.TableRow" name="row"> <!--- <cfdump var="#row#"> ---> <cfset QueryName = "GetParcels"> <cfinclude template="qry_item.cfm"> <cfloop query="GetParcels"> <cfset row.set("Tracking_Date",mid(Tracking_Date,6,19))> <cfset row.set("TShipping_ID", TShipping_ID)> <cfset row.set("TShipping_Tracking", TShipping_Tracking)> <cfset row.set("Shipper_ID", Shipper_ID)> <cfset rows.setInsertId(sys.currentTimeMillis())> <cfset rows.setJson(row)> <cfset rowList.add(rows)> <cfset content=rqst.setRows(rowList)> <cfset response = bq.tabledata().insertAll(Project_ID,Dataset_ID,Table_ID, content).execute()> </cfloop> <!---vider la table TShipping_BQ---> <cfset QueryName = "DeleteOldTShipping_BQParcels"> <cfinclude template="qry_item.cfm"> <!--- Suppression des files traités ---> <cfif len(sortingm(FileList))> <cfset TShippingFileNb=len(sortingm(FileList))> <cfset FileLoop = 1> <cfloop list="#FileList#" index="FileName"> <cfset PathFile="#FileRoot#\_data\_Bigquery\TShipping\#FileName#"> <cffile action="move" source="#PathFile#" destination="#FileRoot#\_data\_Bigquery\TShippingArchive"> <!--- <cffile action="delete" file="#PathFile#"> ---> <cfset FileLoop = FileLoop+1> <cfif FileLoop GT Atsortingbutes.MaxNbFile> <cfbreak /> </cfif> </cfloop> <cfelse> <cfset TShippingFileNb=0> </cfif> <!--- logging du nb de files TShipping traités ---> <cfset QueryName = "InsertBigqueryLogTShippingNb"> <cfinclude template="qry_item.cfm"> <!--- logging de la fin du 1er traitement BQ---> <cfset BigqueryTShipping_EndDate=now()> <cfset QueryName = "InsertBigqueryLogTShippingEndDate"> <cfinclude template="qry_item.cfm"> 

Vous devriez pouvoir déplacer votre insertAll() dehors de la boucle. Il y a peut-être un moment où vous essayez d'insert trop d'loggings et vous devez les regrouper à ce moment-là. Par exemple, une fois que vous avez atteint 1000 loggings, insérez-les et réinitialisez votre tableau rowList

 <cfloop query="GetParcels"> <cfset row = something()><!--- you need to re-create row for each loop or else you're updating a reference with each loop ---> <cfset row.set("Tracking_Date",mid(Tracking_Date,6,19))> <cfset row.set("TShipping_ID", TShipping_ID)> <cfset row.set("TShipping_Tracking", TShipping_Tracking)> <cfset row.set("Shipper_ID", Shipper_ID)> <cfset rows.setInsertId(sys.currentTimeMillis())> <cfset rows.setJson(row)> <cfset rowList.add(rows)> </cfloop> <cfset content=rqst.setRows(rowList)> <cfset response = bq.tabledata().insertAll(Project_ID,Dataset_ID,Table_ID,content).execute()> 

Un exemple de ce que je veux dire par dosage

 <cfloop query="GetParcels"> <cfset row.set("Tracking_Date",mid(Tracking_Date,6,19))> <cfset row.set("TShipping_ID", TShipping_ID)> <cfset row.set("TShipping_Tracking", TShipping_Tracking)> <cfset row.set("Shipper_ID", Shipper_ID)> <cfset rows.setInsertId(sys.currentTimeMillis())> <cfset rows.setJson(row)> <cfset rowList.add(rows)> <cfif arrayLen(rowList) EQ 1000> <cfset content=rqst.setRows(rowList)> <cfset response = bq.tabledata().insertAll(Project_ID,Dataset_ID,Table_ID,content).execute()> <cfset rowList = []> </cfif> </cfloop> <!--- add this check in case there are exactly an increment of 1000 rows ---> <cfif ! arrayIsEmpty(rowList)> <cfset content=rqst.setRows(rowList)> <cfset response = bq.tabledata().insertAll(Project_ID,Dataset_ID,Table_ID,content).execute()> </cfif>