Как добиться максимальной производительности при доступе к нескольким разным базам данных - PullRequest
2 голосов
/ 10 ноября 2010

Мне было поручено объединить три унаследованные системы в один пользовательский интерфейс. Это будет приложение Asp.Net Mvc.

У меня есть экземпляр Sql Server 2005 на одном сервере, экземпляр Sql Server 2008 на другом, база данных доступа, которая содержит данные о соответствии и заполняется через пользовательский плагин, и база данных файлов Powerflex, доступ к которой осуществляется через odbc.

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

Мой вопрос: какой самый эффективный способ справиться с этой ситуацией?

Связать ли я базы данных Sql Server и написать один запрос с объединениями для этих серверов?

Использую ли я отключенные наборы данных в памяти?

Использую ли я минималистичные запросы для чтения данных?

Пытаюсь ли я использовать Entity Framework (я не искал соединитель для базы данных Powerflex)?

Раньше я никогда не пытался соединить так много бэк-эндов, и я беспокоюсь о производительности. Как минимум четыре поездки туда-сюда кричат ​​о плохой производительности, даже не написав ни строчки кода. Любые советы будут оценены.

PS: Объединение их всех в одну базу данных в настоящее время исключено.

Ответы [ 7 ]

0 голосов
/ 10 ноября 2010

У меня был похожий проект с большим количеством серверов sql поверх локальной сети (разные версии), целью приложения было просматривать и редко редактировать данные.Я написал для каждого сервера службу Windows, которая экспортирует / синхронизирует данные каждый час с помощью службы WCF на сервере приложений.Хранилище представляло собой SQL Server 2008 и поверх этой Entity Framework.Если вашему приложению не требуется мгновенный доступ к данным в реальном времени, это решение может подойти.

0 голосов
/ 10 ноября 2010

Вам доступно несколько вариантов, в зависимости от имеющейся у вас рабочей нагрузки / структуры запроса.

Если у вас есть длительные запросы к нескольким базам данных, возможно, имеет смысл использовать некоторую асинхронность, такую ​​как BeginInvoke () / EndInvoke (), в качестве доступной.

Если вам нужно получить много записейиз нескольких баз данных и задержка передачи становится проблемой, вы можете передать прием данных рабочим потокам и затем объединить результаты.

Если наборы результатов настолько велики, что вы не можете хранить их локально в памяти, подумайте о потоковом подходе.Сортировка на стороне сервера и алгоритмы типа «слияние» могут здесь сильно помочь.Например, объединение будет сортировать по ключу объединения, и соответствующие кортежи будут автоматически передаваться первыми из обоих потоков.

Если у вас есть меньшие и большие наборы для объединения, вы можете сначала запросить меньшие и использовать данные дляФильтр для большой базы данных.

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

0 голосов
/ 10 ноября 2010

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

Чтобы получить реальные преимущества в производительности, вам нужно как-то объединить данные.Например:

  • Переместите базу данных SQL 2005 в тот же физический экземпляр SQL Server, что и база данных SQL 2008.Затем вы можете записывать соединения между базами данных между таблицами, а не соединениями с перекрестными связями, что будет более эффективным.
  • Сохраняется ли база данных Access в этом формате, поскольку она используется формами или отчетами Access?Если это так, вы можете использовать Мастер повышения для перемещения таблиц в SQL Server, но сохранить формы доступа и отчеты в файле MDB без изменений.

Если вы можете сделать обе эти вещи, выв итоге нужно иметь только 2 физических подключения к данным (SQL 2008 и Powerflex).Затем вы можете оптимизировать доступ к данным вручную в каждом конкретном случае.Например, если вы объединяете результирующие наборы из обоих подключений к данным, выполните тот, который сначала будет возвращать наименьшее количество строк, а затем используйте его результаты, чтобы сузить критерии поиска для другого запроса.

0 голосов
/ 10 ноября 2010

Рассматривали ли вы использование Корпоративной библиотеки Microsoft для этого?Вы можете запросить все эти базы данных прозрачно.Он реализует шаблон Factory;правильные версии драйверов базы данных загружаются и используются в зависимости от конкретной базы данных, к которой осуществляется доступ.

Вот ссылка:

http://msdn.microsoft.com/en-us/library/ff648951.aspx

0 голосов
/ 10 ноября 2010

Есть несколько способов сделать это с моей головы.

Во-первых, используйте DataSets. Вы можете запросить информацию из всех различных баз данных в одном наборе данных, а затем запросить из этого набора данных.

Во-вторых, используйте Entity Framework, чтобы получить модели для всего этого, и используйте LINQ для запросов к различным сущностям.

И, я думаю, вы правы. На самом деле плохой производительности не избежать, если вы не можете объединить их в одну базу данных.

EF может быть вашим лучшим выбором здесь.

0 голосов
/ 10 ноября 2010

Возможен ли следующий вариант:

  1. Переместите экземпляр SQL Server 2005 на компьютер с SQL Server 2008 (по-прежнему в своей собственной базе данных, возможно, даже с версией SQL Server 2005, если это необходимо).
  2. Импорт базы данных Access на компьютер с SQL Server 2008 в его собственную базу данных. Вы можете ссылаться на это из Access, если это все еще необходимо обновить с помощью доступа.

Это дает вам два основных расположения данных (с 3 базами данных SQL Server) и базу данных Powerflex.

Использовать объединения между базами данных SQL Server (которые не должны связываться с другими серверами, поэтому должны быть относительно быстрыми), а затем объединять данные из Powerflex в средний уровень.

0 голосов
/ 10 ноября 2010

Если это вообще возможно, импортируйте все необходимые данные в еще одну базу данных, которая находится под вашим контролем.

Установите протоколы для обновления данных, поступающих / поступающих из разных систем (как часто данные должны передаваться, какие данные и как).

Вы получите контроль над данными вашего приложения, и вам не нужно будет беспокоиться о множестве других баз данных (при условии, что импорт / экспорт работает правильно), управлении многими источниками данных и необходимости управления согласованность данных между ними в вашем приложении.

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