标签: sql-server

如何更快地查询这 2000 万条记录视图?

对于搜索功能,我使用的视图包含我需要搜索的所有表中的记录。该视图有近 2000 万条记录。针对这种观点的搜索花费了太多时间。

我应该在哪里寻找改善此视图的性能?

视图的粗略定义如下。它包括十三张桌子和大约三十个字段。

CREATE VIEW [dbo].[v_AllForSearch]
AS
SELECT 
  FT.firstField AS [firstField]
, FT.fld_primary AS [fld_primary]
, FT.fld_thirdField AS [thirdField]
, FT.fld_fourthField AS [fourthField]           
, ISNULL(ST.[fld_firstSearchField],'') AS [firstSearchField]
, ISNULL(TT.[fld_thirdSearch],'') AS thirdSearch
, ISNULL(TT.[fld_fourthSearch],'')AS fourthSearch
, ISNULL(TT.[fld_fifthSearch],'')AS fifthSearch
, ISNULL(FRT.[fld_sixthSearch],'') As [sixthSearch]
, ISNULL(FRT.[fld_seventhSearch],'') AS [seventhSearch]
, ISNULL(FRT.[fld_eightSearch],'')AS [eightSearch]
, ISNULL(FIT.[fld_nineSearch],'') AS [nineSearch]
, ISNULL(SIT.[fld_tenthSearch],'')AS [tenthSearch]
, ISNULL(SET.[fld_eleventhSearch],'') AS [eleventhSearch]
, ISNULL(ET.[twelthSearch],'')AS [twelthSearch]
, ISNULL(NT.[thirteenthSearch],'')AS [thirteenthSearch]
, ISNULL(NT.[fourteenSearch],'') AS [fourteenSearch]
, ISNULL(NT.[fifteenSearch],'') AS [fifteenSearch]
, ISNULL(NT.[sxteenSearch],'')  AS [sxteenSearch]
, …
Run Code Online (Sandbox Code Playgroud)

index sql-server optimization view

14
推荐指数
3
解决办法
8112
查看次数

sp_WhoIsActive 和 get_plans -- 实际计划?

Adam Machanic 的 sp_WhoIsActive 在运行时是否返回实际查询计划或估计计划@get_plans=1?

sql-server

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

暂时将 SQL Server 2016 数据库移至 SQL Server 2017,然后移回。是否可以?

如果我从 SQL Server 2016 实例备份数据库,然后将其还原到 2017 实例以对其进行一些工作。

然后我可以从 2017 年实例中转身并备份该数据库,并使用它来覆盖 2016 年实例上的原始版本吗?

sql-server backup restore sql-server-2016 sql-server-2017

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

部分覆盖范围谓词的基数估计

目前我正试图弄清楚 SQL Server 如何评估部分覆盖直方图步骤的范围谓词的基数。

在互联网上,在cardinality-estimation-for-and-for-intra-step-statistics-value我遇到了一个类似的问题,Paul White 给出了一个相当有趣的答案。

根据Paul的回答,谓词>=和>的基数估计公式(在这种情况下,我只对至少120的基数估计器模型感兴趣)如下:

对于 >:

Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1)))
Run Code Online (Sandbox Code Playgroud)

对于 >=:

Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1))
Run Code Online (Sandbox Code Playgroud)

我基于范围谓词使用TransactionDate列和“20140614”和“20140618”之间的日期时间范围测试了这些公式在AdventureWorks2014数据库的[Production].[TransactionHistory]表上的应用。

这个范围的直方图步骤的统计如下:

直方图

根据公式,我计算了以下查询的基数:

SELECT COUNT(1)
FROM [AdventureWorks2014].[Production].[TransactionHistory]
WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000'
Run Code Online (Sandbox Code Playgroud)

使用以下代码进行计算:

  DECLARE @predStart DATETIME =  '20140615 00:00:00.000'
  DECLARE @predEnd DATETIME = '20140616 00:00:00.000'

  DECLARE @stepStart DATETIME = '20140614 00:00:00.000'
  DECLARE @stepEnd …
Run Code Online (Sandbox Code Playgroud)

sql-server query optimization sql-server-2014 cardinality-estimates

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

为什么不允许组拥有数据库?哪个用户应该拥有数据库?

根据微软“SQL Server 数据库的 ALTER AUTHORIZATION”:

对新主人的要求:

新的所有者委托人必须是以下之一:

  • SQL Server 身份验证登录。
  • 代表 Windows 用户(不是组)的 Windows 身份验证登录。
  • 通过代表 Windows 组的 Windows 身份验证登录进行身份验证的 Windows 用户。

显然一个组不能拥有一个数据库。确实调用

alter authorization on database::MyDatabase to [domainname\SQLServerAdminGroup]
Run Code Online (Sandbox Code Playgroud)

结果在消息中

数据库类型的实体不能由角色、组、approle 或映射到证书或非对称密钥的主体拥有。

例如,让 SQL 管理员的 Windows 安全组的单个成员成为数据库所有者似乎很容易受到该帐户被废弃的影响。在这个问题中,这似乎是所有者员工离开公司时发生的事情。 此答案将数据库所有权作为 NT 主要主体的问题总结如下:

将数据库所有权默认为 NT 主要主体会产生一个包含问题(所有者是由 AD 管理的 NT SID,并且不会随数据库文件一起移动,NT 帐户可能会被指纹等)。

