小编Ken*_*her的帖子

有条件地向临时表添加索引

我有一个看起来像这样的存储过程:

SELECT columnlist
INTO #temptable
FROM Table
JOIN lotsofothertables
WHERE severalconditions

UPDATE anothertable
SET column = #temptable.column
FROM anothertable 
JOIN #temptable
    ON anothertable.PKColumn = #temptable.PKColumn
Run Code Online (Sandbox Code Playgroud)

初始查询通常只生成几列 (<100),因此更新速度很快。但是偶尔(这些是我们遇到问题的运行)它会产生 1000 甚至 10,000 次。在它们之间添加这样的东西是否合理?

IF @@RowCount > 100
   CREATE INDEX ix_temp ON #temptable(PKColumn)
Run Code Online (Sandbox Code Playgroud)

或者我最好只在表上创建索引,因为行很少,创建索引所花费的时间会相当少?

index sql-server temporary-tables

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

varchar(255) 和 varchar(max) 有什么区别

今天有人问我一个有趣的问题。我之前也思考过这个问题,但没有想出一个好的答案。

如果列的值仅 <= 255 个字符,那么使用 varchar(255) 和 varchar(max) 之间是否有任何真正的区别。

我意识到它varchar(255)有 255 个字符和 2 GB 的限制varchar(max),但它们只使用存储实际值所需的空间。我没有计算该var部分所需的额外空间,因为据我所知,它是相同的(或者是吗?)。那么在性能和空间方面有区别吗?

performance database-design sql-server

5
推荐指数
0
解决办法
3350
查看次数

使用执行 SQL 脚本在 SSIS 中加载日期变量时出错

我正在尝试使用 SSIS 中的执行 SQL 任务填充变量。表结构如下:

CREATE TABLE BuildControl 
(Id INT NOT NULL Identity, BuildDate Date, 
     Country char(2), BuildStatus varchar(20), 
     BuildStatusDate DateTime)
Run Code Online (Sandbox Code Playgroud)

SQL 语句是

SELECT TOP 1 ? = Id, ? = BuildDate
FROM BuildControl
WHERE BuildStatus IS NULL
ORDER BY Id
Run Code Online (Sandbox Code Playgroud)

如果我删除? = BuildDate. 参数映射选项卡如下所示:

在此处输入图片说明

我收到的错误是这样的:

SSIS package "WFG Statement Build.dtsx" starting.
Error: 0xC002F210 at Get Build Data, Execute SQL Task: Executing the query "SELECT TOP 1 ? = Id, ? = BuildDate
FROM BuildContr..." failed with the …
Run Code Online (Sandbox Code Playgroud)

sql-server ssis sql-server-2008-r2

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

我放在 SQL Azure 上的数据有多安全?

我的妻子一直要求我为她的企业创建一个 Web 应用程序,从我读到的内容来看,使用 SQL Azure 将是完美的。除了几个小的(真的很大)问题。

  • 她在金融行业工作,受到严格监管。
  • 她使用的数据非常敏感,必须将暴露风险降至最低。

所以我的问题是,如果我将她的公司信息放在 SQL Azure 上,它的安全性如何?我不是在询问一般的 SQL Server/Azure 安全性。我说的是这是一个共享空间。绕过我实施的安全措施,入侵数据的可能性有多大?

security azure-sql-database

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

当我从 sys.dm_tran_locks 调用 OBJECT_NAME(object_id, database_id) 时,为什么会被阻止?

我正在处理一个查询,以判断给定会话中哪些对象具有锁定,但我遇到了一些阻塞问题。

这是我的基本查询:

SELECT request_session_id AS session_id, 
    request_owner_id AS transaction_id,
    OBJECT_SCHEMA_NAME(resource_associated_entity_id, resource_database_id),
    OBJECT_NAME(resource_associated_entity_id, resource_database_id),
    COUNT(1) AS lock_count
