В настоящее время у меня возникает странная проблема, с которой мое понимание SQL-сервера не совсем совпадает.Мы используем SQL в качестве хранилища файлов для нашей службы внутреннего хранения, и в нашей базе данных содержится около полумиллиона строк.Большинство файлов (86%) имеют размер 1 Мб или меньше, но даже на свежих копиях нашей базы данных, где мы просто заполняем таблицу данными для целей теста, оказывается, что строки с большими объемами данных, хранящиеся в BLOB, частовызвать таймауты, когда наш сервер SQL находится под нагрузкой.Мое понимание того, как SQL-сервер удаляет строки, состоит в том, что это процесс сбора мусора, то есть строка помечается как призрак, а строка впоследствии удаляется процессом очистки призрака после того, как изменения будут скопированы в журнал транзакций.Это наводит меня на мысль, что независимо от размера данных в BLOB, удаление строк должно быть близко к мгновенному.Однако при удалении этих строк мы определенно испытываем большое количество тайм-аутов и поразительно низкую производительность.
В нашем наборе тестовых данных это файлы размером более 30 МБ, которые вызывают эту проблему.Это крайний случай, мы не часто сталкиваемся с этим, и хотя мы рассматриваем файловый поток SQL как решение некоторых наших проблем, мы пытаемся сузить источник этих проблем.
Мы выполняем удаление внутри транзакции.Мы также выполняем обновления метаданных, таких как статистика размера файла, но они существуют в отдельной таблице отдельно от данных файла.Данные иерархии хранятся в таблице, которая содержит информацию о файле.
Действительно, в конце концов, это не так много, что мы делаем с удалениями, которые имеют значение, мы просто не можем найти никаких ссылок на низкое удалениепроизводительность на строках, которые содержат большой объем данных в BLOB.Мы пытаемся определить, стоит ли исследовать этот путь, или это должен быть один из наших процессов, связанных с удалением, которое вызывает проблему.Есть ли ситуации, в которых это может произойти?Является ли обычным для сервера базы данных время полного истечения времени ожидания, когда многие из этих удалений происходят одновременно?Есть ли способ борьбы с этой проблемой, если она существует?