标签: sql-server

Sargability 问题 - 变量的顺序

我有一个有几行的存储过程:

AND ( @StartDate IS NULL OR @StartDate <= r.ReferralDate )
AND ( @EndDate IS NULL OR @EndDate >= r.ReferralDate )
Run Code Online (Sandbox Code Playgroud)

是否应该改写为:

AND ( r.ReferralDate >= @StartDate or @Startdate IS NULL  )
AND ( r.ReferralDate <= @EndDate or @EndDate IS NULL )
Run Code Online (Sandbox Code Playgroud)

我尝试了两种方法并查看执行计划。估计的行数略有不同,但除此之外我没有看到任何变化,所以我认为语句中的顺序无关紧要,但希望有人可以验证。

performance sql-server t-sql query-performance

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

如何从关系数据库中删除行

所以我有两个表的数据库。并且它们之间有外键关系。我想做一些测试,但桌子太大了。我想删除这些表中的大部分数据,只在第一个表中保留大约 500 行,在第二个表中保留相关行,这样测试会更快。我怎样才能做到这一点?

数据库结构: 在此处输入图片说明

sql-server delete

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

sp_Blitz 脚本输出

我是我公司的一名非常专业的 DBA,并运行了 sp_Blitz 脚本(在我们的一个测试数据库上,它是我们生产数据库的精确副本),我只收到消息“命令成功完成。”。

我没有得到更详细的输出有什么原因吗?还是输出文件写在其他地方?

sql-server sp-blitz

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

获取包含 INSERT 的存储过程的“列表”,而无需命名所涉及的列

作为某些增强功能的一部分,750 多个表中添加了一个新列。现在我的问题是在将近 3000 多个存储过程中,一些旧的 INSERT 没有命名列。

有什么办法可以得到所有没有列名插入的存储过程的“列表”?

我试过了:

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE definition LIKE '%insert into%' 
AND definition NOT LIKE '%) value%'
AND definition NOT LIKE '%)%' + CHAR(10) + '%value%'
AND definition NOT LIKE '%)%' + CHAR(13) + '%value%'
AND definition LIKE '%value%' 
Run Code Online (Sandbox Code Playgroud)

但它仍然错过了很多。

PS - 上面的查询也返回 Insert Into (ColumnNames) SELECT 场景,这是我不想要的。

sql-server stored-procedures t-sql sql-server-2016

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

开发版与标准版

使用 Developer Edition 和 Live with Standard Edition 的开发环境是否危险,二进制文件是否不同?

sql-server standard-edition

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

我可以使用`WITH(NOLOCK)`来防止死锁吗?

