Sorgu zaman aşımı hatalarını giderme

Summary

SQL Server sorgu zaman aşımı hatası, istemci uygulamasının komut zaman aşımı süresi dolmadan önce bir sorgu veri döndürmediğinde oluşur. İstemci uygulaması sorguyu iptal eder ve "Zaman aşımı süresi doldu" sözlerini bildirir. Bu makalede sorgu zaman aşımının (bağlantı zaman aşımı değil) oluştuğunun nasıl doğrulanacağı, olayı ve rpc_completed genişletilmiş olaylarla sql_batch_completed ilişkilendirerek belirli sorgunun attention nasıl tanımlanacağı ve ADO.NET, ODBC, JDBC, OLE DB ve ADO'da komut zaman aşımının nasıl ayarlanacağı açıklanır. En yaygın neden yavaş bir sorgu olduğundan, önerilen düzeltme yalnızca zaman aşımı değerini yükseltmek yerine sorguyu ayarlamaktır. SQL Server yapılandırılan zaman aşımıyla yakından eşleşen bir süreyle Dikkat olayları (hata 3617) kaydederken bir uygulama zaman aşımı hataları bildirdiğinde bu makaleyi kullanın.

Sorgu zaman aşımı hatasının belirtileri

Bir uygulamanın SQL Server veritabanındaki verileri sorguladığını varsayalım. Sorgu yapılandırılan zaman aşımı değeri (genellikle 30 saniye) içinde veri döndürmezse, uygulama sorguyu iptal eder ve şu hata iletilerinden birini oluşturur:

  • Zaman aşımı süresi doldu. İşlem tamamlanmadan zaman aşımı süresi doldu veya sunucu yanıt vermiyor. Deyim sonlandırıldı.

  • System.Data.SqlClient.SqlException: Zaman aşımı süresi doldu. İşlem tamamlanmadan zaman aşımı süresi doldu veya sunucu yanıt vermiyor.

Sorgu zaman aşımı hataları neden oluşur?

Bu hatalar uygulama tarafında oluşur. Uygulama bir zaman aşımı değeri ayarlar ve zaman aşımına ulaşılırsa sorguyu iptal eder. SQL Server tarafında, istemci tarafından bir sorgu iptali Dikkat olayına neden olur, hata 3617 (MSSQLSERVER_3617). Uygulama tarafındaki zaman aşımı değeri 0 (zaman sınırı yok) olarak ayarlanırsa, Database Engine ne kadar süre olduğuna bakılmaksızın sorgu tamamlanana kadar (milisaniye veya gün) yürütülür.

Zaman aşımı değeri her veri erişim sürücüsü veya API için farklı ayarlanır:

Sorgu zaman aşımı, bağlantı zaman aşımı özelliğinden farklıdır. İkinci seçenek, başarılı bir bağlantının ne kadar süreyle beklenip beklenmeyeceklerini denetler ve sorgu yürütmeye dahil değildir. Daha fazla bilgi için bkz. Sorgu zaman aşımı, bağlantı zaman aşımıyla aynı değildir.

Zaman aşımına neden olan sorguyu tanımlama ve çözme adımları

