小编Sql*_*yan的帖子

根据我正在更新的行数,使用完全不同的计划的 T-SQL 查询

我有一个带有“TOP (X)”子句的 SQL UPDATE 语句,我正在更新值的行大约有 40 亿行。当我使用“TOP (10)”时,我得到一个几乎立即执行的执行计划,但是当我使用“TOP (50)”或更大时,查询永远不会(至少,在我等待时不会)完成,并且它使用完全不同的执行计划。较小的查询使用带有一对索引查找和嵌套循环连接的非常简单的计划,其中完全相同的查询(在 UPDATE 语句的 TOP 子句中具有不同的行数)使用涉及两个不同索引查找的计划、表线轴、并行性和一堆其他复杂性。

我使用了“OPTION (USE PLAN...)”来强制它使用由较小查询生成的执行计划——当我这样做时,我可以在几秒钟内更新多达 100,000 行。我知道查询计划很好,但 SQL Server 只会在只涉及少量行时自行选择该计划 - 我的更新中任何相当大的行数都会导致次优计划。

我认为并行性可能是罪魁祸首,所以我设置MAXDOP 1了查询,但没有效果 - 这一步已经消失,但糟糕的选择/性能没有。我sp_updatestats今天早上也跑了,以确保这不是原因。

我附上了两个执行计划 - 越短的执行计划也越快。此外,这里是有问题的查询(值得注意的是,我包含的 SELECT 在小行数和大行数的情况下似乎都很快):

    update top (10000) FactSubscriberUsage3
               set AccountID = sma.CustomerID
    --select top 50 f.AccountID, sma.CustomerID
      from FactSubscriberUsage3 f
      join dimTime t
        on f.TimeID = t.TimeID
      join #mac sma
        on f.macid = sma.macid
       and t.TimeValue between sma.StartDate and sma.enddate 
     where f.AccountID = 0 --There's a filtered index …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan query-performance

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

我正在使用 SQL Server 代理来安排非数据库任务 - 这是一个坏主意吗?

由于我是一名 DBA(并且在许多情况下,事实上的系统管理员),SQL Server 安装在我必须定期使用的几乎每台服务器上。我最近意识到我在几乎所有情况下都使用 SQL 代理作为作业调度程序,而不是本机 Windows 任务调度程序。

从我的角度来看,SQL Agent 比原生的 Windows 任务计划程序有很多优势:

  • 远程(从我的工作站)启动/停止/监控任务
  • 共享计划(而不是每个任务单独执行)
  • 多个步骤和控制流程
  • 不同类型的任务
  • 失败/完成警报
  • 可以配置为不同的用户
  • (适度)描述性错误消息,而不仅仅是错误代码

但是,我无法逃避这是一种不好的做法 - SQL 代理应该只保留用于与数据库相关的任务,并且我应该让操作系统级别的任务在 Windows 任务计划程序中运行,尽管我不喜欢它的可用性。

这样依赖SQL Agent可以吗?如果没有,我是否应该考虑使用第三方 Windows 任务调度程序来获得我正在寻找的某些功能?

sql-server sql-server-agent windows-server scheduled-tasks

13
推荐指数
2
解决办法
3911
查看次数

SQL Server 相当于 Oracle RAC 的功能吗?

我做了一些谷歌搜索,但在几年前找不到这个问题的答案,所以我想我会问。Oracle 的 RAC 特性为读取和写入事务提供负载平衡,以及无需停机的横向扩展和高可用性(至少,据我所知 - 我们即将部署我们的第一个使用 RAC 的数据库,所以我们会看看情况如何)。

是否有提供等效功能的任何 SQL Server 功能集(或您可以安装在顶部的第三方组件)?我们一直使用 Windows 集群,其中故障转移事件会导致大约 20-30 秒的 SQL 停机时间 - 总是可以容忍的,但并不理想。现在,使用 SQL 2012 中的 AlwaysOn,SQL Server 将其缩短到大约 15 秒,并添加了只读辅助数据库的概念,但它们仍然要求通过单个连接点阻塞写入事务(大大改进,因为许多事务是只是阅读,但仍然不是真正的负载平衡),并且在节点故障或需要修补的情况下,仍然存在停机时间。

我想这只是更多的好奇心 - 我觉得这是 SQL Server 落后于 Oracle 的唯一领域(至少在我个人看到使用的功能中)。我想看看是否有任何选项可以缩小这一差距,并在我们等待添加 Microsoft 的等效功能的同时改进我们自己的 SQL Server 部署 - 也许在 SQL 2014/2015 中?

sql-server feature-comparison rac oracle-rac high-availability

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

数据库查询优化器是否知道存储性能差异?

