Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Belirtiler
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.
Açıklama
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 olarak ayarlanırsa (zaman sınırı yoksa), Veritabanı Altyapısı tamamlanana kadar sorguyu yürütür.
- .NET Framework’de System.Data.SqlClient zaman aşımı değeri CommandTimeout özelliğinde ayarlanır.
- ODBC API'sinde, SQLSetStmtAttr işlevindeki özniteliği aracılığıyla
SQL_ATTR_QUERY_TIMEOUT
ayarlanır. - Java Veritabanı Bağlantısı (JDBC) API’sinde setQueryTimeout yöntemiyle ayarlanır.
- OLEDB'de, yapısındaki
DBPROP_COMMANDTIMEOUT
DBPROP
özelliği aracılığıyla ayarlanır. - VBA’da (Excel) ADODB.Command.CommandTimeout özelliğiyle 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ı ile aynı değildir.
Sorun giderme adımları
Açık arayla, 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. Sorgunun daha hızlı çalışmasını sağlama, sorun giderme işleminizin önerilen ilk hedefidir. Sorguları şu şekilde de denetleme:
Zaman aşımı hatalarına neden olan sorguları belirlemek için Genişletilmiş Olaylar veya SQL İzleme'yi kullanın. ve genişletilmiş olaylarıyla
rpc_completed
sql_batch_completed
birlikte dikkat olayını izleyebilir ve 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ıştı ve durduruldu. Aynı oturum kimliğine sahip olan dikkat olayı, sorgunun uygulama tarafından iptal edildiğine işaret eder.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 SORGULARı SQLCMD'de veya SQL Server Management Studio'da (SSMS) yürütün ve test edin.
SQLCMD ve SSMS'de sorgular da yavaşsa, sorguların performansını giderin ve geliştirin. Ayrıntılı bilgi için bkz . SQL Server'da 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 edilebilir ve araştırılabilir.
Sorgular SQLCMD ve SSMS'de hızlı, 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_text
bağlama) SET seçeneklerini karşılaştırın ve sütunu denetleyinoptions_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.
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 bir 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 aşamada, sunucuya hiçbir sorgu gönderilmedi. Bu iletiler bağlantı veya oturum açma zaman aşımı hatası örnekleridir:
-
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ı sorunlarını giderme. Sorgu zaman aşımı sorunlarını gidermek için bu videoyu izleyin.