Sqlgeography spatial operations slow-SQL Server 2016


Я провел некоторые тесты на новой пространственной библиотеке SqlGeography в SQL Server 2016, которая, по мнению Microsoft, должна быть намного быстрее, чем предыдущие версии:

SQL Server 2016-он просто работает быстрее: собственные пространственные реализации. Применяйте SQL Server 2016 и широкий спектр методов и пространственных действий быстрее и масштабнее. Нет никаких изменений приложений или баз данных, только двоичные обновления SQL Server, показывающие резкое улучшение.

Однако, тесты показывают, что новая библиотека работает медленнее, чем старая. Я протестировал его в C# с помощью Nugets, опубликованных Microsoft, Microsoft.SqlServer.Types. Я протестировал версию 11 против версии 14 (SQL Server 2016).

Что я должен сделать, чтобы новая пространственная библиотека работала лучше?

Исходный код для небольшого теста:

var line1 = CreateLine(56, -4, 58, 16);
var line2 = CreateLine(58, -4, 56, 16);

for (int i = 0; i < 50000; i++)
{
     var intersection = line1.STIntersects(line2);
     var contains = line1.STBuffer(1000).STContains(line1);
}

public static SqlGeography CreateLine(double fromLat, double fromLon, double toLat, double toLon)
{
     SqlGeographyBuilder constructed = new SqlGeographyBuilder();
     constructed.SetSrid(4326);
     constructed.BeginGeography(OpenGisGeographyType.LineString);
     constructed.BeginFigure(fromLat, fromLon);
     constructed.AddLine(toLat, toLon);
     constructed.EndFigure();
     constructed.EndGeography();
     var line = constructed.ConstructedGeography;
     return line;
 }
1 5

1 ответ:

В этой статье Microsoft пишет, что Microsoft.От SQLServer.Типы больше не используются в коде T-SQL в SQL Server 2016. https://blogs.msdn.microsoft.com/psssql/2016/03/03/sql-2016-it-just-runs-faster-native-spatial-implementations/

Как это работает в SQL 2014:

По мере созревания типов пространственных данных SQL Server мы обнаружили От неуправляемого (SQL Server) к управляемому (Microsoft.От SQLServer.Типы) к SqlServerSpatial###.dll (неуправляемые) переходы (PInvoke и PUnInvoke) может стать узким местом масштабируемости

В SQL 2016:

(T-SQL) SQL Server 2016 вызывает собственную реализацию методы, избегающие неуправляемых к управляемым к неуправляемым переходам, увеличение производительности.

Похоже, что SQL 2016 использует SqlServerSpatial###.dll напрямую и производительность увеличивается только в коде T-SQL