我们有2个桌子分配和分配。 On Dispense有一个外键PatientID。
大多数流程和查询都在患者的背景下。 目前,分配表具有非聚集索引(DispenseID,PatientID)。 DispenseDetail具有DispenseDetailID作为主键和非聚集索引(DispenseID)。
我们注意到由pageIo锁存器(sh)引起的一些缓慢,因为sql server必须将数据从磁盘带入内存。
我正在考虑一个聚集索引(DispenseID,DispenseDetailID),它可以帮助检索特定患者的分配细节,但它可能会使插入分配更加严重。分配插入更重要,因为没有它们就不会有要查询的数据。
非聚集索引(DispenseID,DispenseDetailID)会帮助吗?
非常感谢任何评论或想法。
谢谢!
sqlonly的信息
有4个物理CPU,每个CPU有6个核心,总共24个核心。有32个虚拟CPU。 数据库位于VM上,其中有4个物理CPU,每个CPU有6个核心,共24个核心。并且有32个虚拟CPU。 分配表有4000000+行。分配细节有11000000+行。 我不知道如何计算或获得平均页面锁定等待时间。查询sys.dm_os_latch_stats并按等待时间排序,这是结果集:
latch_class waiting_requests_count wait_time_ms max_wait_time_ms BUFFER 62658377 97584783 12051 ACCESS_METHODS_DATASET_PARENT 950195 7870081 19652 ACCESS_METHODS_HOBT_VIRTUAL_ROOT 799403 5071290 5692 BACKUP_OPERATION 785245 372930 206 LOG_MANAGER 7 40403 11235 ACCESS_METHODS_HOBT_COUNT 7959 19728 1587 NESTING_TRANSACTION_FULL 122342 7969 59 ACCESS_METHODS_ACCESSOR_CACHE 67877 5143 65 ACCESS_METHODS_BULK_ALLOC 1644 734 49 ACCESS_METHODS_HOBT 15 76 15 SPACEMGR_ALLOCEXTENT_CACHE 169 71 10 SPACEMGR_IAM_PAGE_RANGE_CACHE 68 49 4 NESTING_TRANSACTION_READONLY 1942 11 1 SERVICE_BROKER_WAITFOR_MANAGER 31 9 4 TRACE_CONTROLLER 1 1 1 APPEND_ONLY_STORAGE_FIRST_ALLOC 11 1 1
在开发中,我使用当前索引来获取患者的disposseID和dispenseDetailID - 结果是索引搜索。但是,必须将结果集插入到临时表中以获取其他字段,并且插入临时表的成本很高,因此网络没有任何改进。
谢谢!