Sql 提高选择和插入的性能

Sql 提高选择和插入的性能,sql,sql-server,performance,sql-server-2016,sqlbulkcopy,Sql,Sql Server,Performance,Sql Server 2016,Sqlbulkcopy,我有一个堆表,其中有一列称为BatchId。我使用SqlbulkCopy(tablock和批量大小为50k)插入它,性能非常好。我通常使用相同的batchId插入一整批大约1m行。我需要在batchId上为“selects”创建一个索引,但我不想影响插入性能。这里推荐的方法是什么(聚集索引/非聚集索引/batchId分区或其他方法),在一次插入过程中,所有行都具有相同的batchId,这有帮助吗?可能的想法包括 仅在必要时创建合适的索引,并降低散货性能 检查日志文件和数据文件是否提前调整大小,

我有一个堆表,其中有一列称为BatchId。我使用SqlbulkCopy(tablock和批量大小为50k)插入它,性能非常好。我通常使用相同的batchId插入一整批大约1m行。我需要在batchId上为“selects”创建一个索引,但我不想影响插入性能。这里推荐的方法是什么(聚集索引/非聚集索引/batchId分区或其他方法),在一次插入过程中,所有行都具有相同的batchId,这有帮助吗?

可能的想法包括

  • 仅在必要时创建合适的索引,并降低散货性能
  • 检查日志文件和数据文件是否提前调整大小,以避免文件增长
  • 将数据文件拆分为多个物理文件,以利用对单独卷的异步写入
  • 根据数据用例对表进行分区
  • 实施变更跟踪/CDC,使用内置的可靠方法异步保留快速插入和虹吸数据,使数据可单独查询

你知道的唯一方法就是进行实验,看看哪一个是最可接受的。您已经在使用tablock来利用并行性。如果插入没有与其他使用同时发生,那么创建所需的索引并删除它只是为了批量加载?确保您还使用了即时文件初始化,并提前调整了DB/log文件的大小,以避免插入过程中的增长。您是否错误地标记了sql2008,或者您是否仍在生产中使用它?是时候请您的DBA升级…;-)答案通常是“视情况而定”。删除索引非常快。建立一个索引obv取决于它的大小,但是,如果你只在非高峰时间插入,并且可以使用它几个小时,那么它是值得权衡的。你需要进行实验,根据我的经验,这总是更好的权衡。如果表是大的EngOU,您可以考虑分块,但如果大部分读取都是针对新加载的数据,那么这将不会有什么帮助。像平常一样插入堆中,使用CT将数据虹吸到索引表中进行查询。这一切都取决于你能容忍多大的延迟。我想说,当然值得研究一下。我已经为你整理了一份清单,希望能对你有所帮助。