FROM sys.dm_tran_locks WITH (NOLOCK)
WHERE resource_type = 'OBJECT'
GROUP BY request_session_id, request_owner_id, 
    resource_database_id, resource_associated_entity_id
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,我偶尔会被实际持有锁的会话之一阻止。如果我删除OBJECT_NAMEOBJECT_SCHEMA_NAME然后我没有任何问题。我试过将信息转储到一个表中,然后在有类似问题的表中使用这些值的函数。

这让我相信问题出在OBJECT_NAMEOBJECT_SCHEMA_NAME函数中,但我不确定为什么或如何解决它。我也不确定为什么我有时会被阻止有时不会。有没有人有什么建议?

sql-server metadata sql-server-2008-r2 dmv blocking

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

为什么这个过滤索引不仅没有使用,而且在我尝试强制它时出错

我正在尝试调整一个相当烦人的查询,其中许多表看起来像:

date = '9999-12-31 23:59:59.9999999'
Run Code Online (Sandbox Code Playgroud)

至少有几个表在 300 百万行范围内,当我过滤它时,我最终在 2 百万范围内。尝试过滤索引似乎是合理的。

CREATE TABLE test (col1 int PRIMARY KEY, col2 int, col3 varchar(50), col4 datetime2(7), col5 int);
CREATE INDEX ix_filtered ON test(col2,col3) INCLUDE (col4) 
       WHERE col4 = '9999-12-31 23:59:59.9999999' ;
GO

SELECT col2,col3 FROM test 
WHERE col4 = '9999-12-31 23:59:59.9999999';
GO
Run Code Online (Sandbox Code Playgroud)

但是,当我检查查询计划时,它不会使用索引。它只是进行了聚集索引扫描和键查找。显然没有任何数据这是有道理的,但即使有我的所有数据,它也做同样的事情。我没有费心提供任何数据的原因是无论如何都会发生的第二个问题。

当我试图强制索引查看查询计划的样子时:

SELECT col2,col3 FROM test 
WITH (index (ix_filtered))
WHERE col4 = '9999-12-31 23:59:59.9999999'
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

消息 8622,级别 16,状态 1,第 52 行 由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。

我试图弄清楚为什么我收到查询提示错误。我的猜测是,这个问题的答案也会告诉我为什么根本没有使用过滤索引。

sql-server-2008-r2 filtered-index

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

MAXDOP 是否会影响我应该创建的 tempdb 数据文件的数量?

根据我的阅读,配置 tempdb 的最佳实践包括创建多个数据文件。我理解的经验法则是,如果您应该创建与最多 8 个逻辑处理器相同数量的数据文件。然后,如果您有 tempdb 争用,请添加一个额外的文件,直到争用消失或您有每 4 个额外的逻辑处理器添加一个额外的文件。因此,如果您有 16 个逻辑处理器,那么您最多可以创建 10 个文件。

我很好奇的是 MAXDOP 是否会对此产生影响?因此,例如,如果我有 12 个逻辑处理器。我已将 MAXDOP 设置为 6,因为它们被分成 2 个 NUMA 节点。这是否意味着我应该为 tempdb 坚持使用 6 个数据文件?或者我是否仍然拥有推荐的处理器总数的 8 或 9?

sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012 tempdb

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

在扩展事件中 rpc_completed 和 sql_batch_completed 有什么区别?

我理解这rpc_completed被定义为远程过程调用sql_batch_completed的完成,并且是一个 t-sql 批处理的完成。但是,谁能具体解释一下有什么区别?我什么时候应该使用一种,什么时候应该使用另一种?大多数/所有 SQL 命令都会触发这两个事件吗?

sql-server-2008 sql-server-2008-r2 extended-events sql-server-2012

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

sql server 日期问题

我有一个 select 语句,当在实时生产服务器上运行时,无论我做什么,都会返回 mm-dd-yyyy。这只发生在从另一个别名选择中选择日期时。简化(因为我的 sql 很长):-

select name,age,dob 
from tblone as tbltemp1
Run Code Online (Sandbox Code Playgroud)

在这个选择中,dob 总是 mm/dd/yyyy 而不是 dd/mm/yyyy

select dob from tbltemp1
Run Code Online (Sandbox Code Playgroud)

希望这个解释有意义,如果有人可以帮忙吗?

sql-server t-sql

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