插入正在查询的大型SQL Server表时是否存在性能问题?

插入正在查询的大型SQL Server表时是否存在性能问题?,sql,sql-server,search,insert,Sql,Sql Server,Search,Insert,我使用SQL Server。我得到了一张大桌子——数百万行。然后我对它们进行迭代(SELECT..WHERE..)。这是一个很长的操作(我想不能再短了) 因此,我要问的是,在选择过程中,将数据插入到表中是否会有任何问题?如果是,我应该做些什么来减少这种情况?对update命令执行相同的任务(当然带有索引参数)。是的,您将面临性能问题,更具体地说,是锁定和阻塞问题。如果SELECT语句使用的是索引(它们应该是索引),则每次INSERT数据到表中时,这些索引都将被锁定。由于表相对较大,锁的长度可能足

我使用SQL Server。我得到了一张大桌子——数百万行。然后我对它们进行迭代(
SELECT..WHERE..
)。这是一个很长的操作(我想不能再短了)


因此,我要问的是,在
选择
过程中,将
数据
插入到
表中是否会有任何问题?如果是,我应该做些什么来减少这种情况?对
update
命令执行相同的任务(当然带有索引参数)。

是的,您将面临性能问题,更具体地说,是锁定和阻塞问题。如果
SELECT
语句使用的是索引(它们应该是索引),则每次
INSERT
数据到表中时,这些索引都将被锁定。由于表相对较大,锁的长度可能足以阻止
SELECT
语句,并且死锁也可能存在

这可能是一个场景,您需要重新评估表结构,甚至可能考虑反规范化以避免这种情况。


你也可以考虑,假设你可以通过测试系统的其余部分来理解它的影响。

< P>是的,你将有性能,更具体地说,是锁定和阻塞问题。如果
SELECT
语句使用的是索引(它们应该是索引),则每次
INSERT
数据到表中时,这些索引都将被锁定。由于表相对较大,锁的长度可能足以阻止
SELECT
语句,并且死锁也可能存在

这可能是一个场景,您需要重新评估表结构,甚至可能考虑反规范化以避免这种情况。


你也可以考虑,假设你可以通过测试系统的其余部分来理解它的影响。

在一个频繁更新的数据库上运行长时间的查询通常不是一个好主意。这会因为锁定而显著降低性能

查看数据仓库,看看这是否是您可以使用的东西,这可能是一个好主意。这将使您能够将事务放在一个单独的数据库上,并将其大容量加载到另一个拥有您的仓库的数据库中

这将大大提高插入和查询的性能。事务数据库不能有索引,仓库可以有您想要的所有索引

您还可以将仓库放在列存储数据库中。这将以最小的工作量为您提供最佳的查询时间,因为不需要在列存储中创建索引,您所要做的就是正确地设计模式。列存储的缺点是,与关系数据库相比,插入、更新和删除速度非常慢。但是,从事务数据库批量加载应该可以做到这一点。如果您要求数据是最新的,您可以每隔几分钟批量加载一次。如果您只需要前一天的数据,您可以每晚将数据批量装入仓库


可能性是无穷的。如果你想查看列式商店仓库,你可以试试MonetDB。它是一个开放源代码的列存储,所以您可以尝试一下,看看这是否适合您。

通常情况下,对频繁更新的数据库进行长时间运行的查询不是一个好主意。这会因为锁定而显著降低性能

查看数据仓库,看看这是否是您可以使用的东西,这可能是一个好主意。这将使您能够将事务放在一个单独的数据库上,并将其大容量加载到另一个拥有您的仓库的数据库中

这将大大提高插入和查询的性能。事务数据库不能有索引,仓库可以有您想要的所有索引

您还可以将仓库放在列存储数据库中。这将以最小的工作量为您提供最佳的查询时间,因为不需要在列存储中创建索引,您所要做的就是正确地设计模式。列存储的缺点是,与关系数据库相比,插入、更新和删除速度非常慢。但是,从事务数据库批量加载应该可以做到这一点。如果您要求数据是最新的,您可以每隔几分钟批量加载一次。如果您只需要前一天的数据,您可以每晚将数据批量装入仓库


可能性是无穷的。如果你想查看列式商店仓库,你可以试试MonetDB。它是一个开源的列存储,所以您可以尝试一下,看看这是否适合您。

不要假设执行时间不能更短。如果查询日期范围,则必须在日期上建立索引
解决在日期字段上建立索引的问题:

-- please use correct names for your_table and date_field --
CREATE INDEX index_name ON your_table date_field    

不要假设执行时间不能更短。如果查询日期范围,则必须在日期上建立索引
解决在日期字段上建立索引的问题:

-- please use correct names for your_table and date_field --
CREATE INDEX index_name ON your_table date_field    

按照@Gisli的说法,仓储是一个不错的选择:在别处构建数据的副本,并在那里运行长期运行的查询,释放“主”数据库以进行OLTP处理

如果这不是一个选项,您可以随意使用快照隔离(我知道,但从未亲自使用过)。Essential,这将在您启动查询时拍摄数据库的“快照”,并将执行查询,就好像没有对数据库进行后续更改一样,即使在查询运行时对数据库进行了更改。更重要的是,任何这样的变化都是“真实的”和永久的。将其视为数据库的短期分支

分支(快照)的持续时间是我变弱的地方。我相信你可以