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