小编got*_*tqn的帖子

T-SQL INNER JOIN 优化

好吧,我真的阅读了很多文章,使用了不同的技术并做了一些随机的事情来做到这一点。

我的问题是有大表(超过一百万行)和一些小表(有几百行) - 我们谈论的是 8 个内部连接。

将执行时间从超过 2 分钟减少到 30 秒对我来说很奇怪,我无法找到为什么会发生这种情况。

当我从表中选择列时,我会转换它们。我所做的是将列转换为尽可能小的类型。

例如:

  • nvarchar(4000)nvarchar(50 or 25)
  • bigintint
  • inttinyint

结果是执行时间缩短了 1 分 30 秒。为什么会发生这种情况?

例如,如果我的变量是字符串,长度为10的nvarchar(4000)nvarchar(50)将它转换为nvarchar(10)(或东西接近)。那么,为什么当我从 cast 中减少结果类型时,事情会变得更好?

更多的东西 - 我做了很多测试来检查哪个函数更好 - 转换或转换(测试字符串到字符串,字符串到数字,数字到字符串)但无法定义哪个更好用。有时转换为我提供了几秒钟的更好的执行时间,但不足以得出结论。有没有人做过这样的事情并成功了?

提前感谢您的时间。

performance sql-server

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

查询每组最近邻的空间数据

我想查询最近邻的空间数据。我正在使用这篇文章,以下查询完美运行:

SELECT TOP 1 [Location].STDistance(@Location)
FROM [DS1]
WHERE [Location].STDistance(@Location) IS NOT NULL          
ORDER BY [Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)

问题是我需要为每个MSPID. 我尝试了几件事(使用交叉应用,创建单独的函数等)但没有任何效果。所以,我决定创建一个循环来计算每个MSPID.

SELECT TOP 1 [Location].STDistance(@Location)
FROM [DS1]
WHERE [Location].STDistance(@Location) IS NOT NULL 
    AND @CurrentMSPID = [MSPID]         
ORDER BY [Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)

问题是上面的语句没有使用索引。如果我@CurrentMSPID用一个数字替换使用索引,但是当使用一个变量时,使用聚集索引而不是空间索引。

我尝试了很多选择,唯一有效的是:

OPTION (OPTIMIZE FOR ( @CurrentMSPID  = 1001 ))
Run Code Online (Sandbox Code Playgroud)

或者当值是硬编码时。我不能那样做,因为将来这id甚至可能不存在,并且肯定会更改它匹配的行数。

[DS1]表在[MSPID]列上有主键,在列上有空间索引[Location]

如何在不使用OPTIMIZE FOR选项的情况下帮助引擎生成更好的执行计划并使用空间索引?


当从表中提取其他数据时(我们MSPID现在正在过滤),引擎似乎无法使用空间索引并执行聚集索引查找。

sql-server sql-server-2012 spatial sql-server-2014 nearest-neighbor

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

是否可以使用密码证书加密来创建加密备份?

我已通过密码证书加密,我想将其用于备份加密。问题是我无法使用证书(在 T-SQL 语句或维护计划中),因为我无法打开它 - 似乎没有OPEN CERTIFICATE命令。

我希望通过密码加密证书,因为我们的目标是只有一个用户负责在 SQL Server 实例中创建/插入证书。没有其他人能够导出证书并恢复加密的备份。

是否有可能,或者为了加密备份,我必须始终使用数据库主密钥加密证书?

sql-server backup encryption sql-server-2016 sql-server-2017

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

如何在 VLF 中找到活动交易?

有没有办法找到作为阻止重用事务日志文件 VLF 的活动事务的一部分的 T-SQL 语句?

我每 15 分钟执行一次 tlog 备份,但有时会返回以下查询ACTIVE_TRANSACTIONLOG_BACKUP(甚至这样):

SELECT [name]
      ,[recovery_model_desc] 
      ,[log_reuse_wait_desc]
FROM [sys].[databases]
Run Code Online (Sandbox Code Playgroud)

如果我运行,DBCC Loginfo我可以看到 firsts 和 lasts 行都有 status 0

sql-server sql-server-2012 transaction-log

4
推荐指数
1
解决办法
4174
查看次数

如何安装 Microsoft SQL Server 2014 Standard Edition 试用版?

我想在具有相同硬件的两台独立服务器上安装 SQL Server 2014StandardEnterprise版本,以测试运行内部程序集的性能差异。

DBA 给了我两个ISO名称如下:

SW_DVD9_SQL_Svr_Standard_Edtn_2014w_SP1_64Bit_English_-2_MLF_X20-29010
SW_DVD9_SQL_Svr_Ent_Core_2014w_SP1_64Bit_English_-2_MLF_X20-28988
Run Code Online (Sandbox Code Playgroud)

声称它们是从 Microsoft 下载的,但是一旦我安装了它们并运行:

SELECT @@VERSION
Run Code Online (Sandbox Code Playgroud)

我得到以下Enterprise版本:

Microsoft SQL Server 2014 - 12.0.4213.0 (X64) 2015 年 6 月 9 日 12:06:16 版权所有 (c) Windows NT 6.3(内部版本 9600:)上的 Microsoft Corporation 企业评估版(64 位)

