Select 进入内存优化 table
Select into memory optimised table
我有一个存储过程,可以根据数据库设置将一些动态 sql 转换为临时 table 或视图。这用于 "tune" 不同客户端之间的数据库功能取决于数据的大小,即临时 table 创建时间更长但设置时间更长,视图创建速度快但读取时间稍长。
我正在考虑扩展它以包括一个内存优化选项 table,但是如果不首先完全声明它,我看不到如何使用内存优化 table。
我目前的代码格式如下:
SELECT TOP 10 *
INTO FavoriteCustomers
FROM Customers
ORDER BY Spend DESC
如您所见,我没有声明 table,只是使用了 select。有什么办法可以 SELECT 进入内存优化 table?我可以使用:
sys.dm_exec_describe_first_result_set(@mySQLhere)
这为我传入的 TSQL 提供了一个列定义。然后使用此信息预先构建 table 并插入其中,但我希望尽可能使用更简洁的方法。
有人有解决办法吗?搜索只是让我了解如何将数据添加到 MOT 而不是 MOT 创建作为 select.
的一部分
我知道这可能是不可能的,我确实描述了解决方法,我只是觉得我可能在这里缺少更好的选择。
目前使用多个服务器,MOT功能仅在SQL2016上实现。
非常感谢。
CREATE PROC [engine].[usp_CreateDynamicContent]
@ContentName AS NVARCHAR(MAX)
, @NTS_SessionID NVARCHAR(MAX)
, @SelectSQL NVARCHAR(MAX)
, @PrimaryKeyField NVARCHAR(MAX) = NULL
, @NonClusteredIndexField NVARCHAR(MAX) = NULL
, @debug BIT = 0
AS
BEGIN
DECLARE @ContentType AS NVARCHAR(MAX)
DECLARE @dcName AS NVARCHAR(MAX)
DECLARE @strSQL AS NVARCHAR(MAX)
SET @dcName = 'tmp.dc_' + @ContentName + '_' + @NTS_SessionID
IF OBJECT_ID(@dcName, 'V') IS NOT NULL /* Drop the view if it exists */
BEGIN
SET @strSQL = 'DROP VIEW ' + @dcName
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
IF OBJECT_ID(@dcName) IS NOT NULL /* Drop the table if it exists */
BEGIN
SET @strSQL = 'DROP TABLE ' + @dcName
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
/* This is my database listing types for each table. */
SELECT @ContentType = ContentType
FROM guid.DynamicContents
WHERE ContentName = @ContentName
IF @ContentType = 'VIEW'
BEGIN
SET @strSQL = 'CREATE VIEW ' + @dcName + ' AS' + CHAR(13) + @SelectSQL
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
ELSE
IF @ContentType IN ('TABLE', 'MOT')
BEGIN
SET @strSQL = ''
SELECT @strSQL = @strSQL + ',' + CHAR(10) + '[' + name + '] ' + system_type_name + CASE WHEN @PrimaryKeyField IS NOT NULL
AND @ContentType = 'MOT' THEN ' NOT NULL PRIMARY KEY NONCLUSTERED'
ELSE ''
END + CHAR(13)
FROM sys.dm_exec_describe_first_result_set(@SelectSQL, NULL, 0)
SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + @dcName + '(')
IF @PrimaryKeyField IS NOT NULL
AND @ContentType = 'TABLE'
BEGIN
SET @strSQL = @strSQL + CHAR(10) + ',CONSTRAINT pk_' + @ContentName + '_' + @NTS_SessionID + ' PRIMARY KEY (' + @PrimaryKeyField + ')' + CHAR(10)
END
SET @strSQL = @strSQL + ')'
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
IF @NonClusteredIndexField IS NOT NULL
AND @ContentType = 'TABLE'
BEGIN
SET @strSQL = 'CREATE NONCLUSTERED INDEX ix_' + @ContentName + '_' + @NonClusteredIndexField + ' ON ' + @dcName + ' (' + @NonClusteredIndexField + ')'
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
/* This section added in as I use cte's quite a lot */
IF @SelectSQL LIKE '%/* INSERT HERE */%'
BEGIN
SET @strSQL = REPLACE(@SelectSQL, '/* INSERT HERE */', 'INSERT INTO ' + @dcName)
END
ELSE
BEGIN
SET @strSQL = 'INSERT INTO ' + @dcName + CHAR(13) + @SelectSQL
END
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
END
我有一个存储过程,可以根据数据库设置将一些动态 sql 转换为临时 table 或视图。这用于 "tune" 不同客户端之间的数据库功能取决于数据的大小,即临时 table 创建时间更长但设置时间更长,视图创建速度快但读取时间稍长。
我正在考虑扩展它以包括一个内存优化选项 table,但是如果不首先完全声明它,我看不到如何使用内存优化 table。
我目前的代码格式如下:
SELECT TOP 10 *
INTO FavoriteCustomers
FROM Customers
ORDER BY Spend DESC
如您所见,我没有声明 table,只是使用了 select。有什么办法可以 SELECT 进入内存优化 table?我可以使用:
sys.dm_exec_describe_first_result_set(@mySQLhere)
这为我传入的 TSQL 提供了一个列定义。然后使用此信息预先构建 table 并插入其中,但我希望尽可能使用更简洁的方法。
有人有解决办法吗?搜索只是让我了解如何将数据添加到 MOT 而不是 MOT 创建作为 select.
的一部分我知道这可能是不可能的,我确实描述了解决方法,我只是觉得我可能在这里缺少更好的选择。
目前使用多个服务器,MOT功能仅在SQL2016上实现。
非常感谢。
CREATE PROC [engine].[usp_CreateDynamicContent]
@ContentName AS NVARCHAR(MAX)
, @NTS_SessionID NVARCHAR(MAX)
, @SelectSQL NVARCHAR(MAX)
, @PrimaryKeyField NVARCHAR(MAX) = NULL
, @NonClusteredIndexField NVARCHAR(MAX) = NULL
, @debug BIT = 0
AS
BEGIN
DECLARE @ContentType AS NVARCHAR(MAX)
DECLARE @dcName AS NVARCHAR(MAX)
DECLARE @strSQL AS NVARCHAR(MAX)
SET @dcName = 'tmp.dc_' + @ContentName + '_' + @NTS_SessionID
IF OBJECT_ID(@dcName, 'V') IS NOT NULL /* Drop the view if it exists */
BEGIN
SET @strSQL = 'DROP VIEW ' + @dcName
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
IF OBJECT_ID(@dcName) IS NOT NULL /* Drop the table if it exists */
BEGIN
SET @strSQL = 'DROP TABLE ' + @dcName
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
/* This is my database listing types for each table. */
SELECT @ContentType = ContentType
FROM guid.DynamicContents
WHERE ContentName = @ContentName
IF @ContentType = 'VIEW'
BEGIN
SET @strSQL = 'CREATE VIEW ' + @dcName + ' AS' + CHAR(13) + @SelectSQL
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
ELSE
IF @ContentType IN ('TABLE', 'MOT')
BEGIN
SET @strSQL = ''
SELECT @strSQL = @strSQL + ',' + CHAR(10) + '[' + name + '] ' + system_type_name + CASE WHEN @PrimaryKeyField IS NOT NULL
AND @ContentType = 'MOT' THEN ' NOT NULL PRIMARY KEY NONCLUSTERED'
ELSE ''
END + CHAR(13)
FROM sys.dm_exec_describe_first_result_set(@SelectSQL, NULL, 0)
SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + @dcName + '(')
IF @PrimaryKeyField IS NOT NULL
AND @ContentType = 'TABLE'
BEGIN
SET @strSQL = @strSQL + CHAR(10) + ',CONSTRAINT pk_' + @ContentName + '_' + @NTS_SessionID + ' PRIMARY KEY (' + @PrimaryKeyField + ')' + CHAR(10)
END
SET @strSQL = @strSQL + ')'
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
IF @NonClusteredIndexField IS NOT NULL
AND @ContentType = 'TABLE'
BEGIN
SET @strSQL = 'CREATE NONCLUSTERED INDEX ix_' + @ContentName + '_' + @NonClusteredIndexField + ' ON ' + @dcName + ' (' + @NonClusteredIndexField + ')'
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
/* This section added in as I use cte's quite a lot */
IF @SelectSQL LIKE '%/* INSERT HERE */%'
BEGIN
SET @strSQL = REPLACE(@SelectSQL, '/* INSERT HERE */', 'INSERT INTO ' + @dcName)
END
ELSE
BEGIN
SET @strSQL = 'INSERT INTO ' + @dcName + CHAR(13) + @SelectSQL
END
IF @debug = 1
PRINT (@strSQL)
EXEC (@strSQL)
END
END