Я использую SQL Server CE 4.0 и получаю плохую производительность запросов DELETE
.
В моем столе 300 000 строк.
Мой запрос:
DELETE from tableX
where columnName1 = '<some text>' AND columnName2 = '<some other text>'
Я использую некластеризованный индекс для двух полей columnName1 и columnName2.
Я заметил, что когда количество строк для удаления невелико (например, <2000), индекс может помочь в производительности на 2-3X. Однако, когда число строк для удаления больше (скажем,> 15000), индекс вообще не помогает.
Моя теория для этого поведения заключается в том, что, когда число строк велико, обслуживание индекса убивает прирост, достигнутый с помощью индекса (поиск индекса вместо сканирования таблицы). Это верно?
К сожалению, я не могу избавиться от индекса, потому что он значительно помогает не-мутирующему выполнению запросов.
Кроме того, что еще я могу сделать, чтобы улучшить производительность удаления в случае с> 15 000 строк?
Я использую SQL Server CE 4.0 для Windows 7 (32-разрядный).
Мое приложение написано в C++ и использует интерфейс OLE DB для управления базой данных.
Существует нечто известное как " переломная точка ", где стоимость поиска отдельных строк с помощью поиска не стоит того, и проще просто выполнить одиночное сканирование вместо тысяч запросов.
Несколько вещей, которые вы можете рассмотреть для производительности:
имеют отфильтрованный индекс, если они поддерживаются в CE (я честно понятия не имею)
вместо того, чтобы удалять 15 000 строк одновременно, пакет удаляет их в куски.
рассмотрите "мягкое удаление" - там, где вы просто обновляете active
столбец до 0. Затем вы можете фактически удалить строки в меньших партиях в фоновом режиме. Я имею в виду, действительно ли пользователь сидит и ждет, чтобы вы удалили 15 строк 000+? Зачем?