当存储过程在任何时候从管理工作室运行良好时,我正在对这种情况进行故障排除,但即使对于相同的参数,相同的存储过程在其中一个网络服务器中运行得非常糟糕。可能有一些原因导致这种情况,包括阻塞等。
我想排除使用不同 SET 选项创建 2 个不同计划的可能性,并且这些计划中至少有一个使用产生错误计划的参数组合进行了优化。
引用本杰明·内瓦雷斯:
“一般来说,查询优化是一个代价高昂的操作,为了避免这种优化成本,计划缓存会尽量将生成的执行计划保存在内存中,以便它们可以被重用。但是,如果一个新的连接运行相同的存储过程有不同的SET选项,它可能会生成一个新的计划……”
为了解决这个问题,我想要一个 T-SQL 查询,它会显示为会话设置的所有值。
这可能吗?
以下 SET 选项将影响执行计划的重用:
(他们中的一些)
DATEFORMAT
LANGUAGE
NUMERIC_ROUNDABORT
FORCEPLAN
performance sql-server optimization plan-cache sql-server-2014 query-performance
我有很多情况需要将带有许多小数位的大浮点数转换为带有 2、1 或根本没有小数位的四舍五入数字。
我一直在这样做的方式如下所示:
declare @t table ( [rows] float )
insert into @t
select 1.344
union all select 32.3577
union all select 65.345
union all select 12.568
union all select 12.4333
select * from @t
Run Code Online (Sandbox Code Playgroud)
现在我将进行转换并将它们全部保存到临时表中,然后我们将查看临时表的结构。
begin try
drop table #radhe
end try
begin catch
end catch
select
[Rows Formated] = REPLACE(CONVERT(VARCHAR(50),CAST(sp.[Rows] AS MONEY),1), '.00','')
into #radhe
from @t sp
select *
from #radhe
Run Code Online (Sandbox Code Playgroud)
一切都很好,效果很好,它做了我想要的,但是,当我查看表的结构时,我得到以下信息:
use tempdb
go
sp_help '#radhe'
Run Code Online (Sandbox Code Playgroud)
您可以在图片上看到 varchar(8000)。我们可以避免吗?
我会很高兴使用 varchar(50)
sql-server varchar type-conversion floating-point sql-server-2014
在我现在的环境中,我有很多存储过程的实例,就像下图所示的那样,将一堆参数传递给过程,然后在过程select exists中运行a ,并根据结果运行不同的逻辑路径在存储过程中。
我对以下程序有几个问题:
1)它是参数嗅探的好选择吗?
2)我怎么能option(recompile)在代码中添加?
在代码中添加选项(重新编译)与使用重新编译创建存储过程之间存在差异。
option(recompile)如果可能的话,我会更热衷于。
ALTER PROCEDURE [dbo].[usp_upd_activity]
@activityId INT,
@title VARCHAR(100),
@description VARCHAR(MAX),
@inclusions VARCHAR(MAX),
@locationId INT,
@imageUriMain VARCHAR(255),
@uploadToBucket VARCHAR(200),
@path VARCHAR(200)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRAN
BEGIN TRY
DECLARE @documentId INT
IF NOT EXISTS (SELECT 1
FROM document
WHERE activityId = @activityId)
BEGIN
INSERT INTO document
( [uploadToBucket], [path], [activityId])
VALUES (@uploadToBucket, @path, @activityId)
SET @documentId = SCOPE_IDENTITY();
END
ELSE
BEGIN
UPDATE document
SET uploadToBucket = @uploadToBucket, …Run Code Online (Sandbox Code Playgroud) sql-server stored-procedures optimization sql-server-2016 parameter-sniffing
当我们向现有表中添加新列时,正确的方法是什么?
例如,我已经有像 Foo1、Foo2、Bar1、Bar2 这样的列。现在我想添加一个名为 Foo3 的新列。
当我想添加具有相似名称的列时,标准方法是什么(如果是这样的话)?
我看到 2 个选择:
为了获得一些参考,我们正在使用数据库项目来控制数据库更改,并为应用程序开发人员提供更好的 GUI 以进行数据库更改。我们使用某种 ORM 与数据库交互,因此没有人使用数据库对象名称查询数据库。
更新: 我在一些现有列上有几个索引。但是名称相似的列(包括我想添加的列)不属于任何索引。
我遇到了这个存储过程的问题。当用户选择“是”时,它应该按照它在“是”的 if 语句中所说的那样做,但它什么也不做,也不向数据库中插入任何内容。它适用于“否”条件。你能告诉我什么不起作用吗?
ALTER PROCEDURE [dbo].[sp_ff_Insert_ProjectApproved]
(
@project_no varchar(6)
,@sequence_no int
,@grant_programme varchar(2)
,@jobs_approved int
,@grant_amount int
,@Committee varchar(4)
,@Meeting_no int
,@Minute_Item int
,@jobs_maintained int
,@approval_date date
,@approval_by int
,@comments varchar(1600)
,@created_by int
,@created_date datetime
,@updated_by int
,@updated_date datetime
,@approval varchar(5)
,@ratify varchar(3)
--,@research_type varchar(1)='T'
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
DECLARE @ReturnValue int,
@post_approval_status varchar(3),
@approval_status varchar(3),
@current_status varchar(3)
set @current_status = ( SELECT approval_status from approval_master_tbl
WHERE project_no = @project_no …Run Code Online (Sandbox Code Playgroud) sql-server ×5
optimization ×2
index ×1
null ×1
performance ×1
plan-cache ×1
t-sql ×1
table ×1
varchar ×1