Bugün, sunucu bir CC saldırısına maruz kaldı ve IIS'teki web sitesi takıldı, yeniden başlattıktan sonra web sitesi tekrar kapandı, web sitesi hata kaydını aşağıdaki gibi kontrol edin:
System.Data.Entity.Core.EntityCommandExecutionException: 执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 执行超时已过期。完成操作之前已超时或服务器未响应。 ---> System.ComponentModel.Win32Exception: 等待的操作过时。
Çok sayıda sorgulu zaman aşımı istisnası web sitesinin takılmasına neden olur ve sorgu zaman aşımına bağlı SQL ifadeleri rastgele veri alma yönteminden gelir, kod şöyledir:
Kod kabaca şu anlamda ifade eder: veritabanından rastgele seçilen 10 veri parçası, yeter ki mevcut ID'yi çoğaltmasınlar.
Basit bir gereklilik gibi görünen şey, sunucunun telefonu kapatmasına neden oldu! Yukarıdaki kod tarafından oluşturulan SQL ifadesi şöyledir:
Uygulama planı şöyledir:
Veritabanında 1 milyon veri varsa, önce 999.999 veri parçası alınmaz, sonra bu 999.999 veriden 10 parça veri alınmaz mı?
DBA grubunun büyük adamına sorun ve cevabı alın: "EvetAman Tanrım, bu yavaş olmalı ve bu sql ifadesini defalarca çağırman gerekiyor.
İlk başta bunun EF sorunu olduğunu düşündüm,Aslında, doğrudan SQL ile yazarsanız, iyi bir çözüm yoktur。
Eğer öyleyse, lütfen bana öğret!
|