经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Database for Modern Developers
来源:cnblogs  作者:覆周  时间:2021/3/8 11:47:42  对本文有异议

好书分享,面向开发者的Azure SQL Database最佳实践,也适用SQL Server 2016以上的版本。应对不同场景使用的数据库功能,包括内存表,列存储表,非聚集列存储索引,JSON等等。

下载地址:

https://all-ebook.info/9978-practical-azure-sql-database-for-modern-developers.html

 

基础SQL

Subqueries

Common Table Expressions

Union

Merge

  1. MERGE INTO
  2. [Warehouse].[Colors] AS [target]
  3. USING
  4. (VALUES
  5. (50, 'Deep Sea Blue'),
  6. (51, 'Deep Sea Light Blue'),
  7. (52, 'Deep Sea Dark Blue')
  8. ) [source](Id, [Name])
  9. ON
  10. [target].[ColorID] = [source].[Id]
  11. WHEN MATCHED THEN
  12. UPDATE SET [target].[ColorName] = [source].[Name]
  13. WHEN NOT MATCHED THEN
  14. INSERT ([ColorID], [ColorName], [LastEditedBy]) VALUES ([source].Id,
  15. [source].[Name], 1)
  16. WHEN NOT MATCHED BY SOURCE AND [target].[ColorID] BETWEEN 50 AND 100 THEN
  17. DELETE