以及以下Standard版本:

Microsoft SQL Server 2014 - 12.0.4213.0 (X64) 2015 年 6 月 9 日 12:06:16 版权所有 (c) Windows NT 6.3(内部版本 9600:)上的 Microsoft Corporation 企业评估版(64 位)

那么,我做错了什么?为什么,当我Standard再次使用iso 时Enterprise被安装?


我想这应该是 …

sql-server sql-server-2014

4
推荐指数
1
解决办法
8328
查看次数

SQL Server 在哪里存储对称密钥?

我想知道在特定数据库中创建的对称密钥是否存储在主文件组中?

或者它们存储在用户无法与之交互的某些特殊文件组中?

例如,如果我对文件组(主要或次要)执行部分备份,我可以确定备份不包含对称密钥吗?

sql-server filegroups t-sql sql-server-2016 symmetric-key

4
推荐指数
1
解决办法
649
查看次数

在 Enterprise 与 Standard 上使用 R 服务的确切好处是什么?

我目前正在使用SQL Server 2016 SP标准版并想安装 R 服务。在文件说,一个独立的安装只允许在企业(Machine Learning Server (Standalone))。

另外,我发现了一个帖子,那个人说在标准上我不能使用并行操作并且有内存限制:

在此处输入图片说明

谁能说出确切的内存/处理器限制是什么?

我需要诸如使用大量 R 计算之类的细节,现在的测试表明,标准版中的实现并没有像我希望的那样工作。

sql-server t-sql sql-server-2016 r

4
推荐指数
1
解决办法
1110
查看次数

无法为链接服务器的 OLE DB 提供程序“SQLNCLI11”启动嵌套事务

我有两个链接的服务器,并且想要创建一个存储过程,该过程SELECT仅从第一台服务器的一个表中获取INSERT数据,并从第二个服务器中获取另一个表中的数据。

程序代码如下所示:

BEGIN TRAN

INSERT INTO [RI].[TEST_DB].[TEST_TABLE] (...)
SELECT ...
FROM [TABLE]

TRUNCATE [TABLE]

COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

链接服务器“RI”的 OLE DB 访问接口“SQLNCLI11”返回消息“无法在此会话上启动更多事务。”。
消息 7395,级别 16,状态 2,过程 usp_test,第 46 行
无法为链接服务器“RI”的 OLE DB 提供程序“SQLNCLI11”启动嵌套事务。
需要嵌套事务,因为 XACT_ABORT 选项设置为 OFF。

sql-server linked-server sql-server-2014

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

从非聚集索引定义中排除聚集键列

正如我读过的书签或非聚集索引对表聚集索引的引用是聚集索引键本身。在我参加的SQL 星期六活动中,一位讲师说从非聚集索引键定义和包含子句中排除聚集键列始终是一个好习惯。

我想知道这样做是否有任何负面影响,对于以下情况:

  1. Table A有以下栏目:RecordIDQuestionIDPtsPtsOf和许多其他。
  2. 我创建了一个像这样的非聚集索引:

    CREATE NONCLUSTERED INDEX [IX_TableA_RecordID_QuestionID] ON [dbo].[TableA]
    (
        [RecordID] ASC
       ,[QuestionID] ASC
    )INCLUDE ([Pts],[PtsOf]);
    
    Run Code Online (Sandbox Code Playgroud)

    为了在按记录和问题计算分数时跳过阅读聚集索引。该[RecordID][QuestionID]对是聚集索引键。

如果我像这样更改索引:

CREATE NONCLUSTERED INDEX [IX_TableA_RecordID_QuestionID] ON [dbo].[TableA]
(
    [Pts] ASC
   ,[PtsOf] ASC
);
Run Code Online (Sandbox Code Playgroud)

即使对于不引用点列的查询,索引也会像以前一样使用(它满足搜索条件):

SELECT [RecordID]
      ,[QuestionID]
FROM [dbo].[TableA];

SELECT [RecordID]
FROM [dbo].[TableA];

SELECT [QuestionID]
FROM [dbo].[TableA];
Run Code Online (Sandbox Code Playgroud)

因此,引擎足够聪明,可以看到使用非聚集索引会减少读取次数,我知道将其保留为原始定义也有效,但是有些索引非常大,我认为删除一些键可以减小它们的大小。

我担心的是第一个索引行是按书签排序的,现在不是。我想知道这是否以及如何会损害性能?

index sql-server sql-server-2012 sql-server-2014

3
推荐指数
1
解决办法
746
查看次数

更改数据捕获与记录更改的触发器

我将创建由触发器填充的历史表(在插入、更新、删除之后)。由于只有 20% 的列要更新,我决定只记录更改的值 - 如果值没有更改,NULL则将在历史表中使用值。例如:

在此处输入图片说明

sparse与记录所有数据的普通实现相比,历史表列将节省大量空间(这是由于我的测试和我的业务案例)。

作为我的SQL Server 2016 SP1 standard edition支持者,Change Data Capture我想知道他们使用它和基于触发器的日志记录之间有什么优点/缺点/区别?

我检查了一些文章(这里这里),但看不出还有什么Change Data Capture可以给我的。

trigger sql-server t-sql change-data-capture sql-server-2016

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