AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-3802

Matthew's questions

Martin Hope
Matthew
Asked: 2016-12-14 16:44:33 +0800 CST

与有条件的 INSERT 和 SELECT 相比,带有 OUTPUT 的 MERGE 是更好的做法吗?

  • 12

我们经常会遇到“如果不存在,就插入”的情况。Dan Guzman 的博客对如何使这个进程线程安全进行了出色的调查。

我有一个基本表,它只是将字符串从SEQUENCE. 在存储过程中,我需要获取值的整数键(如果存在),或者INSERT获取结果值。列上有唯一性约束,dbo.NameLookup.ItemName因此数据完整性没有风险,但我不想遇到异常。

这不是IDENTITY我无法得到的,在某些情况下SCOPE_IDENTITY价值可能是。NULL

在我的情况下,我只需要处理INSERT桌子上的安全问题,所以我试图决定这样使用是否更好MERGE:

SET NOCOUNT, XACT_ABORT ON;

DECLARE @vValueId INT 
DECLARE @inserted AS TABLE (Id INT NOT NULL)

MERGE 
    dbo.NameLookup WITH (HOLDLOCK) AS f 
USING 
    (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item
        ON f.ItemName= new_item.val
WHEN MATCHED THEN
    UPDATE SET @vValueId = f.Id
WHEN NOT MATCHED BY TARGET THEN
    INSERT
      (ItemName)
    VALUES
      (@vName)
OUTPUT inserted.Id AS Id INTO @inserted;
SELECT @vValueId = s.Id FROM @inserted AS s

我可以在不使用MERGE条件的情况下执行此操作,INSERT然后使用SELECT 我认为第二种方法对读者来说更清楚,但我不相信这是“更好”的做法

SET NOCOUNT, XACT_ABORT ON;

INSERT INTO 
    dbo.NameLookup (ItemName)
SELECT
    @vName
WHERE
    NOT EXISTS (SELECT * FROM dbo.NameLookup AS t WHERE @vName IS NOT NULL AND LEN(@vName) > 0 AND t.ItemName = @vName)

DECLARE @vValueId int;
SELECT @vValueId = i.Id FROM dbo.NameLookup AS i WHERE i.ItemName = @vName

或者也许还有另一种我没有考虑过的更好的方法

我确实搜索并参考了其他问题。这个:https ://stackoverflow.com/questions/5288283/sql-server-insert-if-not-exists-best-practice是我能找到的最合适的,但似乎不太适用于我的用例。IF NOT EXISTS() THEN我认为不可接受的方法的其他问题。

sql-server t-sql
  • 2 个回答
  • 5247 Views
Martin Hope
Matthew
Asked: 2016-04-13 19:38:47 +0800 CST

SYSUTCDATETIME 是安全的主键吗?

  • 4

我有一个连续修改的已处理事件表。处理时间的 utc 时间和 eventId。

使用 SYSUTCDATETIME() 作为我的主键是否安全?我可以轻松地使用代理键,但感觉很有趣。

sql-server sql-server-2014
  • 1 个回答
  • 795 Views
Martin Hope
Matthew
Asked: 2014-09-05 18:39:03 +0800 CST

插入到临时表并重命名与仅添加/删除列的优点

  • 1

如果我在 SQL Server 表中添加或删除列,我认为我会出现页面拆分或空白。由于行的大小已更改。

当我使用 RedGate SQL Compare 创建转换脚本时,它的策略是创建一个临时表,将所有数据复制到该表中,删除旧表,然后重命名临时表。

我假设这会清理页面,因为所有行都是“完美”顺序插入的。

我最近有一位 DBA 告诉我,这种“复制并重命名”的方法效率低下、成本高昂且没有必要。

这两种方法的优点是什么?

sql-server-2008 best-practices
  • 2 个回答
  • 1193 Views
Martin Hope
Matthew
Asked: 2014-06-17 15:20:18 +0800 CST

我应该在映射表中使用代理键吗?

  • 1

我正在部署一个连接Items到的映射表ItemGroups

尽管 anItem只会出现在单个中,但ItemGroup请先接受先验Items,但在我的用例中,将列附加到表中是不合适的。

因此,将创建一个包含两列的表:

ItemId INT NOT NULL
ItemGroupId INT NOT NULL

为这张表制作 CI 和 PK 很诱人ItemId……但这合适吗?我认为它作为主键是有意义的,但由于它既不是顺序的也不是永久增加的,因此作为 CI 似乎是不正确的。我永远不会执行范围查询ItemId

...但是,仅用于顺序 CI 的代理键似乎也不合适。

我同样有可能执行:

SELECT [ItemGroupId] FROM [Table] WHERE [ItemId] = @id
SELECT [ItemId] FROM [Table] WHERE [ItemGroupId] = @id

据我所知,我有几个选择:

  1. ItemId既是CI又是PK
  2. ItemId不是CI,而是PK
  3. ItemId既不是 CI 也不是 PK 但有UNIQUE约束
  4. ItemId, ItemGroupId组合成为 PK 并ItemId具有UNIQUE约束
sql-server database-design
  • 1 个回答
  • 550 Views
Martin Hope
Matthew
Asked: 2014-03-31 06:11:06 +0800 CST

我应该如何将表限制为 N 行,丢弃最旧的?

  • 2

我有一个用于存储事件的 SQL Server 表。

我只希望表包含最近添加的 1000 行,当插入第 1001 行时,应删除第 1 行。

我有一个 DateCreatedUTC 列和一个自动编号列......我可以编写一个查询来执行删除并触发它,INSERT但我不知道这是最合适的解决方案。

sql-server-2008-r2 trigger
  • 1 个回答
  • 1583 Views
Martin Hope
Matthew
Asked: 2014-02-13 15:51:08 +0800 CST

如果更改满足绑定要求,我可以更改使用模式绑定引用的视图吗?

  • 6

在 SQL Server 2008 中,我有视图WITH SCHEMABINDING,我需要更改一个。

我正在更改列而不更改其别名,因此消费者不会受到影响。

如果我要删除依赖于此的所有其他视图,我将能够再次重新创建它们,所以SCHEMABINDING仍然有效。

我可以暂时禁用此视图上的模式锁定ALTER吗?

或者我必须删除依赖视图并在更改后重新创建它们?

sql-server-2008-r2 schema
  • 1 个回答
  • 4120 Views
Martin Hope
Matthew
Asked: 2014-02-11 09:02:42 +0800 CST

我应该在 SQL Server 中嵌套依赖外部联接吗?

  • 9

我听到了关于这方面的混合信息,希望得到规范或专家的意见。

如果我有多个LEFT OUTER JOINs ,每个都依赖于最后一个,嵌套它们是否更好?

对于人为的示例,JOINtoMyParent取决于JOINto MyChild: http ://sqlfiddle.com/#!3/31022/5

SELECT
    {columns}
FROM
    MyGrandChild AS gc
LEFT OUTER JOIN
    MyChild AS c
        ON c.[Id] = gc.[ParentId]
LEFT OUTER JOIN
    MyParent AS p
        ON p.[id] = c.[ParentId]

在此处输入图像描述

与http://sqlfiddle.com/#!3/31022/7相比

SELECT
    {columns}
FROM
    MyGrandChild AS gc
LEFT OUTER JOIN
    (
    MyChild AS c            
    LEFT OUTER JOIN
        MyParent AS p
            ON p.[id] = c.[ParentId]
    )
    ON c.[Id] = gc.[ParentId]

在此处输入图像描述

如上所示,这些在 SS2k8 中产生不同的查询计划

performance sql-server-2008-r2
  • 2 个回答
  • 857 Views
Martin Hope
Matthew
Asked: 2013-12-07 12:51:45 +0800 CST

如何在 SQL Server 中批量迁移架构?

  • 8

我们目前有多个数据库,但希望将它们组合起来,而是使用模式分离我们的域上下文。

在 MS SQL Server 2008 R2 中,如何将一个架构的所有内容批量重定位到另一个架构中?

例如,我们在模式中创建的所有表、视图、过程、索引等......dbo现在都将存在于foo模式中。

编辑:我想根据 AaronBertrand 的精彩评论进行澄清。这不是多租户情况。我们的情况是内部工具插件是由没有将他们的表合并到工具数据库中的开发人员单独开发的。

sql-server-2008-r2 schema
  • 1 个回答
  • 5628 Views
Martin Hope
Matthew
Asked: 2013-11-20 09:35:36 +0800 CST

“Safe to SUM”的合适 SQL 方法是什么?

  • 2

不幸的是,在 SQL Server 2008 R2+ 中,我们有一些nvarchar列存储数字数据。

在某些情况下,我们希望可以对SUM数据求和。问题是对于一些参数无效的条目返回 1 ...。我明白这里发生了什么,但我正在寻找解决方法。ISNUMERIC()SUM

例如ISNUMERIC('10,1') = 1,但我不能将该值包含在 a 中SUM,所以我希望将该值从SUM... 和任何数据点中排除,事实上,这些数据点不能作为参数SUM而不被按摩...

所以我想知道确定字母数字列的内容是否可以求和的首选方法是什么?

编辑:值得注意的是,这是从 SO 上的这个答案中提取出来的:

https://stackoverflow.com/a/15833014/369775

但我不相信该答案中提供的方法是最佳的。我同意 HLGEM :

https://stackoverflow.com/a/338292/369775

最好的解决方案是停止在 varchar 列中存储整数。显然存在数据问题,数据可解释为数字但不能转换为数字。

sql-server-2008-r2 aggregate
  • 1 个回答
  • 154 Views
Martin Hope
Matthew
Asked: 2013-11-08 16:54:51 +0800 CST

在我的软删除指示器列上创建分区

  • 2

在 SQL Server 2008 R2 中,我正在探索分区表的使用。

我们有一个软删除方案,有时是一个IsDeleted bit NOT NULL,有时是一个DateDeleted date NULL

我想专注于第一种情况,即位。

我正在考虑对该表进行分区,因为该表几乎总是被查询和连接,包括该列。

我将如何进行这个过程?这是个坏主意吗?

我首先尝试单步执行向导,但它为我生成的脚本似乎很尴尬(多滴约束,创建新 CI)

sql-server sql-server-2008-r2
  • 2 个回答
  • 1872 Views
Martin Hope
Matthew
Asked: 2013-11-08 09:00:38 +0800 CST

我可以强制 MSDTC 仅在单个数据库内进行控制吗?

  • 1

使用 MS SQL Server 2008 R2,我们有 .NET 代码,我们希望在同一事务范围内使用嵌套连接到同一数据库。

我理解并接受这需要升级到 DTC。

我担心的是,我们的 sql 实例包含用于分布式应用程序的数据库,在某些情况下,这些应用程序只需要通过 API 进行交互。如果我启用 MSDTC,我相信它将跨数据库应用……这意味着当我们使用 API 或其他人在同一个 SQL 实例上使用我们的 API 时,我们可能是两个理论上可分离的应用程序之间的控制器事务。也许如果 sql 操作在 API 使用的方法中失败,那可能不关我的事,如果是数据库事务,他们不应该知道或关心我是否在内部调用他们的方法。

因此,在我的具体情况下,如果我可以仅在我的一个数据库中使用 MSDTC,那将是合适的。如果我跨需要升级的数据库执行操作,我可以接受例外情况。

sql-server sql-server-2008-r2
  • 1 个回答
  • 676 Views
Martin Hope
Matthew
Asked: 2013-10-18 08:45:51 +0800 CST

单个 SQL Server 实例可以发出两次相同的 SYSDATETIME 吗?

  • 4

我正在考虑使用 adatetime2(7)作为聚集索引。

如果我总是使用填充该列SYSDATETIME,同一个实例是否有可能两次发出相同的值(假设我们不做类似设置系统时钟的事情)?

或者,确保此类列的唯一性的内聚策略是什么,即使它是以时间精度为代价的?

对于我的使用,我真的只关心秒数,但我将在此列上进行大量范围查询,因此 CI似乎是合适的。

sql-server sql-server-2008-r2
  • 2 个回答
  • 463 Views
Martin Hope
Matthew
Asked: 2013-10-11 10:42:20 +0800 CST

我应该使用强制转换或范围将日期时间加入日期吗?

  • 3

这个问题是从这里提出的优秀问题的起飞:

迄今为止的演员阵容是可悲的,但这是个好主意吗?

就我而言,我不关心该WHERE子句,而是加入一个具有类型列的事件表DATE

一个表有DATETIME2,另一个有DATE......所以我可以有效地JOIN使用 aCAST( AS DATE)或者我可以使用“传统”范围查询(> = date AND < date+1)。

我的问题是哪个更可取?这些DATETIME值几乎永远不会与谓词DATE值匹配。

我希望保持在 2M 行的数量级上,DATETIME并且低于 5k DATE(如果这个考虑有所不同)

我是否应该期望与JOIN使用该WHERE子句的行为相同?我应该更喜欢哪一个来保持扩展性能?MSSQL 2012 的答案是否会改变?

我的通用用例是将事件表视为日历表

SELECT
    events.columns
    ,SOME_AGGREGATIONS(tasks.column)
FROM
    events
LEFT OUTER JOIN
    tasks
        --This appropriately states my intent clearer
        ON CAST(tasks.datetimecolumn AS DATE) = events.datecolumn 
        --But is this more effective/scalable?
        --ON tasks.datetimecolumn >= events.datecolumn 
        --AND tasks.datetimecolumn < DATEADD(day,1,events.datecolumn)
GROUP BY
    events.columns
sql-server-2008-r2 sql-server-2012
  • 2 个回答
  • 36607 Views
Martin Hope
Matthew
Asked: 2013-06-05 09:41:59 +0800 CST

我可以添加一个忽略现有违规的唯一约束吗?

  • 47

我有一个表,该表当前在一列中有重复的值。

我无法删除这些错误的重复项,但我想防止添加其他非唯一值。

我可以创建一个UNIQUE不检查现有合规性的文件吗?

我曾尝试使用NOCHECK但不成功。

在这种情况下,我有一个将许可信息与“CompanyName”联系起来的表

编辑:具有相同“公司名称”的多行是错误数据,但我们目前无法删除或更新这些重复项。一种方法是让INSERTs 使用一个存储过程,该过程会因重复而失败......如果可以让 SQL 自己检查唯一性,那将是可取的。

该数据按公司名称查询。对于少数现有的重复项,这将意味着返回并显示多行......虽然这是错误的,但在我们的用例中是可以接受的。目标是防止它在未来发生。在我看来,我必须在存储过程中执行此逻辑。

sql-server database-design
  • 5 个回答
  • 52936 Views
Martin Hope
Matthew
Asked: 2012-06-12 07:13:24 +0800 CST

SQL Server 的日期值是否存储为单个 int?

  • 8

正如SQLDenis 解释的那样, SQL Server 在DATETIME内部存储为两个INT值。

DATE将类型(SQL Server 2008+)存储为单个 是否正确(通过逻辑扩展)INT?

sql-server
  • 1 个回答
  • 1466 Views
Martin Hope
Matthew
Asked: 2011-11-29 11:36:53 +0800 CST

使用 SSD 时,数据库设计中聚集索引的概念是否有意义?

  • 44

在设计 SQL Server 数据模式和后续查询、存储过程、视图等时,对于明确部署在 SSD 平台上的数据库设计,是否考虑聚集索引和磁盘上数据顺序的概念?

http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx
“聚集索引确定表中数据的物理顺序。”

在物理磁盘平台上,考虑它们的设计对我来说是有意义的,因为对数据进行物理扫描以检索“顺序”行可能比通过表查找具有更高的性能。
在 SSD 平台上,所有数据读取访问都使用相同的查找。没有“物理顺序”的概念,数据读取也不是“顺序的”,因为位存储在同一块硅片上。

那么,在设计应用数据库的过程中,聚集索引的考虑是否与该平台相关?

我最初的想法是,这并不是因为“有序数据”的概念不适用于 SSD 存储和搜索/检索优化。

编辑:我知道 SQL Server会创建一个,我只是在思考在设计/优化期间考虑它是否有意义。

sql-server clustered-index
  • 3 个回答
  • 3277 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve