标签: sql-server

没有 PARTITION BY 的 ROW_NUMBER() 仍然生成 Segment 迭代器

我正在撰写我即将发表的关于排名和聚合窗口函数的博客文章,特别是 Segment 和 Sequence Project 迭代器。我理解的方式是 Segment 标识流中构成组结束/开始的行,因此以下查询:

SELECT ROW_NUMBER() OVER (PARTITION BY someGroup ORDER BY someOrder)
Run Code Online (Sandbox Code Playgroud)

将使用 Segment 来判断一行何时属于前一行以外的不同组。然后 Sequence Project 迭代器根据 Segment 迭代器的输出进行实际的行号计算。

但是使用该逻辑的以下查询不应包含 Segment,因为没有分区表达式。

SELECT ROW_NUMBER() OVER (ORDER BY someGroup, someOrder)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这个假设时,这两个查询都使用了 Segment 运算符。唯一的区别是第二个查询不需要GroupBy在 Segment 上。这不是首先消除了对 Segment 的需求吗?

例子

CREATE TABLE dbo.someTable (
    someGroup   int NOT NULL,
    someOrder   int NOT NULL,
    someValue   numeric(8, 2) NOT NULL,
    PRIMARY KEY CLUSTERED (someGroup, someOrder)
);

--- Query 1:
SELECT ROW_NUMBER() OVER (PARTITION BY someGroup ORDER BY someOrder)
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan

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

index_id < 256000 有什么意义?

在我读到的某个教程中,作者正在sys.indexes根据谓词进行过滤index_id < 256000。这有什么作用?

index sql-server metadata catalog-views

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

如何允许执行存储过程但不允许写入?

我想在我的 SQL Server 2012 实例上设置一个“阅读”用户。我想让他有权执行任何存储过程、函数或直接 SQL 语句,这些语句从所有表和视图中检索数据,但不能更新或插入(即读取任何内容,不写入任何内容)。

我是否可以在不按名称专门授予每个函数或存储过程的权限的情况下进行设置,而是授予他对任何函数或存储过程的执行权,而只是剥夺修改表的权利?

如果我改为运行 SQL Server 2008,会有什么变化吗?

澄清和补充:

  1. 如果存储过程更改数据,用户应该收到错误消息(拒绝修改或完全拒绝访问存储过程)。
  2. 如果潜在的解决方案涉及拒绝权限,我可以不授予某些权限而不是拒绝吗?
  3. 是否可以在一个语句中对数据库中的所有表、视图等(现在和将来存在的)应用拒绝?

sql-server-2008 sql-server permissions sql-server-2012

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

使用 SQL CLR 的安全或性能风险

在 SQL Server 中使用 CLR 是否存在任何特定的安全或性能风险?

performance security sql-server sql-clr

11
推荐指数
2
解决办法
7996
查看次数

了解统计数据、执行计划和“上升的关键问题”

我试图更好地理解(从概念上)统计、执行计划、存储过程执行之间的关系。

我说统计信息仅在为存储过程创建执行计划时使用,而在实际执行上下文中不使用,我说的对吗?换句话说,如果这是真的,一旦创建了计划(并假设它被正确重用),“最新”统计数据有多重要?

我读过的一篇文章(统计、行估计和升序日期列)特别激励我,该文章描述的场景与我每天面对的几个客户数据库非常相似。

在我们使用特定存储过程定期查询的最大表之一中,我们有一个升序日期/时间列。

当您每天添加十万行时,您如何防止执行计划变得陈旧?

如果我们经常更新统计信息来解决这个问题,在这个存储过程的查询中使用 OPTION (RECOMPILE) 提示是否有意义?

任何意见或建议将不胜感激。

更新:我使用的是 SQL Server 2012 (SP1)。

sql-server statistics execution-plan sql-server-2012

11
推荐指数
2
解决办法
3249
查看次数

我应该在什么时候拆分或分区一个非常大但简单的表

我们的网站有一些大而简单的(INT、INT、DATE)统计表。每个表最多有 300,000,000 行,而且每天都在变大。

托管服务提供商建议我们拆分或分区表,我在其他地方多次看到此建议。

然而...