我只有一张桌子InsertDelete而且Select(没有Update

在插入时,有时使用会话锁 ( WITH (TABLOCKX))

我有一个使用 ADO 的程序,它Select从表中使用RecordSet::Open命令打开一个简单的顺序查询。

喜欢:

Select * from t1 where id >= @from_id And >= @to_id`  
Run Code Online (Sandbox Code Playgroud)

或者:

Select top(10) * from t1 where id >= @id Order by id 
Run Code Online (Sandbox Code Playgroud)

id 列是一Identity列。

当我打开查询时,有时会陷入僵局。(表被Insert查询锁定,id 列的索引被 锁定Select

我正在努力防止僵局。

我应该打开选择查询WITH(NOLOCK)吗?它可以防止死锁吗?

sql-server deadlock nolock

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

如何使用 SQL Profiler 捕获单个存储过程

使用 SQL Server SQL Profiler,可以使用哪些配置来监视单个存储过程?我想捕获所有EXEC sprocName以包含参数列表。我想捕获这个过程,以便我可以使用真实的参数数据对其进行负载测试。

我在新的 SQL Profiler 跟踪中尝试了以下操作:

Events Selection > Column Filters > Text Data > LIKE: 'exec sprocName%'
Events Selection > Column Filters > Text Data > LIKE: 'exec sprocName'
Run Code Online (Sandbox Code Playgroud)

上述配置均未捕获我的程序。我还尝试使用以下配置删除过程名称:

Events Selection > Column Filters > Text Data > LIKE: 'exec%'
Events Selection > Column Filters > Text Data > LIKE: 'exec'
Run Code Online (Sandbox Code Playgroud)

以上配置不捕获任何程序。

最后,我尝试在没有任何列过滤器的情况下执行相同的配置文件,我可以确认它捕获了发送到 SQL Server 的所有 SQL 查询。

我已经考虑了一种解决方法,即使用 SQL 查询或 Excel Power Query 捕获所有存储过程执行和后过滤到我感兴趣的 sproc。但是,在我想要建模的环境中执行 sproc 的频率很高,这使得这不可行。

sql-server profiler sql-server-2012

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

优化查询,仅在返回行数小于一定数量时才返回

我有一个查询,它首先计算要返回的行数,如果它低于限制,则返回这些行,否则不返回任何内容。

对于上下文:我有一张地图,仅在某个缩放级别后才显示一些点。但是,我的用户现在希望地图只要屏幕上有空间就显示点,而不是具有预定义的最小缩放级别。这意味着现在每当他们在地图上移动时,我都会有两个查询,而不是一个:一个是知道有多少项目,另一个是实际返回它们。负载可能会翻倍。我想过这样做:

SELECT p.ACOLUMN, p.ANOTHERCOLUMN, p.LATITUDE, p.LONGITUDE 
FROM table p 
where p.LATITUDE < @latMax)
and p.LATITUDE > @latMin) 
and p.LONGITUDE < @lngMax)
and p.LONGITUDE > @lngMin)
and (SELECT count(*) 
FROM table
where LATITUDE < @latMax
and LATITUDE > @latMin
and LONGITUDE < @lngMax
and LONGITUDE > @lngMin)) < 200 -- example limit value
Run Code Online (Sandbox Code Playgroud)

查看实际执行计划,我看到 SQL Server 2017 在同一个索引上搜索了两次:

实际执行计划显示相同的非聚集索引查找发生两次

它当然也在两个搜索中读取相同数量的行。有没有办法删除那些重复的搜索?或者是否有另一种更理想的方式来做我正在尝试的事情?

sql-server sql-server-2017

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

我们如何知道 SQL Server 中安装的 SQL Replication 组件

有人可以让我知道我们如何识别 SQL 服务器中是否安装了复制组件。

试过如下:

1.我们之前更改了服务器名称,因此在检查配置分发服务器和发布时给出以下警告。

标题:配置分发向导

SQL Server 无法连接到服务器“xxxxxxxx”。

附加信息:

SQL Server 复制需要实际的服务器名称才能连接到服务器。指定实际的服务器名称“zzzzzzzzz”。(复制。实用程序)


我将重命名服务器。

  1. 在尝试配置订阅时给出以下警告。

标题:新订阅向导

 

Microsoft SQL Server Management Studio 无法访问复制组件,因为此 SQL Server 实例上未安装复制。有关安装复制的信息,请参阅 SQL Server 联机丛书中的安装复制主题。

附加信息:  

此服务器上未安装复制组件。再次运行 SQL Server 安装程序并选择安装复制的选项。(Microsoft SQL Server,错误:21028)

现在,请建议 SQL 实例中是否安装了 Replication 组件

replication sql-server

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

解释有关 SQL Server 与 MySQL 中过滤的声明

我的公司正在进行 IT 大修,并考虑从 MS SQL Server(2016 标准版)转移到 MySQL 数据库(版本 5.6.10)。我已经使用 MS SQL Server 多年了,所以我很担心做出这个举动。基本上 - 我们的 IT 团队认为 MySQL 是免费的,并且只进行了一些语法更改。

我花了一天的时间阅读这些差异,老实说发现它们似乎非常相似。如果我要为 MS SQL Server 做一个案例 - 那么现在是时候去做了。一个关键细节——我们是一家分析公司,我们的 SQL 查询通常很复杂——所以我需要确保我们未来的 RDBMS 达到标准。

我多次遇到以下语句(关于过滤),我需要翻译。我对此的解释是,不可能使用单个查询来连接来自不同数据库的表。但是我看过 YouTube 视频,人们在 MySQL 中就是这样做的。请帮助我理解这种差异以及它是否重要。

MySQL 允许用户以多种方式过滤表、行和用户。但它需要用户按单个数据库过滤表、行或用户。在过滤数据时,开发人员必须通过运行多个查询来单独过滤数据库表。另一方面,SQL Server 使开发人员能够利用基于行的筛选。基于行的过滤选项按数据库方式过滤数据库上的数据。此外,过滤后的数据存储在单独的分发数据库中。因此,程序员在不考虑数据库数量的情况下过滤多行变得更加容易。

- MySQL 与 MS SQL Server 之间的比较

非常感谢您帮助破译引用的声明以及您看到的此举动的任何优点/缺点。谢谢!

mysql sql-server sql-server-2016

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