小编Roy*_*mir的帖子

公共表表达式 (CTE) 的好处?

msdn

与派生表不同,CTE 可以是自引用的,并且可以在同一个查询中多次引用。

我经常使用 CTE,但我从未深入思考使用它们的好处。

如果我在同一个查询中多次引用 CTE:

  • 是否有任何性能优势?
  • 如果我进行自联接,SQL Server 会扫描目标表两次吗?

sql-server cte

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

强制 SQL Server 按照书面形式运行查询条件?

我正在使用 SQL Server 2008 R2 并且我有这个伪查询 (SP):

select ...
from ...
WHERE    @LinkMode IS NULL
     AND (myColumn IN (...very long-running query...))
     ...
     ...
Run Code Online (Sandbox Code Playgroud)

问题是查询需要很长时间才能执行——即使我使用@LinkMode=2.

正如您所注意到的,只有当 @LinkMode 为 null 时才应该执行长时间运行的查询,而这里不是这种情况。在我的情况下 @LinkMode = 2 !

但是,如果我将其更改为:

 select ...
    from ...
    WHERE    1=2
         AND (myColumn IN (...very long time exeted query...))
     ...
     ...
Run Code Online (Sandbox Code Playgroud)

SP确实跑得很快。

我以前听说有时优化器可以优化标准的顺序。

所以我问:

  • 即使优化器选择了不同的路由,还有什么比检查 if 更快=null?我的意思是,我认为检查if a==null比正在运行的其他长的查询速度更快...

  • 如何强制SQL Server 按照我编写的方式运行查询(相同的顺序)?

sql-server optimization sql-server-2008-r2

15
推荐指数
2
解决办法
5347
查看次数

了解 MS SQL Server 加密和备份

所以我在聊天询问SQL Server 备份文件的安全性。

有人告诉我,如果攻击者可以访问未加密的 .bak 文件,他们就可以访问数据。

所以让我们看看这个场景:

OPEN SYMMETRIC KEY MySymetricKey DECRYPTION
BY CERTIFICATE MyCertificate
Run Code Online (Sandbox Code Playgroud)

注意 - 这里没有密码。

然后我们通过以下方式加密我们的表:

UPDATE tbl1
 SET namePAss = ENCRYPTBYKEY(KEY_GUID('MySymetricKey'),name)
GO
Run Code Online (Sandbox Code Playgroud)

现在假设黑客得到了我的bak文件。为了查看数据(在他自己的计算机和 sql-server 中),他所要做的就是:

SELECT  
       convert( NVARCHAR(max), decryptbykey(namePAss)) 
FROM tbl1
Run Code Online (Sandbox Code Playgroud)

他还能访问数据吗?

security sql-server

13
推荐指数
1
解决办法
1084
查看次数

除非 OPTION (RECOMPILE),否则不使用索引 SEEK?

(问题移自 SO)

我有一个带有聚集索引的表(虚拟数据)包含 2 列:

在此处输入图片说明

现在我运行这两个查询:

declare 
@productid int =1 , 
@priceid  int = 1




SELECT productid,
       t.priceID
FROM   Transactions AS t
WHERE  (productID = @productid OR @productid IS NULL)
       AND (priceid = @priceid OR @priceid IS NULL)  


SELECT productid,
       t.priceID
FROM   Transactions AS t
WHERE  (productID = @productid)
       AND (priceid = @priceid)
Run Code Online (Sandbox Code Playgroud)

两个查询的实际执行计划是:

在此处输入图片说明

如您所见,第一个使用 SCAN,而第二个使用 SEEK。

但是 - 添加OPTION (RECOMPILE)到第一个查询,使执行计划也使用 SEEK:

在此处输入图片说明

DBA 聊天室的朋友告诉我:

在您的查询中,@productid=1,这意味着(productID=@productID OR @productID IS NULL)可以简化为(productID=@productID)。前者需要扫描才能使用@productID 的任何值,后者可以使用搜索。因此,当您使用 RECOMPILE 时,SQL Server 将查看您在 @productID 中实际拥有的值并为其制定最佳计划。在@productID 中使用非空值时,最好使用查找。如果@productID 的值未知,则计划必须适合@productID …

index sql-server-2008-r2

11
推荐指数
1
解决办法
519
查看次数

简化 SQL Server 触发器逻辑

我有一张Images表,该表包含这些基本列 —

ImageId (int)
VotesUp (int)
VotesDown (int)
Run Code Online (Sandbox Code Playgroud)

每张图片都可以得到赞成票(向上、向下、收回投票)

upvotes 表有:

ImageId (int)
UserId (int)
Score (int )   [-1,0,+1]
Run Code Online (Sandbox Code Playgroud)