我正在努力将这个建议与SQL Server规定的最大容量相协调——数据库大小为 524,272 TB,表行仅受“可用存储”的限制。

根据这些数字,上面描述的表格很容易有数百万计的行(10 的 303 次方)。

啊哈哈,你可能会说,能力和性能是有区别的。

几乎所有关于 SQL Server 性能的问题的答案都是“这取决于......取决于表设计和查询设计”。

这就是我问这个问题的原因。桌子的设计再简单不过了。基于索引 ID 字段的简单 count(*) 操作查询也不能。

performance sql-server

11
推荐指数
4
解决办法
6047
查看次数

查找导致缺少索引 DMV 的查询

如何找到导致建议创建特定索引的缺失索引 DMV 的查询?

谢谢你。

index sql-server-2008 sql-server sql-server-2008-r2 dmv

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

将查询计划按语句拆分以实现可重用性会更好吗?

根据我对查询如何编译、存储和检索查询计划的有限了解,我了解多语句查询或存储过程将生成它的查询计划,该查询计划将存储在查询计划缓存中,以供查询在未来执行中使用。

我认为这个计划是通过查询哈希从查询计划缓存中检索的,这意味着如果查询被编辑和执行,哈希是不同的,并且会生成一个新计划,因为在查询计划缓存中找不到匹配的哈希。

我的问题是:如果用户执行的语句是多语句查询中的语句之一,它是否可以将缓存中已有的查询计划的相关部分用于多语句查询?我希望答案是否定的,因为哈希值显然不匹配,但是在多语句查询中对每个语句进行哈希处理是否更好,以便用户可以从查询中运行单个语句来使用它们?

我希望有一些我没有考虑到的并发症(我真的很想知道这些),但似乎我们可以在许多查询计划中存储相同的“语句计划”,占用更多空间和更多CPU 和生成时间。

可能只是显示我的无知。

sql-server execution-plan plan-cache

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

使用xml参数插入多个数据时如何避免使用Merge查询?

我正在尝试使用一组值更新表。数组中的每一项都包含与 SQL Server 数据库表中的行匹配的信息。如果该行已存在于表中,我们将使用给定数组中的信息更新该行。否则,我们在表中插入一个新行。我已经基本上描述了 upsert。

现在,我试图在采用 XML 参数的存储过程中实现这一点。我使用 XML 而不是表值参数的原因是,执行后者时,我必须在 SQL 中创建自定义类型并将此类型与存储过程相关联。如果我以后更改了存储过程或数据库架构中的某些内容,则必须重做存储过程和自定义类型。我想避免这种情况。此外,TVP 相对于 XML 的优势对我的情况没有用,因为我的数据数组大小永远不会超过 1000。这意味着我不能使用这里提出的解决方案:How to insert multiple records using XML in SQL server 2008

此外,这里的类似讨论(UPSERT - 是否有更好的替代 MERGE 或 @@rowcount?)与我所问的不同,因为我试图将行插入到表中。

我希望我可以简单地使用以下一组查询来更新 xml 中的值。但这行不通。当输入是单行时,这种方法应该有效。

begin tran
   update table with (serializable) set select * from xml_param
   where key = @key

   if @@rowcount = 0
   begin
      insert table (key, ...) values (@key,..)
   end
commit tran
Run Code Online (Sandbox Code Playgroud)

下一个替代方法是使用详尽的 IF EXISTS 或其以下形式的变体之一。但是,我以次优效率为由拒绝了这一点:

IF (SELECT COUNT ... ) > 0 …
Run Code Online (Sandbox Code Playgroud)

xml sql-server stored-procedures t-sql upsert

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

在提交事务之前查询数据

我的理解是,在 MS SQL Server Management Studio 窗口中,在执行“开始事务”然后进行一些更改(例如将数据添加到表)之后,您只能从同一窗口查询该表和这些更改,直到您执行“提交交易”。

在执行“提交事务”之前,有什么方法可以从其他来源进行查询?

具体到我当前的目标并添加一些上下文。我从 Excel Power Query 执行一些 SQL 查询。我真的很希望能够在“提交事务”之前执行这些查询,以便我可以进行一些分析并确定是否应该进行回滚而不是提交。

sql-server ssms transaction

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