Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于nvarchar问题的SQL Server唯一索引_Sql_Sql Server_Nvarchar_Unique Index - Fatal编程技术网

关于nvarchar问题的SQL Server唯一索引

关于nvarchar问题的SQL Server唯一索引,sql,sql-server,nvarchar,unique-index,Sql,Sql Server,Nvarchar,Unique Index,我有一个带有nvarchar(50)列的SQL Server表。此列必须是唯一的,不能是主键,因为另一列是主键。因此,我在此列上设置了一个非聚集唯一索引 在可序列化事务中有大量insert语句时,我只想在不同的事务中基于此列执行select查询。但这些插入似乎锁定了表。例如,如果我将unique列的数据类型更改为bigint,则不会发生锁定 为什么nvarchar不工作,而bigint工作?如何使用nvarchar(50)作为数据类型实现相同的功能?首先,您可以将PK更改为非聚集索引,然后可以在

我有一个带有nvarchar(50)列的SQL Server表。此列必须是唯一的,不能是主键,因为另一列是主键。因此,我在此列上设置了一个非聚集唯一索引

在可序列化事务中有大量insert语句时,我只想在不同的事务中基于此列执行select查询。但这些插入似乎锁定了表。例如,如果我将unique列的数据类型更改为bigint,则不会发生锁定


为什么nvarchar不工作,而bigint工作?如何使用nvarchar(50)作为数据类型实现相同的功能?

首先,您可以将PK更改为非聚集索引,然后可以在此字段上创建聚集索引。当然,根据您的使用情况,这可能是一个坏主意,或者根本无济于事

您可能有一个覆盖索引的用例,请参见前面的

通过更改这些查询的隔离级别,您可以将“其他查询”更改为非阻塞查询

在单个事务中插入大量行是相对少见的。您可以简单地不使用事务,或者将事务拆分为一组较小的事务,以避免锁定表的较大部分。例如,您可以将记录插入事务中的挂起表(正常活动中不使用该表),然后在不需要实时过帐到主表的情况下,将较小事务中的这些记录迁移到主表

增加

也许是最明显的问题。您确定必须使用可序列化事务来插入大量记录吗?在金融交易之外,这些是相对较少需要的,并且与其他隔离级别相比,并发成本较高

增加

根据您关于“全部或无”的评论,您描述的是原子性,而不是可序列化性。也就是说,您可以为您的大型insert事务使用不同的隔离级别,并且仍然可以获得原子性


第二件事,我注意到您指定了大量insert语句。这听起来就像您应该能够将这些插入推送到挂起/暂存表中,然后从暂存表向生产表中执行一个或多个插入批次。是的,这需要更多的工作,但您可能只是有一个需要额外努力的现有问题。

您可能需要在查询中添加NOLOCK提示(也称为READUNCOMMITTED)。它将允许对已经插入的数据执行“脏读”

e、 g

选择
[my_nvarchar_专栏]
从…起
[dbo].[locked_table]与(NOLOCK)

请看下面一个更好的解释:

以及此处的“重新提交未提交”部分:


毕竟,谜团已经解开了!我想这是相当愚蠢的情况

问题出在select语句中。where子句缺少引号,但由于现有数据仅为数字,因此select没有失败,只是在inserts提交之前没有执行。插入第一个字母数字数据时,select语句开始失败,出现“将数据类型nvarchar转换为数字时出错”

e、 g 而不是

SELECT [my_nvarchar_column]  
FROM [dbo].[my_table]  
WHERE [my_nvarchar_column] = '12345'
select语句被删除

SELECT [my_nvarchar_column]  
FROM [dbo].[my_table]  
WHERE [my_nvarchar_column] = 12345
我猜执行了静默强制转换,没有使用唯一索引,这导致了块。 修复了声明,现在一切正常


谢谢大家的帮助,也为这个愚蠢的问题感到抱歉

您能否向该列添加唯一的约束和索引?桌子有多大?我不知道为什么会发生阻塞。但是,你能把这些值放在另一个表中,只使用外键引用吗?我忘了说我在nvarchar(50)列上有一个唯一的索引,我将编辑我的问题另一个表会有什么帮助,因为我仍然需要对该表进行插入和选择?你的
选择需要什么样的隔离?您不想要未提交的行吗?或者将它们包含在结果中可以吗?将索引更改为聚集索引,并将PK更改为非聚集索引,会产生相同的结果。我仍然无法基于此列进行选择。是的,需要可序列化事务。这些大的插入很少出现,但在此期间,表必须是可访问的。没有非工作时间可以进行插入。插入必须全部失败或成功。我想我可以使用一个挂起的表,但是我也应该维护这个表的数据(例如在删除之后),否则惟一约束将没有结果。但这似乎是一项巨大的工作。好吧,这不仅仅是原子性,因为如果插入失败,那么必须对以前在同一事务中处理的其他数据进行回滚。我将尝试挂起表解决方案,作为最后一个但更安全的选择,尽管我想我应该在两个表之间维护相同的数据,并以小批量插入新行。感谢您的建议。OP专门插入了一个
可序列化的
事务,因此我会有点犹豫是否提供一些实质上忽略该事务的内容(即,行可能会消失)。我们可能需要从OP获得更多信息。可序列化事务是一项要求。