Днес сървърът претърпя CC атака, която доведе до блокиране на сайта на IIS, и сайтът отново беше блокиран след рестартиране, проверете лога за грешки на сайта по следния начин:
System.Data.Entity.Core.EntityCommandExecutionException: 执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 执行超时已过期。完成操作之前已超时或服务器未响应。 ---> System.ComponentModel.Win32Exception: 等待的操作过时。
Голям брой изключения от таймаут на заявки карат уебсайта да застоява, а SQL операторите за таймаут на заявката идват от метод за вземане на случайни данни, кодът е следният:
Кодът приблизително означава: 10 парчета данни се избират на случаен принцип от базата данни, стига да не дублират текущия идентификатор.
Това, което изглежда като просто изискване, е накарало сървъра да прекъсне! SQL операторът, генериран от горния код, е следният:
Планът за изпълнение е следният:
Ако базата данни съдържа 1 милион данни, не би ли трябвало първо да вземе 999 9999 парчета, а след това да вземе 10 парчета данни от тези 999 999 парчета?
Попитайте големия човек от групата на DBA и получете отговора: "ДаО, Боже, това сигурно е бавно и трябва да повтаряш това SQL твърдение много пъти.
Първоначално мислех, че е проблем с EF,Всъщност, ако пишеш директно в SQL, няма добро решение。
Ако да, моля, научи ме!
|