Связь памяти с СУБД - PullRequest
       0

Связь памяти с СУБД

0 голосов
/ 07 апреля 2011

Есть ли возможность связать TVF/UDF в СУБД с внешней IDE или таким языком, как C? Делать это без записи в таблицу?

Я знаю, что есть способ «отображения памяти» или способ поделиться блоком памяти

POSIX mmap() функция Windows OpenFileMapping() функция

Я использую Windows, так есть ли способ связать СУБД с помощью отображения памяти или обмена с чем-то вроде C? Но как избежать записи в таблицу или файл, используя только память?

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Общая память доступна как транспорт данных для поставщиков SQL и обратно. Вам не нужно писать никакого дополнительного кода для этого, если вы используете встроенные драйверы для доступа к вашему провайдеру. Вместо этого вы просто сконфигурируете драйвер и сервер для его использования, и ваше приложение должно будет находиться на том же сервере, что и ваш поставщик SQL.

Драйверы ODBC для Windows поддерживают совместную память для операций SQL. Чтобы написать код для них из C, вы должны использовать ODBC API для связи с вашим провайдером. Вот ссылка со ссылкой на функцию.

Обзор функций ODBC @ MSDN

Также обратите внимание, что существует поддержка BLOB для всех поставщиков SQL, которые могут обрабатывать произвольные двоичные данные. Список типов, известных ODBC API, доступен здесь. Нет строгого требования, чтобы результаты вашего заявления были выражены в табличной форме.

Типы данных SQL @ MSDN

С другой стороны, если вас интересует взаимодействие с внутренними сущностями SQL на ваших собственных условиях, вы можете соединить что-то вместе через расширения используемой вами службы SQL. Например, MS SQL Server позволяет расширения с помощью процедур автоматизации Ole или интеграции CLR (.net) (доступно в MS SQL Server). Вы могли бы потенциально использовать их для общения вне группы. Тем не менее, ни один из них не может быть легко создан с помощью чистого решения С.

Процедуры автоматизации Ole в SQL Server @ MSDN

Интеграция CLR в SQL Server @ MSDN

Однако я рекомендую вам избегать этого, поскольку вы обнаружите, что вы находитесь в зависимости от среды службы хоста и, возможно, не сможете участвовать в транзакциях.

Если требования к размеру набора данных настолько велики, что вы считаете ОЗУ и прямой доступ лучшим вариантом, ваши потребности, вероятно, будут лучше удовлетворены, если будут сообщаться только те части, которые изменяются в наборе данных, хранящемся вне SQL. Кроме того, поскольку решение с разделяемой памятью ограничено одной машиной, вы, вероятно, захотите разделить работу над набором данных на несколько машин. Более вероятно, что вы увидите улучшение производительности / производительности с помощью таких средств, чем при изменении способа обращения к данным в SQL.

И, наконец, сложно указать поставщику SQL, что ему следует избегать использования хранилища файловой системы. Для MS SQL Server одним из возможных вариантов является принудительное размещение базы данных tempdb в оперативной памяти. Вот статья КБ с более подробной информацией. Другие СУБД могут иметь аналогичные параметры конфигурации.

INF: Когда использовать базу данных tempdb в RAM

Однако использование дискового хранилища не обязательно вызывает беспокойство. Я не могу найти хороший пример того, как поставщики SQL управляют балансом ОЗУ / файловой системы, но один хороший аналог для сервера SQL - это то, как окна влияют на использование файла подкачки. Вот отличная ссылка, которая детализирует, как окна ведут себя при высоких лимитах работы, и как использование памяти не обязательно соответствует переполнению использования диска. Также обратите внимание, что приложения, написанные для запуска в Windows, также оказываются неблагоприятными, когда работа хоста приближается к этим пределам.

Расширение границ Windows: виртуальная память @ TechNet

0 голосов
/ 07 апреля 2011

СУБД должна была бы работать так, как вам хочется. Обычные СУБД имеют свои собственные механизмы управления данными, и, хотя вы можете иметь возможность общаться с ними через разделяемую память, более вероятно, что вы этого не сделаете. СУБД может хранить большую часть своих рабочих данных в памяти; это зависит от СУБД. Как правило, данные будут поддерживаться дисковым хранилищем.

Чего вы не можете сделать, так это взять произвольную СУБД и приказать ей, что она будет взаимодействовать с вашим процессом через разделяемую память. Если он предназначен для этого, тогда вы можете; в противном случае вы не можете.

Как правило, однако, вы используете ODBC или аналогичный драйвер для доступа к СУБД из вашего приложения, и те, кто реализует драйвер (и СУБД), диктуют, как будет происходить межпроцессное взаимодействие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...