据我了解,SQL Server(或任何其他 RDBMS,实际上)中的查询优化器不知道数据库下存储的性能,并且会做出决策,好像所有存储的成本都相同。这是准确的,还是有一些考虑到存储性能的知识?

在一个完全人为设计的示例中,假设我的表行以瞬时访问时间存储在 SAN 中的 SSD 驱动器上,其中我的索引存储在极度过载的 SAS 驱动器上,从而导致磁盘饱和和恒定的磁盘队列。当 RDBMS 生成执行计划时,它是否比索引操作更倾向于表扫描(或者可能是瘦索引和关联的表查找,而不是覆盖索引,因为它在 SAS 磁盘上的 IO 较少)?

我怀疑答案是可靠的“优化器不可能聪明甚至意识到磁盘性能”,但我只是想看看是否有人确切知道。我正在使用 SQL Server,但我对任何数据库系统都感兴趣。

storage execution-plan

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

为什么分区级锁升级不是默认设置?

在 SQL Server 中,锁通常从行或页 -> 表升级。从 SQL Server 2008 开始,添加了一个新级别的锁升级 -分区级别

但是,这不会为分区表自动启用 - 默认情况下,该表设置为跳过分区锁定并从行或页 -> 表开始。为什么会这样?有什么原因我不想把我所有的表从 切换TABLEAUTO以便它们将锁升级到分区级别而不是表级别?

由于默认值仍然是TABLE,我认为AUTO.

sql-server-2008 sql-server partitioning lock-escalation

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

SA 帐户需要称为“SA”还是我可以安全地重命名它?

我们的网络上有一些应用程序(在我之前)在其 SQL Server 连接字符串中使用 SA 帐户。它在源代码中是硬编码的,无论出于何种原因,我们都无法更改它 - 我的问题不是我们为什么要更改它,而是解决它。

我正在考虑将 SA 帐户重命名为其他名称(例如“SysAccount”或类似名称,并为其提供新密码),然后使用旧密码创建一个名为“SA”的新帐户并授予其适用于应用程序的权限(显然不是 sysadmin 角色的成员)。这样做有什么陷阱吗?如果名为 SA 的帐户实际上不是系统管理员,SQL Server 是否会遇到已知问题?

我假设因为我只是重命名帐户,所以我是安全的 - 它的 uid 仍然为 0x01,我已经测试过了,它在物理上是可行的,并且在测试中似乎可以正常工作,但我想确保我并没有忽视任何会因此而明显破裂的东西。如果它破坏了某些东西,我总是可以删除新的 SA 并将旧的 SA 重命名回以消除损坏,但希望避免尝试和失败。

我正在使用 SQL Server 2012,但我怀疑相同的答案将适用于任何现代版本。我已经看到了从 2005 年升级到 2008 年的错误,如果你这样做了,但我想这个问题早就解决了。

sql-server sql-server-2012

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

Oracle 闪回查询语法 - 所有表都使用相同的时间戳

I'm not finding a lot of examples online of how to use Oracle Flashback Query and I'm hoping somebody can clarify syntax. I'm trying to execute a query with a large number of tables in it, but the syntax seems to require me to specify a timestamp for every single table involved in the query.

For example, the following query gets me consistent data, but it requires me to specify a timestamp for each table:

select t1.Field1, t2.Field2
  from table1 …
Run Code Online (Sandbox Code Playgroud)

oracle syntax flashback

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

Oracle 分区拆分期间何时移动数据?

我需要拆分一个 Oracle 分区,我对执行拆分时 Oracle 是否要物理重新定位数据感到困惑。这是我打算做的:

alter table SCHEMA.DATATABLE
   split partition MAXVAL_PART
   at (TO_DATE(' 2013-04-01 00:00:00',
               'SYYYY-MM-DD HH24:MI:SS',
               'NLS_CALENDAR=GREGORIAN'))
   into (partition PARTFOREXISTINGROWS
        tablespace EXISTINGMAXVALTABLESPACE,
         partition MAXVAL_PART
        tablespace NEWMAXVALTABLESPACE);
Run Code Online (Sandbox Code Playgroud)

问题是我当前的 MAXVAL_PART 中有 320 GB 的数据,我不想在磁盘上物理移动这些数据。如果我在 2013 年 4 月 1 日切断分区,那么新分区中将没有数据,但是我收到了关于这是否仍然需要移动所有数据的相互矛盾的信息。理想情况下,Oracle 看到我的新 MAXVAL 分区将为空,在新表空间中定义它,然后我就完成了。

此命令会移动磁盘上已有的数据,还是将其留在原处并创建一个新分区?

这篇文章说 Oracle 会检测空分区并进行快速拆分 http://docs.oracle.com/cd/B19306_01/server.102/b14231/partiti.htm

但是我在很多地方看到拆分意味着所有数据都被移动到新的存储中。是哪个?

oracle partitioning

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