Можно ли использовать кросс-запросы к базам данных как в Azure, так и в SQL? - PullRequest
0 голосов
/ 27 марта 2019

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

Мы используем Elastic Query, который позволяет нам выполнять запросы к базам данных SQL Azure

https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-query-overview/

Мы можем настроить внешний источник данных на сервере Azure, используя следующий код.В этом случае мы можем выполнять кросс-вызовы базы данных, такие как объединение таблиц в одной базе данных.

 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'yourPassword';  

 CREATE DATABASE SCOPED CREDENTIAL yourServeradminlogin  
 WITH IDENTITY = 'yourServeradminlogin',  
 SECRET = 'yourPassword';  

 CREATE EXTERNAL DATA SOURCE RefmyDemoDB2  
 WITH  
 (  
    TYPE=RDBMS,  
    LOCATION='testdbdemoserver.database.windows.net',  
    DATABASE_NAME='myDemoDB2',  
    CREDENTIAL= yourServeradminlogin  
 );  

 CREATE EXTERNAL TABLE [dbo].[Department](  
    [DeptId] [int] NOT NULL,  
    [Name] [varchar](50) NULL  
 )  
 WITH  
 (  
    DATA_SOURCE = RefmyDemoDB2  
 );  

Невозможно использовать вышеуказанный метод на нашем локальном сервере SQL без добавления стороннего механизма базы данных.Установите что-то под названием PolyBase для выполнения перекрестного запроса к базе данных на локальном сервере sql версии 2017 и выше. Он поддерживается только с внешним источником данных типа, таким как HADOOP, вместо ссылки на другую базу данных (или любое хранилище данных) на сервере sql.

Мы можем сделать это, используя следующий код

  CREATE MASTER KEY ENCRYPTION BY PASSWORD='MyP@ssword123secretword';

  CREATE DATABASE SCOPED CREDENTIAL mycredential  
  WITH IDENTITY = 'credential', Secret = 'secretkey' 

  CREATE EXTERNAL DATA SOURCE mycustomers
  WITH (
    TYPE = HADOOP,
    LOCATION =  'wasbs://azurestorage.blob.core.windows.net/',
    CREDENTIAL = mycredential
  );

  CREATE EXTERNAL FILE FORMAT csvformat 
  WITH ( 
    FORMAT_TYPE = DELIMITEDTEXT, 
    FORMAT_OPTIONS ( 
      FIELD_TERMINATOR = ','
    ) 
  );

  CREATE EXTERNAL TABLE TableName
  ( 
    [did] [int] NOT NULL,  
    [Dname] [varchar] (50) NULL 
  ) 
  WITH 
  ( 
     LOCATION = '/', 
     DATA_SOURCE = mycustomers, 
     FILE_FORMAT = csvformat
  )

Используя HADOOP и polybase, мы можем создать внешний источник данных на локальном сервере SQL.Но это создает внешний источник данных этого внешнего хранилища данных.Это таблица внешних данных, расположенная в этом внешнем хранилище. Точно, мое требование - создать внешний источник данных базы данных на сервере sql.Так что я могу использовать один и тот же запрос базы данных corss как на Azure, так и на локальном сервере SQL *

Есть ли какое-либо решение для решения этой проблемы.или какое-либо решение для выполнения кросс-запросов к базе данных как на Azure, так и на локальном сервере SQL?

1 Ответ

0 голосов
/ 27 марта 2019

Не следует предполагать, что использование внешних таблиц в SQL Azure удаленно аналогично выполнению запросов между базами данных в SQL Server.Это не одно и то же, и у них очень разные профили производительности.Внешние таблицы ближе к связанным серверам, чем запросы к нескольким базам данных в SQL Server.

В SQL Server кросс-запросы к базам данных: - выполняются в одном и том же экземпляре SQL - запускают один и тот же базовый путь кода выполнения для чтения данныхв отличие от SQL Azure с одной базой данных - у вас есть несколько отличная семантика транзакций по сравнению с операциями с одной базой данных в SQL Server, но в целом схожий опыт с вашей точки зрения.SQL Azure, у вас обычно нет баз данных на одних и тех же физических машинах.Таким образом, вы должны выполнять межсерверные запросы (которые предоставляются с использованием механизма, аналогичного связанному серверу, который называется внешними таблицами, которые в основном поддерживают сценарии разделения / разветвления).Попытка использовать эту функцию для имитации запросов между базами данных может работать функционально, но это не очень хороший план из-за различий в производительности.В этом пути вообще нет никаких реальных транзакционных гарантий (без DTC).

Управляемый экземпляр SQL Azure поддерживает внутренние запросы к базе данных внутри одного экземпляра SQL Server.Таким образом, этот путь будет наиболее подходящим для вас, если вы действительно хотите использовать запросы к нескольким базам данных.Если вы хотите использовать отдельные базы данных SQL Azure, вы, как правило, вообще не хотите выполнять перекрестные запросы к базе данных для унаследованной рабочей нагрузки, и вам следует переписать, чтобы избежать зависимости.(В противном случае это будет постоянная головная боль из-за различий в производительности)

...