Lesson Learned #178: What is the command timeout when we are querying an External Table?

Published Jun 29 2021 08:57 AM 1,026 Views

Today, I received a very good question from a customer about what is the command timeout that external tables is using. Following I would like to share with you my experience playing with this. 

 

We need to know that the command timeout is configured by application side, so, for this reason, I developed a small C# application with the following characteristics:

 

  • Every loop I'm increasing the SELECT TOP in 100000 rows.
  • PerformanceVarcharNVarchar3 is an external tables that contains around 1.000.000.000 of rows. 
  • I used the connection statistiics to obtain the time invested on every operation. 
  • Changing the command timeout to multiple values (in this case to 0) the operation will wait until the command timeout is reached. 
                    for (int tries = 1; tries <= nRows; tries+=100000)
                    {
                        stopWatch.Start();
                        C.SqlCommand command = new C.SqlCommand("SELECT top " + tries.ToString() + "*  FROM [PerformanceVarcharNVarchar3]", oConn);
                        command.CommandTimeout = 0;
                        Console.WriteLine("------------------> Exec N#" + tries.ToString());
                        command.ExecuteNonQuery();
                        IDictionary currentStatistics = oConn.RetrieveStatistics();
                        if (bMetric)
                        {
                            Console.WriteLine("ID Connection: " + oConn.ClientConnectionId.ToString());
                            Console.WriteLine("BytesReceived:        " + currentStatistics["BytesReceived"]);
                            Console.WriteLine("BytesSent:            " + currentStatistics["BytesSent"]);
                            Console.WriteLine("SelectCount:          " + currentStatistics["SelectCount"]);
                            Console.WriteLine("SelectRows:           " + currentStatistics["SelectRows"]);
                            Console.WriteLine("ExecutionTime:        " + currentStatistics["ExecutionTime"]);
                            Console.WriteLine("Network Server time:  " + currentStatistics["NetworkServerTime"]);
                        }

 

 

Capture33.PNG

In this situation, as we could see, the command timeout that a query that is running using External Table will be the same that the application has. 

 

Enjoy! 

 

 

%3CLINGO-SUB%20id%3D%22lingo-sub-2497766%22%20slang%3D%22en-US%22%3ELesson%20Learned%20%23178%3A%20What%20is%20the%20command%20timeout%20when%20we%20are%20querying%20an%20External%20Table%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2497766%22%20slang%3D%22en-US%22%3E%3CP%3EToday%2C%20I%20received%20a%20very%20good%20question%20from%20a%20customer%20about%20what%20is%20the%20command%20timeout%20that%20external%20tables%20is%20using.%20Following%20I%20would%20like%20to%20share%20with%20you%20my%20experience%20playing%20with%20this.%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EWe%20need%20to%20know%20that%20the%20command%20timeout%20is%20configured%20by%20application%20side%2C%20so%2C%20for%20this%20reason%2C%20I%20developed%20a%20small%20C%23%20application%20with%20the%20following%20characteristics%3A%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CUL%3E%0A%3CLI%3EEvery%20loop%20I'm%20increasing%20the%20SELECT%20TOP%20in%20100000%20rows.%3C%2FLI%3E%0A%3CLI%3EPerformanceVarcharNVarchar3%20is%20an%20external%20tables%20that%20contains%20around%201.000.000.000%20of%20rows.%26nbsp%3B%3C%2FLI%3E%0A%3CLI%3EI%20used%20the%20connection%20statistiics%20to%20obtain%20the%20time%20invested%20on%20every%20operation.%26nbsp%3B%3C%2FLI%3E%0A%3CLI%3EChanging%20the%20command%20timeout%20to%20multiple%20values%20(in%20this%20case%20to%200)%20the%20operation%20will%20wait%20until%20the%20command%20timeout%20is%20reached.%26nbsp%3B%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-csharp%22%3E%3CCODE%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(int%20tries%20%3D%201%3B%20tries%20%26lt%3B%3D%20nRows%3B%20tries%2B%3D100000)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stopWatch.Start()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20C.SqlCommand%20command%20%3D%20new%20C.SqlCommand(%22SELECT%20top%20%22%20%2B%20tries.ToString()%20%2B%20%22*%20%20FROM%20%5BPerformanceVarcharNVarchar3%5D%22%2C%20oConn)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command.CommandTimeout%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22------------------%26gt%3B%20Exec%20N%23%22%20%2B%20tries.ToString())%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20command.ExecuteNonQuery()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IDictionary%20currentStatistics%20%3D%20oConn.RetrieveStatistics()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(bMetric)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22ID%20Connection%3A%20%22%20%2B%20oConn.ClientConnectionId.ToString())%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22BytesReceived%3A%20%20%20%20%20%20%20%20%22%20%2B%20currentStatistics%5B%22BytesReceived%22%5D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22BytesSent%3A%20%20%20%20%20%20%20%20%20%20%20%20%22%20%2B%20currentStatistics%5B%22BytesSent%22%5D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22SelectCount%3A%20%20%20%20%20%20%20%20%20%20%22%20%2B%20currentStatistics%5B%22SelectCount%22%5D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22SelectRows%3A%20%20%20%20%20%20%20%20%20%20%20%22%20%2B%20currentStatistics%5B%22SelectRows%22%5D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22ExecutionTime%3A%20%20%20%20%20%20%20%20%22%20%2B%20currentStatistics%5B%22ExecutionTime%22%5D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%22Network%20Server%20time%3A%20%20%22%20%2B%20currentStatistics%5B%22NetworkServerTime%22%5D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22Capture33.PNG%22%20style%3D%22width%3A%20400px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F292339iC2B309B4496BFD32%2Fimage-size%2Fmedium%3Fv%3Dv2%26amp%3Bpx%3D400%22%20role%3D%22button%22%20title%3D%22Capture33.PNG%22%20alt%3D%22Capture33.PNG%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%E2%80%83%3C%2FP%3E%0A%3CP%3E%3CSTRONG%3EIn%20this%20situation%2C%20as%20we%20could%20see%2C%20the%20command%20timeout%20that%20a%20query%20that%20is%20running%20using%20External%20Table%20will%20be%20the%20same%20that%20the%20application%20has.%26nbsp%3B%3C%2FSTRONG%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EEnjoy!%E2%80%83%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-TEASER%20id%3D%22lingo-teaser-2497766%22%20slang%3D%22en-US%22%3E%3CP%3EToday%2C%20I%20received%20a%20very%20good%20question%20from%20a%20customer%20about%20what%20is%20the%20command%20timeout%20that%20external%20tables%20is%20using.%20Following%20I%20would%20like%20to%20share%20with%20you%20my%20experience%20playing%20with%20this.%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-TEASER%3E
Version history
Last update:
‎Jun 29 2021 08:57 AM
Updated by: