SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Database で互換性レベル 140 がパブリックプレビューとなりました

leave a comment

Public Preview of Compatibility Level 140 for Azure SQL Database でアナウンスされていますが、SQL Database で互換性レベル 140 がパブリックプレビューとなっています。

少し前から設定できていた気がしなくもないのですが、正式にパブリックプレビューになったのは今回のタイミングなんですね。

互換性レベル 140 は SSMS か以下のクエリで設定できます。

ALTER DATABASE CURRENT
SET COMPATIBILITY_LEVEL =140

 
互換性レベル 140 での改善については Differences Between Compatibility Level 130 and Level 140 を見るとよいかと。
Adaptive Query Processing (適応されたクエリの処理) による、クエリの動的な最適化が大きな内容でしょうか。

バッチモードで適応される形になるので、列ストアインデックスによるクエリの最適化の範囲が増えている感じですかね。
アナウンスには含まれていないのですが、SQL Server 2017 のグラフテーブルについても、SQL Database で使用できるようになっているようです。

こちらは、アナウンスがないので、一時的に使えているだけかもしれませんが。
Graph processing with SQL Server 2017
以下のようなクエリが SQL Database でも実行できるようになっていました。

-- Create person node table
DROP TABLE IF EXISTS dbo.Person
DROP TABLE IF EXISTS dbo.friend
CREATE TABLE dbo.Person (ID integer PRIMARY KEY, name varchar(50)) AS NODE;
CREATE TABLE dbo.friend (start_date DATE) AS EDGE;
 -- Insert into node table
INSERT INTO dbo.Person VALUES (1, 'Alice');
INSERT INTO dbo.Person VALUES (2,'John');
INSERT INTO dbo.Person VALUES (3, 'Jacob');
INSERT INTO dbo.Person VALUES (4, 'Joseph');
-- Insert into edge table
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'Alice'),
(SELECT $node_id FROM dbo.Person WHERE name = 'John'), '9/15/2011');
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'Alice'),
(SELECT $node_id FROM dbo.Person WHERE name = 'Jacob'), '10/15/2011');
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'John'),
(SELECT $node_id FROM dbo.Person WHERE name = 'Jacob'), '10/15/2012');
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'John'),
(SELECT $node_id FROM dbo.Person WHERE name = 'Joseph'), '10/15/2012');
-- use MATCH in SELECT to find friends of Alice
SELECT Person2.name,start_date AS FriendName
FROM Person Person1, friend, Person Person2
WHERE MATCH(Person1-(friend)->Person2)
AND Person1.name = 'Alice';
SELECT
Person2.name AS FiriendName, friend.start_date, Person3.name AS Friend_of_FriendName,
friend2.start_date
FROM Person Person1, friend, Person Person2, friend friend2, Person Person3
WHERE MATCH(Person1-(friend)->Person2-(friend2)->Person3)
AND Person1.name = 'Alice';
Share

Written by Masayuki.Ozawa

7月 9th, 2017 at 11:06 am

Leave a Reply