Windowing Functions

  1. SELECT
  2. [OrderID],
  3. [OrderLineID],
  4. [Description],
  5. [Quantity],
  6. SUM(Quantity) OVER ( PARTITION BY [OrderID] ORDER BY [OrderLineID] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningTotal
  7. FROM
  8. [Sales].[OrderLines]
  9. WHERE
  10. [OrderID] in (37, 39)

 

进阶SQL

Variables

T-SQL doesn't support arrays, lists, or dictionaries, you can use a Table Variable

  1. DECLARE @t AS TABLE (
  2. [Id] INT NOT NULL,
  3. [Name] NVARCHAR(50) NOT NULL
  4. );
  5. INSERT INTO @t VALUES (42, N'John');
  6. SELECT * FROM @t;

Temporary Tables

Views

Functions

Stored Procedures

使用json传递多值参数

  1. CREATE OR ALTER PROCEDURE dbo.GetOrderForCustomer
  2. @CustomerInfo NVARCHAR(MAX)
  3. AS
  4. IF (ISJSON(@CustomerInfo) != 1) BEGIN
  5. THROW 50000, '@CustomerInfo is not a valid JSON document', 16
  6. END
  7. SELECT [Value] INTO #T FROM OPENJSON(@CustomerInfo, '$.CustomerId') AS ci;
  8. SELECT
  9. [CustomerID],
  10. COUNT(*) AS OrderCount,
  11. MIN([OrderDate]) AS FirstOrder,
  12. MAX([OrderDate]) AS LastOrder
  13. FROM
  14. Sales.[Orders]
  15. WHERE
  16. [CustomerID] IN (SELECT [Value] FROM #T)
  17. GROUP BY
  18. [CustomerID];
  19. EXEC dbo.GetOrderForCustomer N'{"CustomerId": [106, 193, 832]}';

unless you have some specific use case that is perfectly suited for a Function, the recommendation is to use Stored Procedures

永远不要用触发器了

JSON

动态参数,拓展属性列,弹性域

CSV

STRING_SPLIT

  1. CREATE PROCEDURE dbo.AddTagsToPost
  2. @PostId INT,
  3. @Tags NVARCHAR(MAX)
  4. AS
  5. INSERT INTO dbo.PostTags
  6. SELECT @PostId, T.[value] FROM STRING_SPLIT(@Tags, '|') AS T
  7. EXEC dbo.AddTagsToPost 1, 'azure-sql|string_split|csv'

Change Tracking

CDC

替代方案Debezium+ Kafka

Row-Level Security

  1. CREATE FUNCTION rls.LoginSecurityPolicy(@PersonID AS INT)
  2. RETURNS TABLE
  3. WITH SCHEMABINDING
  4. AS
  5. RETURN
  6. SELECT
  7. 1 As [Authorized]
  8. FROM
  9. [Application].[People]
  10. WHERE
  11. LoginName = SESSION_CONTEXT(N'Login')
  12. AND
  13. PersonID = @PersonId;

system function SESSION_CONTEXT to retrieve the value of the Logon key

Dynamic Data Masking

Always Encrypted

 

多模

JSON

  1. SELECT
  2. severity,
  3. ip = JSON_VALUE(log, '$.ip'),
  4. duration = AVG(CAST(JSON_VALUE(log,'$.duration') as int))
  5. FROM
  6. WebSite.Logs
  7. WHERE
  8. CAST(JSON_VALUE(log,'$.date') as datetime) > @datetime
  9. GROUP BY
  10. severity, JSON_VALUE(log, '$.ip')
  11. HAVING
  12. AVG(CAST(JSON_VALUE(log,'$.duration') as int) ) > 100
  13. ORDER BY
  14. AVG(CAST(JSON_VALUE(log,'$.duration') as int) );
  15. ALTER TABLE Webite.Logs
  16. ADD CONSTRAINT [Data should be formatted as JSON]
  17. CHECK (ISJSON(log) = 1);
  18. CREATE CLUSTERED COLUMNSTORE INDEX cci ON WebSite.Logs;
  19. alter table WebSite.Logs
  20. add [$severity] AS JSON_VALUE(log, '$.severity');
  21.  
  22. create index ix_severity on WebSite.Logs ([$severity]);

Graph

Spatial data

XML data

Key-value

Azure SQL doesn't have a specialized structure that holds key-value pairs.

With memory-optimized tables, you can index the key column using B-tree or Hash indexes-使用内存表代替

  1. CREATE TABLE [Cache] (
  2. [key] BIGINT IDENTITY,
  3. value NVARCHAR(MAX),
  4. INDEX IX_Hash_Key HASH ([key]) WITH (BUCKET_COUNT = 100000)
  5. ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY);

 

More Than Tables

列存储表

聚集列存储表

非聚集列存储索引

内存表

using classic rowstore tables with NCCI indexes for HTAP scenarios is the general approach,

Memory-Optimized Clustered Columnstore Indexes are used only on very performance-intensive workloads.

  1. --Columnstore memory-optimized tables
  2. CREATE TABLE Accounts (
  3. AccountKey int NOT NULL PRIMARY KEY NONCLUSTERED,
  4. Description nvarchar (50),
  5. Type nvarchar(50),
  6. UnitSold int,
  7. INDEX cci CLUSTERED COLUMNSTORE
  8. ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
  9. --memory-optimized tables and the NONCLUSTERED HASH index
  10. CREATE TABLE [dbo].[Employees](
  11. [EmpID] [int] NOT NULL
  12. CONSTRAINT PK_Employees_EmpID PRIMARY KEY
  13. NONCLUSTERED HASH (EmpID) WITH (BUCKET_COUNT = 100000),
  14. [EmpName] [varchar](50) NOT NULL,
  15. [EmpAddress] [varchar](50) NOT NULL,
  16. [EmpDEPID] [int] NOT NULL,
  17. [EmpBirthDay] [datetime] NULL
  18. ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)

Natively compiled code

  1. CREATE FUNCTION PeopleData(@json nvarchar(max))
  2. RETURNS TABLE
  3. WITH NATIVE_COMPILATION, SCHEMABINDING
  4. AS RETURN (
  5. SELECT Title, HireDate, PrimarySalesTerritory,
  6. CommissionRate, OtherLanguages
  7. FROM OPENJSON(@json)
  8. WITH(Title nvarchar(50),
  9. HireDate datetime2,
  10. PrimarySalesTerritory nvarchar(50),
  11. CommissionRate float,
  12. OtherLanguages nvarchar(max) AS JSON)
  13. )
  14. --调用函数
  15. select p.FullName, p.EmailAddress, j.Title, j.CommissionRate
  16. from Application.People p
  17. cross apply PeopleData(p.CustomFields) j

Temporal tables

  1. --当前表使用内存表
  2. --历史表使用列存储表+非聚集行索引
  3. CREATE CLUSTERED COLUMNSTORE INDEX cci_DepartmentHistory
  4. ON DepartmentHistory;
  5. CREATE NONCLUSTERED INDEX IX_DepartmentHistory_ID_PERIOD_COLUMNS
  6. ON DepartmentHistory (SysEndTime, SysStartTime, DeptID);

 

HTAP

列存储索引+内存表做实时混合负载,HTAP场景

https://docs.microsoft.com/zh-cn/sql/relational-databases/indexes/get-started-with-columnstore-for-real-time-operational-analytics?view=sql-server-ver15

 

本书作者的博客

https://github.com/yorek

insert if not exists

  1. insert into [dbo].[tags] ([post_id], [tag])
  2. select * from (
  3. values (10, 'tag123') -- sample value
  4. ) as s([post_id], [tag])
  5. where not exists (
  6. select * from [dbo].[tags] t with (updlock)
  7. where s.[post_id] = t.[post_id] and s.[tag] = t.[tag]
  8. )

 

https://devblogs.microsoft.com/azure-sql/the-insert-if-not-exists-challenge-a-solution/

多行插入使用JSON, Table Valued Parameters,与MERGE的比较

 

key-value store性能测试

https://devblogs.microsoft.com/azure-sql/azure-sql-database-as-a-key-value-store/

 

IoT场景性能测试

https://devblogs.microsoft.com/azure-sql/ingest-millions-of-events-per-second-on-azure-sql-leveraging-shock-absorber-pattern/

 

JSON性能测试

https://devblogs.microsoft.com/azure-sql/json-in-your-azure-sql-database-lets-benchmark-some-options/

 

开源web sql编辑器SQLPad

https://devblogs.microsoft.com/azure-sql/querying-and-visualizing-data-using-sqlpad/

 

DevOps for Azure SQL

https://devblogs.microsoft.com/azure-sql/devops-for-azure-sql/

 

原文链接:http://www.cnblogs.com/dexterz/p/14483866.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号