我的示例数据库(实际上是 CTE 语句数据)如下所示:
eventdate val
2012-03-23 3965
2012-03-26 3979
2012-03-27 3974
2012-03-28 3965
2012-03-29 3967
2012-03-30 3959
2012-04-02 3951
2012-04-03 3961
2012-04-04 3944
2012-04-05 3935
2012-04-09 3901
2012-04-10 3822
Run Code Online (Sandbox Code Playgroud)
我想删除差异小于 12 的值。这是我的查询和输出:
SELECT
eventdate,
CASE
WHEN ABS(val - LAG(val) OVER (ORDER BY eventdate)) <= 12
THEN NULL
ELSE val
END AS val
FROM tbl_1
ORDER BY eventdate
Run Code Online (Sandbox Code Playgroud)
输出:
eventdate val
2012-03-23 3965
2012-03-26 3979
2012-03-27 NULL
2012-03-28 NULL
2012-03-29 NULL
2012-03-30 NULL
2012-04-02 NULL
2012-04-03 NULL
2012-04-04 3944
2012-04-05 NULL …Run Code Online (Sandbox Code Playgroud) 我必须选择传递给光标的给定字符串(用逗号分隔的值)。可以有多个值可以通过单个变量传递。我的代码有点像:
CURSOR My_Cursor( vsStr1 )
IS
SELECT some_field
FROM some_table
WHERE txtfield1 IN ( vsStr1 ); --this field is varchar2 type
vsStr1 varchar2(100) := '01, 25, 80, 100';
Run Code Online (Sandbox Code Playgroud)
如何传递该变量正确性?任何帮助,将不胜感激。
我有一个使用 ODBC 访问 SQL Server 2012 数据库的应用程序,SQLSetStmtAttr用于将SQL_SOPT_SS_CURSOR_OPTIONS选项设置为SQL_CO_FFO. 这意味着它从数据库中读取的内容由快速只进游标支持。
这在大多数情况下是可以的,但是有时快速只进游标的性能明显低于“通常”静态游标(我们将使用 default 获得的游标SQL_CO_OFF)。
问题:有没有办法强制 SQL Server 不使用快进游标?
显然,正确的方法是更改应用程序,并且该过程正在进行中,但这需要时间,同时我正在寻找临时解决方法。
到目前为止,我唯一的想法是使用它:(来自Fast Forward-only Cursors)
Fast Forward-only 游标的隐式转换
在以下情况下,仅快进游标会隐式转换为其他游标类型:
- 如果 SELECT 语句将一个或多个表与触发器表(INSERTED/DELETED)连接起来,则游标将转换为静态游标
但是,即使是临时解决方法,这似乎也有点难看。可能有更好的方法吗?
旁注:在这种情况下,仅快速向前游标表现不佳的主要原因是它们不支持并行性。
对于非快进sys.dm_exec_cursors给我:
API | 快照 | 只读 | 全球 (0)
而快进选项是:
API | 快进| 只读 | 全球 (0)
快照选项比快进选项快 5 倍。如果我查看它们的查询计划,除了DegreeOfParallelism之外,它们没有太大不同。快照是 16 而快进是 0。问题是我们正在从视图中读取(我们没有太多控制权),而这些视图在其设计中是次优的。
我在 SQL Server 中有程序可以打印给定国家/地区的所有玩家。我尝试将其转换为 plpgsql,但出现错误。
CREATE PROCEDURE kraj_pilkarze @kraj varchar(30)
AS
DECLARE @idkraj INT
DECLARE @nazwa_zespolu varchar(30)
SELECT @idkraj = id_kraj FROM kraj WHERE @kraj=nazwa
DECLARE kursor_pilk CURSOR
FOR SELECT imie,nazwisko, id_zespol, id_kraj FROM pilkarz
DECLARE @imie varchar(20), @nazwisko varchar(30), @zespol int, @d_kraj int
OPEN kursor_pilk
FETCH NEXT FROM kursor_pilk INTO @imie, @nazwisko,@zespol, @d_kraj
WHILE @@FETCH_STATUS=0
BEGIN
IF @d_kraj=@idkraj
BEGIN
SELECT @nazwa_zespolu = nazwa FROM zespol WHERE @zespol=id_zespol
PRINT @imie+' '+@nazwisko+', '+@nazwa_zespolu
FETCH NEXT FROM kursor_pilk INTO …Run Code Online (Sandbox Code Playgroud) 如果我直接在 SQL Server Management Studio 中执行我的(简单)查询...
SELECT auftrag_prod_soll.ID
FROM auftrag_prod_soll
WHERE auftrag_prod_soll.auftrag_produktion = 51621
AND auftrag_prod_soll.prod_soll_über = 539363
ORDER BY auftrag_prod_soll.reihenfolge
Run Code Online (Sandbox Code Playgroud)
......一切都很好,很快......
Table 'auftrag_prod_soll'. Scan count 2, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 102 ms.
Run Code Online (Sandbox Code Playgroud)
...因为 SQL Server 会根据两个过滤条件选择合理的执行计划:
另一方面,如果我的应用程序使用游标执行相同的查询......
declare @p1 int
declare @p3 int
set @p3=4
declare @p4 int
set @p4=1 …Run Code Online (Sandbox Code Playgroud) performance sql-server execution-plan cursors query-performance
我正在尝试跨多个数据库运行如下查询
select ParamValue from Table1 where paramname = 'SYSTEM_LICENSE'
Run Code Online (Sandbox Code Playgroud)
每个 DB 的名称类似于下面的名称,并且应排除某些 DB。
“客户_123”
我查看了使用 sp_MSforeachdb,但它不受支持并且运行不佳。我试图弄清楚如何编写游标,但没有成功。在这一点上,只是寻求可以真正写出我想要做的事情的人的帮助。
我正在尝试写一个游标。我创建了一个表,用于从 sys.dm_exec_sessions 捕获登录名和时间。现在,我需要编写一个游标,以便在登录名已存在的情况下将登录时间更新为上次登录时间,并在表中不存在登录名的情况下插入一行。我想出了以下方法,但不幸的是,我收到一个错误,子查询返回多个值。有任何想法吗???
declare @log as varchar(200)
declare @log_time as datetime
declare LoginsSize cursor for
SELECT login_name, login_time
FROM sys.dm_exec_sessions
open LoginsSize
fetch next from LoginsSize into @log, @log_time
while( @@fetch_status = 0)
begin
If (Select Login from [dbo].[LoginsForDBUserList]) = @log
Begin
UPDATE [dbo].[LoginsForDBUserList]
SET LastLoginTime = @log_time
WHERE [login]= @log
END
Else
Begin
Insert Into [dbo].[LoginsForDBUserList]
SELECT login_name, login_time
FROM sys.dm_exec_sessions
END
fetch next from LoginsSize into @log, @log_time
close LoginsSize
deallocate LoginsSize
end
Run Code Online (Sandbox Code Playgroud) 我有以下脚本,该脚本在循环的第二次迭代中保持不变。
BEGIN
BEGIN TRY
BEGIN TRANSACTION
DECLARE @itemID int
DECLARE LoopCursor CURSOR FOR
SELECT DISTINCT i.ItemID
FROM Inventory i
INNER JOIN Items it ON i.ItemID = it.ItemID
WHERE i.ItemID IN (226, 231, 232, 233, 234, 235, 245, 247 ,249 ,250 ,253 ,254 ,255 ,257 ,258 ,268 ,270 ,271 ,273 ,286 ,287 ,291 ,293 ,299 ,303 ,304,
305, 306, 307, 308, 310, 311, 312, 313, 314, 316, 322, 323, 324, 331, 332, 333, 334, 335, 338, 339, 340, 341, 342, 343, …Run Code Online (Sandbox Code Playgroud) 我仍然是查询优化的新手,我有一个存储过程,它使用游标遍历表中的每一行,并执行以下操作:
我尝试将此 Cursor 转换为 WHILE 循环,但性能下降。所以我需要帮助将其转换为SET BASED方法而不是Procedural Based方法
所以 Cursor 执行这个逻辑:
-- READ Current Row into Cursor Variables
FETCH NEXT FROM crAssetIgnitionOnOff INTO
@current_iVehicleMonitoringID
, @current_iAssetID
, @current_dtUTCDateTime
, @current_sptGeoLocationPoint
, @current_fLatitude
, @current_fLongitude
, @current_fAngle
, @current_fSpeedKPH
, @current_sIgnitionStatus
, @current_eEventCode
, @current_sEventCode
IF(@current_iAssetID = @prev_iAssetID)
BEGIN
---- Calculate Time Difference from previous Point
DECLARE @diffInSeconds INT
SET @diffInSeconds = DATEDIFF(SECOND, @prev_dtUTCDateTime, @current_dtUTCDateTime) …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization cursors sql-server-2012 query-performance
我试图理解为什么使用 Cursosr 或者它们是如何工作的(我是新手)。
我真的没有找到使用它的明确目的。
它与触发器相比如何?
cursors ×10
sql-server ×7
performance ×2
t-sql ×2
functions ×1
mariadb ×1
mysql ×1
optimization ×1
oracle ×1
plpgsql ×1
plsql ×1
postgresql ×1
recursive ×1
trigger ×1