我是 SQL Server 管理的新手,与例如文件的所有权相比,只有主要主体才能成为所有者的限制很突出。根据微软“如何分配和更改所有者”:

默认情况下,新对象的所有者是在附加到创建过程的访问令牌中标识为默认所有者的安全主体。...当用户是管理员组或域管理员组的成员时,会发生唯一的例外。在这两种情况下,用户访问令牌中的所有者字段包含组的 SID,而不是单个用户帐户的 SID。假设管理帐户仅用于管理系统,而不用于任何个人目的。因此,由一个管理员创建的对象可以由同一组中的其他管理员管理。

换句话说,

  • 对于管理员创建的文件,文件的默认所有者是组,而
  • 对于数据库,所有者不能是组。

这给我留下了以下问题:

  1. 数据库不能由次要主体拥有是否存在根本原因?
  2. 哪个主体应该拥有一个数据库?有最佳实践吗?如果是这样,该最佳实践背后的原因是什么?

sql-server windows permissions access-control

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

如何强制表列中的值匹配正则表达式“[axyto0-9\s]{0,2}[\s0-9]{0,10}”?

我有一张如下表

CREATE TABLE dbo.DemoTable
(
Value VARCHAR(12)
)
Run Code Online (Sandbox Code Playgroud)

我想限制它只包含Value匹配以下模式的行

[axyto0-9\s]{0,2}[\s0-9]{0,10}

  • 字符串的开始
  • 出现在下面列表中的单个字符在 0 到 2 次之间,尽可能多次
    • 列表“axyto”中的单个字符(区分大小写)
    • 介于“0”和“9”之间的字符
    • 一个“空白字符”
  • 匹配下面列表中出现的单个字符 0 到 10 次,尽可能多
    • 一个“空白字符”
    • 介于“0”和“9”之间的字符
  • 字符串结束

如何在 SQL Server 中执行此操作?(受 SO 上这个问题的启发)

sql-server regular-expression check-constraints

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

SQL Server 溢出级别 0 - 它是什么?

我被要求研究 SQL Server 2016 SP2 中查询的性能,我发现了一些我以前从未见过的东西:

<Warnings>
<SpillToTempDb SpillLevel="0" SpilledThreadCount="1" />
<ExchangeSpillDetails WritesToTempDb="237" />
</Warnings>
Run Code Online (Sandbox Code Playgroud)

有没有人有任何关于“溢出级别 0”的信息?

在每个人都将我发送到 lmgtfy.com 之前 - 我去过那里 :-) 并且在 Google 上实际上只有一个结果;并在该页面上提到了“溢出级别 0”,但没有其他信息。

我查看了我的 SQL Server 内部书籍、Bing.com 等。没有。

我的猜测是它与控制线程溢出或查询内死锁有关?查询本身非常基本;SELECT DISTINCT 有 3 个 INNER JOIN,然后是 2 个 LEFT。

任何线索将不胜感激。

请注意:查询性能已修复,但泄漏的谜团仍然存在。我不是在寻求帮助来改进这个查询——这就是为什么它没有包含在这里。我只是想了解一下溢出 0。

环境:SQL Server 2016 Ent。SP2(无 CU)。MAXDOP = 4 由 RG. 设置,SSMS v18.5

我还在计划中包含了这两个运营商的屏幕截图。

谢谢!

重新分区流

sql-server execution-plan sql-server-2016

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

不清楚更新冲突

我有两个问题:

1. 为什么在这种情况下会出现更新冲突而不是阻塞:

-- prepare
drop database if exists [TestSI];
go
create database [TestSI];
go
alter database [TestSI] set READ_COMMITTED_SNAPSHOT ON;
alter database [TestSI] set ALLOW_SNAPSHOT_ISOLATION ON;
go
use [TestSI];
go
drop table if exists dbo.call_test;
create table dbo.call_test ( Id bigint CONSTRAINT [PK_Call] PRIMARY KEY CLUSTERED ( [Id] ASC ), additional int, incl int );
create index ix_Call on dbo.call_test ( additional ) include( incl );
insert into dbo.call_test select 1, 2, 3;
go
Run Code Online (Sandbox Code Playgroud)

第一节:

use [TestSI];
go
set …
Run Code Online (Sandbox Code Playgroud)

sql-server database-internals locking snapshot-isolation sql-server-2016

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

在不停止查询的情况下断开网络连接

我有一个与断开网络连接会停止查询的相反问题吗?. 我想启动查询并断开连接而不等待结果,但我不希望查询停止。是否可以?

sql-server network

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

这是 SQL Server 的 ROLLBACK 文档中的错误吗?

这是SQL Server 的文档中讲的ROLLBACK语句。在该页面上,它声明其语法如下:

ROLLBACK { TRAN | TRANSACTION }   
     [ transaction_name | @tran_name_variable  
     | savepoint_name | @savepoint_variable ]   
[ ; ]  
Run Code Online (Sandbox Code Playgroud)

显然方括号内的内容是可选的,似乎您应该从TRAN或 中选择一个TRASACTION。但实际上,您可以完全省略两者,并且ROLLBACK是一个完全有效的语句。这是错误还是故意的?

sql-server documentation transaction rollback

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