我想循环遍历用户定义数据类型(ESRI 版本)中 SHAPE/GEOMETRY 列中的顶点ST_GEOMETRY。我已在 GIS SE 帖子中发布了详细信息:Update sde.st_geometry M value tocumulative distance (geometric length)
我认为这通常会在存储过程中完成(可能与sde.ST_GEOMETRY函数ST_NumPointsand结合使用ST_PointN)。但是,我没有CREATE PROCEDURE权限,所以无法创建存储过程。
作为创建存储过程的替代方法,是否有一种方法可以使用 SQL 语句来循环遍历顶点?
Oracle 12c (12.1.0.2.0)
我想在我的应用程序的“SystemSettings”表中添加一条记录,并使用 UPDATE 中的值设置 PK 值。PK 值来自“TS_LASTIDS”表,其中包含此应用程序 (MicroFocus SBM) 中每个表的最大 PK 值。我需要增加该表中的“TS_LASTID”列,并在将新记录插入“SystemSettings”表时使用新值作为 PK。
Insert Into
ts_SystemSettings ( ts_Id, ts_Name, ts_LongValue)
Values (
( -- ******************** This subquery updates the PK in TS_LASTIDS and outputs the new value
Update
ts_LastIds
Set
ts_LastId=ts_LastId+1
Output
INSERTED.ts_LastId
Where
ts_Name = 'SystemSettings'
) , -- ********************
'NSLastChangeId' ,
1 ,
) ;
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚语法。这是 MS SQL Server 2012。
我正在着手一个大型项目,并且对存储过程有一般的询问。
假设我有一张User桌子。
UserKey IDENTITY NOT NULL PRIMARY KEY
FirstName nvarchar(50)NOT NULL
LastName nvarchar(50) NOT NULL
Email nvarchar(50) NOT NULL
Birthdate date NULL
EffectiveFrom datetimeoffset NOT NULL
EffectiveThru datetimeoffset NULL
Run Code Online (Sandbox Code Playgroud)
实际上,这里还有更多的领域,但为了简洁起见,我已经将其简化为基础知识。
现在,我面临着创建存储过程以允许此表的基本 CRUD 功能的问题。
插入过程非常简单。
usp_INSERT_User:
CREATE PROCEDURE [dbo].[usp_INSERT_User]
(
--@UserKey BIGINT,
@FirstName NVARCHAR(50),
@LastName NVARCHAR(50),
@Email NVARCHAR(50),
@BirthDate DATE = NULL,
@EffectiveFromDtTm DATETIMEOFFSET(7),
@EffectiveThruDtTm DATETIMEOFFSET(7) = NULL,
)
Run Code Online (Sandbox Code Playgroud)
我的主要问题是我应该如何编写更新程序。
由于可以有非常细粒度的更新,我是否应该为每个细粒度更新创建一个更新存储过程?
例如,假设我只想在为用户处理完经过验证的电子邮件更新后更新用户的电子邮件,我会编写一个带有一个参数的 sproc 吗?
usp_UPDATE_UserEmail @NewEmail
如果用户更新了他们的个人资料,我可以编写一个 sproc,如:
usp_UPDATE_User @UserKey, @FirstName, @LastName, @Email, @Birthdate
因此,为了涵盖我最常见的更新操作,我最终可能会使用一些 sproc 来涵盖更新User …
是否可以编写一个UPDATE查询,如果它尝试更改的记录被另一个进程锁定(而不是等待锁被释放),则该查询将简单地退出?
我有一个进程应该更新表中的记录,有时这些记录会被锁定。更新这些记录是可取的,但不是必需的。如果记录正在使用中,我宁愿我的流程忘记更新并继续处理更重要的事情。
我当前的方法是将命令超时设置为 1 秒,但即使这也比我想要等待的时间长 - 正常更新需要不到一毫秒,因此等待一秒是一个主要开销。
我想更新表(我是 20-30 ),每个表都有数百万条记录。
问题是更新过程花费了太多时间,而且那时 CPU 使用率也很高。我想以一种在处理数据时不能使用太多 CPU 的方式来做。如果处理时间增加,那么这对我来说不是问题,但它应该使用有限的 CPU 资源来处理(更新)表。我使用 PostgreSQL 作为数据库,服务器操作系统是 Linux。
我的示例查询可以是这样的
UPDATE TEMP
SET CUSTOMERNAME =
( select customername from user where user.customerid = temp.customerid );
Run Code Online (Sandbox Code Playgroud) 我对乐观锁的理解是,它使用表中每条记录的时间戳来确定记录的“版本”,这样当记录被多个进程同时访问时,每个记录的版本都有一个引用.
然后,当执行更新时,更新时间戳。在提交更新之前,它会第二次读取记录上的时间戳。如果它拥有的时间戳(版本)不再是记录上的时间戳(因为它自第一次读取以来已被更新),则该过程必须重新读取整个记录并将更新应用于它的新版本。
因此,如果我所说的任何内容不正确,请首先为我澄清。但是,假设我在这里或多或少是正确的......
这实际上如何在 RDBMS 中体现出来?这是在应用程序逻辑(SQL 本身)中强制执行的第二次读取/验证还是 DBA 制定的调整参数/配置?
我想我想知道读取时间戳并在时间戳陈旧时执行第二次更新的逻辑来自哪里。所以我问:是应用程序开发人员强制执行乐观锁,还是由 DBA 强制执行?无论哪种方式,如何?提前致谢!
有时我的存储过程看起来像
create procedure handle_data
@fk int,
@value varchar(10)
as
begin
if exists (select * from my_table where id = @fk)
begin
update my_table
set value = @value
where id = @fk
end
else
begin
insert into my_table (fk, value)
select @fk, @value
end
end
Run Code Online (Sandbox Code Playgroud)
调用此存储过程的应用程序设计可能存在错误。
我应该避免制作执行相同存储过程和方法来插入新数据并更新旧数据的应用程序吗?
有没有更好的方法来以一种方法实现更新或插入数据?
我正在使用 SQL Server 2005 / 2008。
我有许多表,都包含属性aid,bid,cid和xid整数类型,其他属性可能不同。对于每个(给定)表T,我想根据aid,bid,cid升序和更新列对行进行排序xid,增量值从 0 开始。实现这一目标的最佳方法是什么?
我目前的解决方案包括:
TxidT_tempTT_temp到T由于这些表具有不同的模式,我编写了一半代码PL/pgSQL,一半代码使用 bash 脚本编写。
问题 1:任何评论如何让它在纯 PL/pgSQL 中编程?
问题 2:任何评论如何更优雅地实现?
我正在使用一个称为updated_at缓存失效的时间戳列。此处提供有关此特定技术的更多信息。
查询都具有相同的格式
UPDATE "managers" SET "updated_at" = '2014-07-25 15:00:24.212512' WHERE "managers"."id" = 1
问题是此列上的活动过多,导致写入缓慢。我假设减速是由锁定机制引起的。列上没有索引。
我们一直试图通过将可能导致多次更新的操作批处理来缓解这种情况,这确实有所帮助,但整个系统仍然受到影响。
我们实际上正在考虑将其移至 redis 并使用 INCR。
表“public.managers”
专栏 | 类型 | 修饰符
-------------------------+------------------------ -----+-------------------------------------------- -----------------
身份证 | 整数 | 非空默认 nextval('leads_managers_id_seq'::regclass)
account_id | 整数 |
created_at | 没有时区的时间戳 |
更新时间 | 没有时区的时间戳 |
通知_收件人| 文字 | 默认 ''::character 变化
用户名 | 字符变化(255) |
索引:
“leads_managers_pkey”主键,btree (id)
"index_leads_managers_on_uuid" UNIQUE, btree (uuid)
"index_leads_managers_on_account_id" btree (account_id)
我必须UPDATE在具有 50 万条记录的实时在线数据库上运行一条语句。我想知道哪个语句运行得更快:
Update Table set REC_ID = isnull(REC_ID,'')
Update Table set REC_ID = '' where REC_ID is null
Run Code Online (Sandbox Code Playgroud)
我正在使用 Microsoft SQL Server 2012
update ×10
postgresql ×4
locking ×3
insert ×2
sql-server ×2
concurrency ×1
null ×1
oracle ×1
performance ×1
rdbms ×1
scripting ×1
spatial ×1
t-sql ×1