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