因此,如果 -

  • 用户插入 +1 分数然后(如果不存在)我向upvotes表中添加一个新行并更新表中的值Images(用于快速获取)

  • 用户将其分数从 +1 更改为 0,然后降低 votes up

  • 用户将其分数从 +1 更改为 -1,然后减少votes up和增加 votes down
  • 用户将其分数从 0 更改为 +1,然后增加 votes up
  • 用户将其分数从 0 更改为 -1,然后增加 votes down

  • 用户将其分数从 -1 更改为 0 然后降低 votes down

  • 用户将其分数从 -1 更改为 +1,然后减少votes down 和增加votes up

这是一个非常简单的逻辑。

这是upvotes桌子上的触发器:

alter TRIGGER [dbo].[UpvotesChanged] …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server sql-server-2008-r2

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

插入和更新的单独存储过程?

我在 Microsoft SQL Server 中有一个表。有时需要更新,有时需要插入。我可以写2个存储过程:

InsertNewPerson
UpdatePertsonById
Run Code Online (Sandbox Code Playgroud)

但我正在考虑编写 1 个存储过程而不是 ( SetPerson),这两个过程都可以(如果有ID,则是update操作,否则insert)。

我应该创建一个存储过程(只需要维护一个)还是应该创建两个不同的存储过程?

sql-server-2008 sql-server stored-procedures physical-design upsert

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

SQL Server 帮助表?

如果我在 SQL Server 中编写:

SELECT number FROM master..spt_values WHERE Type = 'P' ORDER BY Number
Run Code Online (Sandbox Code Playgroud)

我得到了一个我已经可以使用的序列号列表,而不是用序列号写一个表格。

这对于小连接、行编号等非常有帮助。

我想知道是否还有其他像这样的隐藏表也可以帮助我做其他事情?例如,我可能想要select someNonImportantTextColmn from master..unknown并应用我的功能。

我在哪里可以找到这些“帮助表”的完整列表?

sql-server-2008 sql-server

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

了解 SQL Server 加密(通过密码)?

问完这个我还有一个问题。

公司需要存储敏感数据。请我们现在不要谈论证书。

一个DBA执行以下操作:

  CREATE SYMMETRIC KEY SecureSymmetricKey1 
  WITH ALGORITHM = DESX
  ENCRYPTION BY PASSWORD = N'blabla';
Run Code Online (Sandbox Code Playgroud)

一个程序员想要加密数据并执行以下操作:

  -- open key
  OPEN SYMMETRIC KEY SecureSymmetricKey1
  DECRYPTION BY PASSWORD = N'blabla'

  -- actual encrpyt
  DECLARE @encrypted_str VARBINARY(MAX)
  SET @encrypted_str =  EncryptByKey(Key_GUID('SecureSymmetricKey1'),'my data');
Run Code Online (Sandbox Code Playgroud)

另一个程序员想要读取数据,所以他这样做:

  DECLARE @decrypted_str VARBINARY(MAX)
  SET @decrypted_str = DecryptByKey(...encrypted_str...) 
Run Code Online (Sandbox Code Playgroud)

一切都很好。

问题 :

  1. 当程序员打开对称密钥时,他必须知道密码。我不认为程序员应该知道密码。如何解决?

  2. 如果一个 GOD 黑客得到了整个.BAK文件并将备份恢复到他自己的机器上 - 他可以查看其中一个程序员编写的存储过程源,并查看密码。然后黑客可以做:

    开放对称密钥 SecureSymmetricKey1 密码解密 = N'blabla'

我错过了什么?

谢谢你的帮助。

sql-server-2008 security sql-server

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

Sql server 更新查询锁定阶段?

看着

update MyTable
set Status = 1
where Status = 0
Run Code Online (Sandbox Code Playgroud)

当然 -where在实际更新之前计算。

但是这个过滤(where Status = 0)也在锁里面吗?

我的意思是锁在哪里?

这里 : update ...

或在这里: filter and update...

sql-server-2008 sql-server locking

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

无法通过实例名称连接到 SQL Server 2008 R2?

我不明白:

我已经安装了 sql server 2008 R2。安装过程要求我提供所需的实例名称,所以我写道:MSSQLSERVER

安装后,运行Setup Discovery Report确实会显示实例名称:

在此处输入图片说明

我还安装了所有的服务包。

此外,所有服务都已启动:

在此处输入图片说明

此外,所有端口都已打开(tcp:1433 + udp:1434)

在此处输入图片说明

在此处输入图片说明

此外,命名管道开启: 在此处输入图片说明

那么,问题出在哪里呢?

我无法通过实例名称连接: 在此处输入图片说明

也无法使用:

user\MSSQLSERVERuser计算机名在哪里。

也无法使用: .\MSSQLSERVER

但是(奇怪):

这 3 个确实有效:

  • user (“用户”是我的机器名)
  • (local)
  • .

题 :

为什么我不能使用我的实例名称连接到我的 sql 服务器?

相关信息:

通过 3 个工作人员之一连接后,我运行了一个有用的信息:

在此处输入图片说明

sql-server-2008-r2 connectivity windows-8

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