小编got*_*tqn的帖子

如何命名表变量函数唯一约束?

我正在重命名一些独特的约束以匹配我们的数据库对象命名约定。奇怪的是,有几个多行表值函数返回的表具有唯一约束,如下所示:

CREATE FUNCTION [dbo].[fn_name] (...)
RETURNS @Result 
TABLE
(
    ID BIGINT PRIMARY KEY,
    ...
    RowNum BIGINT UNIQUE 
)
BEGIN
    ...
    RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)

我尝试这样命名它,但不起作用:

CREATE FUNCTION [dbo].[fn_name] (...)
RETURNS @Result 
TABLE
(
    ID BIGINT PRIMARY KEY,
    ...
    RowNum BIGINT
    ,CONSTRAINT UC_fn_name_RowNum UNIQUE([RowNum])  
)
BEGIN
    ...
    RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)

当它是表变量函数定义的一部分时,是否可以设置唯一约束的名称?

t-sql sql-server-2012 set-returning-functions unique-constraint table-variable

8
推荐指数
1
解决办法
1216
查看次数

.WRITE 子句性能优化

我发现您可以使用子句(示例hereherehigh performance updatesvarchar(max),nvarchar(max),varbinary(max)列进行操作。不幸的是,官方文档中没有提到性能优化。.WRITE

谁能告诉有任何优化吗?有人做过性能测试吗?此外,如果有优化,我想它也只会影响特定情况。

varchar sql-server-2012 update

7
推荐指数
1
解决办法
1351
查看次数

如何优化 STDistance 执行?

我在存储过程执行期间使用以下结构创建临时表:

[ID] BIGINT
[Point] GEOGRAPHY
Run Code Online (Sandbox Code Playgroud)

ID不是唯一的-大约有200每个记录ID

我需要找到一个不同的列表,IDs其中至少有一个PointPoint常量值(例如200米)大的距离。

所以,我正在使用这样的东西:

SELECT DISTINCT DS1.[ID]
FROM DataSource DS1
INNER JOIN DataSource DS2
    ON DS1.[ID] = DS2.[ID]
WHERE DS1.Point.STDistance(DS2.Point) > 200
Run Code Online (Sandbox Code Playgroud)

对于 23 000 个点,查询执行4-5几秒钟。因为我期待有更多的价值,所以我需要找到更好的解决方案。

我想如果有更快的方法,我总是可以创建一个物化表并实现额外的逻辑来计算它ID

我创建了一个空间索引,但查询优化器没有使用它。如果我使用hint这样的WITH (INDEX(SPATIAL_idx_test))我会收到以下错误:

消息 8635,级别 16,状态 4,第 78 行
查询处理器无法为带有空间索引提示的查询生成查询计划。原因:空间索引不支持谓词中提供的比较器。尝试删除索引提示或删除SET FORCEPLAN. `

sql-server sql-server-2012 spatial

7
推荐指数
1
解决办法
2948
查看次数

禁用“CLR”时,“HierarchyID”类型如何工作?

以下语句sp_configure 'clr enabled'返回:

name        minimum maximum config_value    run_value
clr enabled 0       1       0               0
Run Code Online (Sandbox Code Playgroud)

我认为这意味着没有CLR对象;但是,如果我执行以下语句,我会得到这些:

SELECT * FROM sys.assembly_files
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

SELECT * FROM sys.assembly_types
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我已经读过The HierarchyID type is available to CLR clients as the SqlHierarchyId data type.

如何在没有CLR启用的情况下使用它,为什么我需要启用它来创建我自己的CLR对象?

sql-server configuration sql-server-2012 sql-clr

6
推荐指数
1
解决办法
459
查看次数

有没有办法在 Always on 下最小化记录插入?

我有一个处于FULL恢复模式的主数据库,它是Always On组的一部分。有没有办法在FULL恢复模式下最小化记录插入操作?

我有一个每天执行的进程,并在表中插入几百万条记录。随着操作的继续,事务日志文件的大小急剧增加(从 1 GB 到 40 GB)。

正如我所读到的,我可以使用一些未完INSERT全记录操作的变体,但我担心切换恢复模型的效果?

t-sql sql-server-2012 transaction-log availability-groups bulk-insert

6
推荐指数
1
解决办法
4825
查看次数

GZipStream/DeflateStream 压缩替代方案

我创建了一个简单的 CLR 函数来压缩/解压缩NVARCHAR列:

[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlBinary Compress( string str ){
    if( str == null ){return new SqlBinary();}

    if( String.IsNullOrEmpty( str ) ){str = " ";}

    byte[] bytes = Encoding.Unicode.GetBytes( str );
    using( MemoryStream msi = new MemoryStream( bytes ) ){
        using( MemoryStream mso = new MemoryStream() ){
            using( GZipStream gs = new GZipStream( mso, CompressionMode.Compress ) ){
                msi.CopyTo( gs );
            }
            return new SqlBinary( mso.ToArray() );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的压缩率大约是 4,或者如果我有 1024 …

compression sql-server-2012 sql-clr

6
推荐指数
1
解决办法
2662
查看次数

是否有任何理由避免使用 sp_rename 重命名对象?

文档中明确指出:

更改对象名称的任何部分都可能破坏脚本和存储过程。我们建议您不要使用此语句重命名存储过程、触发器、用户定义函数或视图;相反,删除对象并使用新名称重新创建它。

重命名怎么样:

  • 主键
  • 唯一键
  • 外键
  • 默认约束
  • 索引

我将重命名上述所有对象以匹配我们的内部命名约定,但我想为此编写一个自动脚本(因为有数千个约束)。

我能想到的唯一问题是,如果索引与hintin 语句一起使用,它将被破坏。

您能说出任何其他不将sp_rename用于此类目的的原因吗?

sql-server t-sql sql-server-2012 sql-server-2014

6
推荐指数
1
解决办法
2680
查看次数

在另一台服务器上恢复加密数据库(使用备份加密)

我在同一台机器上有两个 SQL Server 实例。我想在其中一个数据库上创建加密备份,然后在第二个实例上还原它。我正在执行以下步骤:

  1. master将用于加密我们的证书的数据库中创建和备份数据库主密钥

    USE MASTER;
    GO
    
    CREATE MASTER KEY
    ENCRYPTION BY PASSWORD = 'MasterKey_Password';
    GO
    
    BACKUP MASTER KEY
    TO FILE = 'E:\GKKeys\MASTER_KEY.key'
    ENCRYPTION BY PASSWORD = 'MasterKey_BACKUP_Password';
    GO
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建并备份将用于加密的证书:

    USE MASTER;
    GO
    
    -- ????????? ??????????, ????? ?? ????????? ?? ?????????? ?? backup-a
    CREATE CERTIFICATE BackupEncryptTestCert
    WITH SUBJECT = 'smGK_BackupCertificate'
    GO
    
    BACKUP CERTIFICATE BackupEncryptTestCert
    TO FILE = 'E:\GKKeys\SMGK_BACKUP_CERTIFICATE.cer'
    WITH PRIVATE KEY
    (
        FILE = 'E:\GKKeys\SMGK_BACKUP_CERTIFICATE_PRIVATE_KEY.key'
       ,ENCRYPTION BY PASSWORD = 'smGK_BackupCertificate_BACKUP_Password'
    );
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建备份:

    BACKUP DATABASE smGK …
    Run Code Online (Sandbox Code Playgroud)

sql-server backup encryption sql-server-2014

6
推荐指数
2
解决办法
3万
查看次数

预读和 SQL-Variant 字段

我有两个包含完全相同数据的表。两个表都有bigint primary key identity column60 列和 300 000 行。不同之处在于第二个表的所有列都有sql-variant类型。

我正在创建临时表并从其中的两个表中导入数据。当从sql-variant列中提取数据时,它会被转换为相应的 SQL 类型。

从第一个表中提取数据是针对1 sec和从第二个表中提取的6 secs

基本上,执行的差异在于估计:

在此处输入图片说明

在此处输入图片说明

并在read-ahead reads计数中:

在此处输入图片说明 在此处输入图片说明

我想知道为什么SQL Server不能提前加载从sql-variant字段中读取的数据(几乎没有read-ahead reads)。

此外,表的存储大小几乎相同:

在此处输入图片说明

为什么SQL Server认为它应该阅读67 GB


列类型是:

16 x BIGINT
8  x DECIMAL(9,2)
36 x NVARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

dbcc dropcleanbuffers命令每次在数据提取和填充之前使用。


为了进行测试,您可以从这里下载示例数据文件。然后,

  1. 执行 Tech05_01_TableDefinitions.sql
  2. 执行 3 次 Tech05_02_TablePupulation.sql
  3. 打开Tech05_03_TestingInsertionInTempTable.sql文件并像这样执行一次:

    DECLARE @TableStructured SYSNAME = '[dbo].[NormalDataTypes_60Cols]';
    DECLARE @TableFromWhichDataIsCoppied …
    Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 sql-variant-property sql-server-2014 standard-edition

6
推荐指数
1
解决办法
164
查看次数

SQL Server 2019 列存储索引 - 维护

我在用于日志记录的表上有一个聚集的列存储索引 - 仅插入(但不是批量插入)。当前的表统计是:

  • 3541 百万行
  • 6.6 GB 预留空间

我今天早上通过以下操作看到以下操作sp_whoisactive

ALTER INDEX [...] ON [...].[...] 
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
Run Code Online (Sandbox Code Playgroud)

我使用以下查询来检查row_group_id我们有多少行:

SELECT
    tables.name AS table_name,
    indexes.name AS index_name,
    partitions.partition_number,
    dm_db_column_store_row_group_physical_stats.row_group_id,
    dm_db_column_store_row_group_physical_stats.total_rows,
    dm_db_column_store_row_group_physical_stats.deleted_rows,
    dm_db_column_store_row_group_physical_stats.state_desc,
    dm_db_column_store_row_group_physical_stats.trim_reason_desc
FROM sys.dm_db_column_store_row_group_physical_stats
INNER JOIN sys.indexes
ON indexes.index_id = 
    dm_db_column_store_row_group_physical_stats.index_id
AND indexes.object_id = 
    dm_db_column_store_row_group_physical_stats.object_id
INNER JOIN sys.tables
ON tables.object_id = indexes.object_id
INNER JOIN sys.partitions
ON partitions.partition_number = 
    dm_db_column_store_row_group_physical_stats.partition_number
AND partitions.index_id = indexes.index_id
AND partitions.object_id = tables.object_id
Run Code Online (Sandbox Code Playgroud)

我们33831048576行和很少的行来排列组,如下所示: …

sql-server t-sql columnstore sql-server-2019

5
推荐指数
1
解决办法
195
查看次数