Прежде всего, позвольте мне заявить, что я застрял с текущим стеком, который я использую, и в настоящее время я не могу перейти к чему-то другому. Вместо того, чтобы дать мне знать, что я должен использовать другие вещи, я не могу ... поэтому давайте пропустим это.
Мои пользователи в основном следующие:
- Excel 16.0, 64 бит.
- Windows 7, 10
- Оперативная память: Мин. (4 ГБ) - Макс. (8 ГБ)
- Процессор: от i5 до i7 (у меня работает i7-3770 @ 3,4 ГГц)
Основы:
- Приложение Excel, которое я разработал для внутреннего использования в компании, использует ADO для общения с SQLServer.
- В настоящее время вся система запросов построена так, чтобы работать только с одним набором записей, возвращаемым за раз (если единственное решение состоит в том, чтобы вернуть несколько наборов записей и работать с ними, потребуется перезапись большого размера в ядро система)
Неосновы:
- В настоящее время система может импортировать файлы 500 МБ в SQLServer за одну или две минуты, разбивая запросы на фрагменты по 100 тыс. Строк, и это работает довольно хорошо.
- При получении данных из SQLServer у меня есть два разных стиля:
- Стандартный 2-D набор записей (чрезвычайно производительный)
- Набор записей, содержащий одно строковое значение XML (без разбора) со следующим форматом std:
<root>
<*page*>
<row>
<*column*></*column*>
</row>
</*page*>
</root>
Пример вывода:
<root>
<tab_awesome>
<row>
<col1>Value 1</col1>
<col2>Value 2</col2>
</row>
</tab_awesome>
</root>
Затем я беру этот XML и в настоящее время загружаю значение String из набора записей, используя метод MSXML «Load». После загрузки и некоторой проверки я преобразую XML в эту стандартную структуру словаря, которая экспортирует на вкладки [N] и еще много чего.
{
"page_count": 1,
"page_names": ["tab_awesome"],
"pages": {
"tab_awesome": {
"page_name": "tab_awesome",
"row_count": 1,
"column_count": 2,
"column_names": ["col1", "col2"]
"data": [["Value 1", "Value 2"]]
}
}
}
Проблема:
- У нас есть несколько Sprocs, которые возвращают свои результаты, используя String XML ... и при анализе содержат несколько вкладок по + 100 тыс. Строк на вкладку. Некоторые Sprocs вернут +1 000 000 записей с +20 полями (все вкладки включены в счет).
- Моя текущая проблема - Sproc for Amortizing. Он возвращает строку размером примерно 208 МБ.
- Получение данных по сети занимает несколько секунд
- Разбор строки в XML с использованием MSXML занимает 3m35s , и босс хочет, чтобы она работала быстрее.
Мои мысли:
- Можно ли использовать Sax?
- Можно ли перенести XML-документ из SQLServer через ADO, поэтому мне не нужно загружать его из строковой формы?
- xmllite.dll? (Я вижу, что Rubberduck использует это. Мэтт, как производительность и случайно, есть привязки для VBA?)
- В крайнем случае, я перепишу базовый механизм запросов моего приложения, чтобы обрабатывать несколько наборов записей ADO для работы с несколькими вкладками данных. Если я сделаю это, как мне получить один Sproc для возврата нескольких наборов записей?
Я застрял, используя вызовы API для Windows и VBA.
хмм ... единственное, что возможно, - это возвращать каждую вкладку как другую строку в наборе записей (все еще строковый XML). Для каждой строки создайте новый процесс Excel, проанализируйте / загрузите информацию этой вкладки, отправьте XML обратно в основной процесс, закройте эти вспомогательные экземпляры Excel ...