题目已经写好了,但我会在这里提供一些背景资料。
我有一个表myTable,它是通过nHibernate从web应用程序中查询的。它包含500 K行。有时(比方说每15分钟一次)。我需要刷新这个表内容,即删除所有内容并插入另一个500 K行(可能不同)。
免责声明:是的,我知道这不是正确的架构:-)无论如何,我需要理解这种行为。
插入大约需要60秒,我就是这样做的:
myTable_backup中插入500 K行myTable重命名为myTable_tempmyTable_backup重命名为myTablemyTable_temp重命名为myTable_backup第2-4点是用来快速切换表的,因此myTable几乎总是可用的.
尽管我的意图是最好的,但在尝试访问myTable时,我会得到SQL超时--在执行“重命名”时或多或少会发生这种情况。
我的问题是:为什么?
难道myTable是不可用的,因为由于500 K的插入,索引仍在重建?虽然它已经设法更改了一个名称,但仍然有背景重新索引正在进行吗?
如果是这样,那么在第1点和第2点之间显式执行myTable_backup上的索引是否会有所帮助?
但随后又出现了另一个问题,这是本文的官方问题:( 3)将myTable_backup重命名为myTable是否会导致索引重新生成?对我来说,这似乎是一个奇怪的想法,但是它可以解释我的超时(索引重建大约需要10秒)。
你能帮忙吗?如果你不知道答案,也许你可以建议如何找出答案?
谢谢你,库尔德工人党
发布于 2015-08-16 15:18:29
否,表的重命名不会导致索引重新生成。
但是它将获得一个SCH-M (模式修改)锁,为此它需要等待任何现有的读取器释放他们的锁。
同时,任何新的读取器都必须在SCH-M锁请求之后排队,而不是跳出队列,并有可能使其饥饿。(This is a change in behavior from the previous version)。
您可以检查sys.dm_os_waiting_tasks以查看超时期间发生的等待类型。
https://stackoverflow.com/questions/31988610
复制相似问题