我有一个存储过程,它作为报告数据库每晚刷新的一部分运行,大约需要 2 个小时才能完成。该对象B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP_T2有 800 万行。您能否建议我如何将此光标转换为基于集合的方法以获得更好的性能?可以使用 CTE 吗?
ALTER PROCEDURE [dbo].[B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP2_SP] AS
SET NOCOUNT ON
DECLARE @SEQ SMALLINT,
@CASEID DECIMAL,
@ASSIGNED NCHAR(30),
@AUDITSTAMP DATETIME,
@AUDITOPRID NCHAR(60),
@STATUS NCHAR(10),
@LASTCASEID DECIMAL,
@PROVGRPID NCHAR(20)
SET @SEQ = 1
SET @LASTCASEID = @CASEID
DROP TABLE B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP
CREATE TABLE B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP (
SEQ_NUM SMALLINT,
CASE_ID DECIMAL,
ASSIGNED_TO NCHAR(30),
AUDIT_STAMP DATETIME,
AUDIT_OPRID NCHAR(60),
RC_STATUS NCHAR(10),
PROVIDER_GRP_ID NCHAR(20) )
DECLARE AUDIT CURSOR FOR
SELECT CASE_ID, ASSIGNED_TO, AUDIT_STAMP, AUDIT_OPRID, RC_STATUS, PROVIDER_GRP_ID
FROM B_RPT_RC_AUDIT_ASSIGNED_TO_TEMP_T2
-- Open the cursor …Run Code Online (Sandbox Code Playgroud) 我一直在做一些关于SELECT从这个更新中删除关键字的测试:
Update #tmpDriverTime
Set WorkDay2 = (Select IsNull(Sum(PyblHrs),0)
From spr_DriverTimeEntry
Where spr_DriverTimeEntry.DrvrID = #tmpDriverTime.EmployeeNo
And Convert(Varchar(12),dtwrkd,112) = Convert(Varchar(12),@StartDate_1,112))
Run Code Online (Sandbox Code Playgroud)
从我所做的测试来看,无论是否有SELECT关键字,都返回了相同的数据。我由我们的 DBA 运行代码以获得他删除SELECT语句的批准,他说我不能,因为删除SELECT语句会导致更新以不同的方式工作,但他无法阐明它的工作方式有何不同。我已经对新的进行了一些搜索,并找到了一些 MSDN 页面,他们在其中运行UPDATE FROM没有SELECT关键字的命令。所以现在我很困惑,我在 MSDN 上找到的测试和其他示例说我可以删除SELECT关键字,但我的 DBA 说不。删除SELECT关键字是否会影响UPDATE FROM工作方式,如果会,它会如何影响它?
为什么一个有效而另一个无效?
SELECT REPLACE(N'IA?I' ,N'?','x') -- doesn't match (returns 'IA?I')
SELECT REPLACE('IA?I' ,'?','x') -- works (returns 'IAxI')
Run Code Online (Sandbox Code Playgroud)
我的猜测是在第二个示例中 SQL Server 会看到 '?' 作为 2 个字符 (0x19 02) 并且不做一些破坏多字节匹配的整理优化。
应该怎么做才能使多字节示例工作?
SELECT *
FROM SameLogTable
WHERE ID_Table IN (SELECT ID_Table-1
FROM SameLogTable
WHERE <SameCondition>) OR
ID_Table IN (SELECT ID_Table
FROM SameLogTable
WHERE <SameCondition>) OR
ID_Table IN (SELECT ID_Table+1
FROM SameLogTable
WHERE <SameCondition>)
Run Code Online (Sandbox Code Playgroud)
此查询在日志记录表上运行,我想选择特定事件,以及这些事件之前和之后的事件。这个解决方案感觉丑陋且效率低下,为此编写更好的方法是什么?
示例:如果我对 LogTable 的 ID 为 4 和 23 的行感兴趣,我想得到以下结果:
ID Column1 Column2 ...
3 ... ...
4 ... ...
5 ... ...
22 ... ...
23 ... ...
24 ... ...
Run Code Online (Sandbox Code Playgroud)
这些都是来自同一 LogTable 的所有行,除了我使用 WHERE 指定第 4 行和第 23 行,并且我希望 Select 自动返回第 3,5 行(第 4 行)和第 22、24 行(第 …
在 SQL Sever 中更新时,我的理解是删除整行然后重新创建(这就是您获得新时间戳的原因)。那么,如果您更新 1 个字段或 500 个字段,更新的性能是否会发生变化?
我怀疑如果有索引列,因为它必须更新索引,服务器会执行更多的“工作”。回答时,假设没有触发器。
我有以下查询,我需要修改它,以便originDocForCurrency.id = 68如果没有匹配的commission.referenzid = 68. 我尝试了RIGHT OUTER JOIN ON commission.referenzid = originDocForCurrency.id,但它不会给出结果,如果没有找到commission.referenzid = 68.
SELECT
commission.netto AS commissionNetValue,
commission.r_art AS commissionDocClass,
commission.waehrung AS commissionCurrency,
currencies.usd_brief AS foreignCurrencyUSDAsk,
currencies.usd_geld AS foreignCurrencyUSDBid,
originDocForCurrency.r_art AS originDocForCurrencyDocClass,
originDocForCurrency.poswert AS originDocForCurrencyCommission,
(SELECT originDoc.poswert FROM [src_boss_entwicklung].[dbo].[tckopf] AS originDoc WHERE originDoc.id = 68) AS originDocCommission,
(SELECT originDoc.r_art FROM [src_boss_entwicklung].[dbo].[tckopf] AS originDoc WHERE originDoc.id = 68) AS originDocClass,
(SELECT originDoc.waehrung FROM [src_boss_entwicklung].[dbo].[tckopf] AS originDoc WHERE originDoc.id = 68) AS originDocCurrency …Run Code Online (Sandbox Code Playgroud) 我们在表 Tbl 中有一个聚集索引,顺序为 A、B、C。编写一个查询是否有意义
WHERE A = @a, B = @b, C = @c
Run Code Online (Sandbox Code Playgroud)
或者它会和
WHERE C = @c, B = @b, A = @a
Run Code Online (Sandbox Code Playgroud)
查询顺序对聚集索引有意义吗?
performance sql-server clustered-index t-sql query-performance
我有一个表,其中每一行都有如下数据:
0150566115,"HEALTH 401K","IC,ON","ICON HEALTH 401K",,,1,08/21/2014
Run Code Online (Sandbox Code Playgroud)
我想要的是删除,包含在双引号“”之间的每个逗号 ( )。然后用逗号 ( ,)分割字符串的其余部分
我不想检查双引号开始和结束的每个字符设置标志。
我可以实现某种正则表达式吗?
有没有简单的方法?
到目前为止,我所尝试的只是根据逗号 ( ,)拆分字符串,但它也在拆分引号内的值。
这是为了达到目的:如何在完整的表中实现这一点(目前,如果我只有一个双引号块实例,它就可以工作)?
Declare @Query nvarchar(max)
Set @Query = 'Item1,Item2,"Item,Demo,3",New'
Declare @start int, @len int
SELECT @start = PATINDEX('%"%"%', @Query) + 1
print @start
select @len = CHARINDEX('"', SUBSTRING(@Query, @start, LEN(@Query))) - 1
select
SUBSTRING(@Query, 1, @start - 2) +
REPLACE((SUBSTRING(@Query, @start, @len)), ',', '') +
SUBSTRING(@Query, @start + @len + 1, LEN(@Query))
Run Code Online (Sandbox Code Playgroud)
这是我用来分割的函数
ALTER FUNCTION [dbo].[fnSplit](
@sInputList VARCHAR(8000) -- List of …Run Code Online (Sandbox Code Playgroud) 我一直在努力使这个查询更有效地工作。
我发现 where 子句中 Or 的数量是这个查询中最大的问题。此查询位于存储过程中。
我到了我能想到的唯一选择的地步。:
我相信其他人以前也遇到过这个问题。查询性能在大约一秒或更短的时间内开始并不可怕,但在某些情况下,它被多次命中,导致长达 5 或 6 秒的延迟。
查询如下。:
DECLARE @PERSON_ID AS INT
DECLARE @ITEM_ID AS INT
DECLARE @ITEM_VERSION AS INT
DECLARE @ITEM_SUB_NAME AS VARCHAR(250)
DECLARE @ITEM_SUB_SUB_NAME AS VARCHAR(250)
--DEFAULTS
SET @PERSON_ID = 0
SET @ITEM_ID = 0
SET @ITEM_VERSION = 1
SET @ITEM_SUB_NAME = NULL
SET @ITEM_SUB_SUB_NAME = NULL
SELECT ID, PERSON_ID,
ISNULL(ITEM_VERSION, 1) AS ITEM_VERSION,
ISNULL(ITEM_SUB_NAME, '') AS 'ITEM_SUB_NAME',
ISNULL(ITEM_SUB_SUB_NAME, '') AS 'ITEM_SUB_SUB_NAME',
ISNULL(ITEM_DATE, '1/1/1900') AS …Run Code Online (Sandbox Code Playgroud)