Вы получили много хороших предложений по использованию StringBuilder. Чтобы еще больше повысить производительность и, поскольку вы ожидаете большого результата строки, я бы также порекомендовал вам выбрать хорошую начальную емкость, чтобы уменьшить количество раз, когда внутренний буфер строки необходимо расширять.
StringBuilder strSelect = new StringBuilder("SELECT * FROM " + _strTableName + " WHERE ", 8192);
Обратите внимание, что я выбрал 8192 символа здесь, но вы можете инициализировать его большим числом, если вы действительно добавляете "9000" строк данных к вашему состоянию. Определите свой типичный размер и установите его на небольшую величину.
Способ работы StringBuilder заключается в том, что, когда вы добавляете строку и достигаете текущей емкости, он должен создать новый буфер и скопировать содержимое старого буфера в новый, а затем добавить новые символы. Чтобы оптимизировать производительность, новый буфер будет в два раза больше старого размера. Теперь начальная емкость по умолчанию составляет либо 16 символов, либо размер строки инициализации. Если длина получаемой строки составляет 5000 символов, то StringBuilder, созданный с размером по умолчанию, должен быть расширен в 9 раз - для этого требуется новое выделение памяти и копирование всех предыдущих символов! Однако, если вы знали, что это будет происходить регулярно, и создали StringBuilder с нужной емкостью, дополнительного выделения или копий не было бы.
Обычно вам не нужно беспокоиться о внутренних операциях объекта, но иногда вы делаете это для производительности, подобной этой. Поскольку StringBuilder предоставляет вам способ указать рекомендуемую начальную емкость, воспользуйтесь этим. Вы не знаете, изменится ли алгоритм двойного копирования / копирования в будущем, а также может измениться первоначальная емкость по умолчанию, но ваша спецификация начальной емкости будет продолжать выделять правильного размера застройщика - потому что это является частью публичного контракта.