Sorgu zaman aşımlarının en yaygın nedeni, sorguların yetersiz performansa neden olmasıdır. Bu, sorgunun önceden tanımlanmış sorgu zaman aşımı değerinden daha uzun çalıştığı anlamına gelir. Bu sorunu çözmek için sorgunun daha hızlı çalışmasını sağlayın. Sorguları şu şekilde de denetleme:

  1. Zaman aşımı hatalarına neden olan sorguları tanımlamak için Genişletilmiş Olaylar veya SQL İzleme'yi kullanın. ve genişletilmiş olaylarıyla sql_batch_completed birlikte dikkatrpc_completedve bunları aynı session_idüzerinde ilişkilendirebilirsiniz. Tamamlanan bir olayın hemen ardından bir dikkat olayı geldiğini ve tamamlanan olayın süresinin yaklaşık olarak zaman aşımı ayarına karşılık geldiğini gözlemlerseniz sorguyu tanımlamış olursunuz. Bir örnek aşağıda verilmiştir:

    Not

    Örnekte sorgu SELECT neredeyse tam olarak 30 saniye boyunca çalışır ve durur. Aynı oturum kimliğine sahip dikkat olayı, uygulamanın sorguyu iptal ettiğini gösterir.

    Veri Akışı Adı Session_id Sql_text Süre (mikrosaniye) Zaman damgası
    sql_batch_started 54 … From Customers WHERE cid = 192937 NULL 2021-09-30 09:50:25.0000
    sql_batch_completed 54 … From Customers WHERE cid = 192937 29999981 2021-09-30 09:50:55.0000
    Dikkat 54 … From Customers WHERE cid = 192937 40000 2021-09-30 09:50:55.0400
  2. Sorguları sqlcmd veya SQL Server Management Studio (SSMS) içinde yürütün ve test edin.

  3. Sorgular sqlcmd ve SSMS'de de yavaşsa, sorguların performansını giderin ve geliştirin. Ayrıntılı bilgi için bkz. SQL Server yavaş çalışan sorgularda sorun giderme.

    Not

    sqlcmd ve SSMS'de zaman aşımı değeri 0 olarak ayarlanır (zaman sınırı yoktur) ve sorguları test edip araştırabilirsiniz.

  4. Sorgular sqlcmd ve SSMS'de hızlıysa ancak uygulama tarafında yavaşsa, sorguları sqlcmd ve SSMS'de kullanılan SET seçeneklerini kullanacak şekilde değiştirin. Genişletilmiş Olaylar izlemesi toplayarak (oturum açma ve olayları ile collect_options_textbağlama) SET seçeneklerini karşılaştırın ve sütunu denetleyin options_text . Bir örnek aşağıda verilmiştir:

    ALTER EVENT SESSION [setOptions] ON SERVER 
    ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1) 
        ACTION(package0.event_sequence,package0.last_error,sqlos.system_thread_id,sqlserver.context_info,sqlserver.session_id,sqlserver.sql_text)), 
    ADD EVENT sqlserver.login(SET collect_options_text=(1)
        ACTION(sqlos.system_thread_id,sqlserver.context_info,sqlserver.sql_text))
    

    Daha fazla bilgi için bkz . Veritabanı uygulaması ile SSMS arasındaki sorgu performansı farkını giderme.

  5. Ayarın CommandTimeout beklenen sorgu süresinden küçük olup olmadığını denetleyin. Kullanıcının ayarı doğruysa ve zaman aşımları yine de oluşuyorsa, bunun nedeni sorgu performansı sorunudur. Zaman aşımı değeri 10 saniye olarak ayarlanmış bir ADO.NET kod örneği aşağıda verilmişti:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main()
            {
                string ConnectionString = @"Data Source=.\sql2019;Integrated Security=SSPI;Initial Catalog=tempdb;";
                string queryString = "exec test";
    
                using (SqlConnection connection = new SqlConnection(ConnectionString))
                {
                    connection.Open();
                    SqlCommand command = new SqlCommand(queryString, connection);
    
                    // Setting command timeout to 10 seconds
                    command.CommandTimeout = 10;
                    //command.ExecuteNonQuery();
                    try {
                        command.ExecuteNonQuery();
                    }
                    catch (SqlException e) {
                        Console.WriteLine("Got expected SqlException due to command timeout ");
                        Console.WriteLine(e);
                    }
                }
            }
        }
    }
    

Sorgu zaman aşımı, bağlantı zaman aşımı ile aynı değil

Sorgu zaman aşımı, bağlantı zaman aşımından veya oturum açma zaman aşımından farklıdır. Bağlantı veya oturum açma zaman aşımı, veritabanı sunucusuna ilk bağlantı önceden tanımlanmış bir zaman aşımı süresine ulaştığında gerçekleşir. Bu noktada istemci sunucuya herhangi bir sorgu göndermemiştir. Bu iletiler, bağlantı zaman aşımı veya oturum açma zaman aşımı hatalarına örnektir:

  • Bağlantı Zaman Aşımı Süresi Doldu. Oturum açma öncesi el sıkışma onayını işlemeye çalışırken zaman aşımı süresi geçti. Bunun nedeni oturum açma öncesi el sıkışmanın başarısız olması veya sunucunun zamanında yanıt verememesi olabilir. Bu sunucuya bağlanmaya çalışılırken harcanan süre: [Oturum Açma Öncesi] başlatma=23; el sıkışma=14979;

  • Zaman aşımı süresi doldu. İşlem tamamlanmadan zaman aşımı süresi doldu veya sunucu yanıt vermiyor. System.ComponentModel.Win32Exception (0x80004005): Bekleme işlemi zaman aşımına uğradı.

Bağlantı zaman aşımı değeri bir istemci tarafı ayarıdır ve genellikle 15 saniye olarak ayarlanır. Bağlantı zaman aşımı sorunlarını giderme hakkında daha fazla bilgi için bkz. Bağlantı zaman aşımı hatalarını giderme.