我有一个ZipCodes表,其中包含美国和加拿大的邮政编码和相关信息 - 包括纬度和经度。
我有记录从一个我无法修改的单独应用程序插入到表中。这些记录缺少纬度和经度数据,所以我想相应地填充记录。 (在任何人问之前,在运行时使用ZipCodes表进行JOIN似乎不是一个选择,因为性能,这就是为什么我结束了我的位置。)
我有下面显示的查询,该查询将设置为作为计划任务运行,该任务应更新尚未查找其地理数据的任何记录。此查询(每次100个)大约需要1个35秒才能运行。
我正在寻找我在这里所做的任何和所有选择,这可能会提高性能。
我使用了预定的任务,因为我担心让整个服务器与INSTEAD OF INSERT或者INSERT INSERT触发器一起做同样的事情......但这本来是我的偏好。鉴于当前的性能问题,触发器似乎是不可能的。
ZipCodes表在CityName和ProvinceAbbr上有一个非聚集索引,还有其他包含的列PostalCode,Latitude和Longitude。我允许行锁定和允许页面锁定设置为false。此表中的数据将每季度更改一次MAYBE,因此脏读是正常的。
如果需要,我可以提供执行计划结果......但不确定如何给我一个关于如何生成复制/粘贴材料的提示。 = d
ZipCodes表有947,172条记录,并且LoadsAvail表在任何给定时间都有大约38,000条记录...记录正在实时/不断地插入,更新和删除,有时是大批量(我说最大值)每次插入20个,通常更像是一次一个或两个。)
一旦大多数记录都有他们的地理数据,每分钟可能会有不到100条记录被更新,但我想知道是否有更好的方法来完成所有这些。
UPDATE TOP (100)
LoadsAvail
SET
coordinatesChecked = 1,
FromLatitude = ( SELECT TOP (1) Latitude
FROM ZipCodes AS ZipCodes_1 WITH(NOLOCK)
WHERE (CityName = loadsavail.FromCity) AND (ProvinceAbbr = loadsavail.FromState)
),
FromLongitude = ( SELECT TOP (1) Longitude
FROM ZipCodes AS ZipCodes_2 WITH(NOLOCK)
WHERE (CityName = loadsavail.FromCity) AND (ProvinceAbbr = loadsavail.FromState)
),
ToLatitude = ( SELECT TOP (1) Latitude
FROM ZipCodes AS ZipCodes_3 WITH(NOLOCK)
WHERE (CityName = loadsavail.ToCity) AND (ProvinceAbbr = loadsavail.toState)
),
ToLongitude = ( SELECT TOP (1) Longitude
FROM ZipCodes AS ZipCodes_4 WITH(NOLOCK)
WHERE (CityName = loadsavail.ToCity) AND (ProvinceAbbr = loadsavail.toState)
)
WHERE
coordinatesChecked = 0
答案 0 :(得分:3)
您可以使用加入代替子查询:
UPDATE T1
SET T1.coordinatesChecked = 1,
T1.FromLatitude = T2.Latitude,
T1.FromLongitude = T2.Longitude
T1.ToLatitude = T3.Latitude,
T1.ToLongitude = T3.Longitude
FROM LoadsAvail AS T1 LEFT JOIN ZipCodes AS T2 ON T1.FromCity = T2.CityName AND T1.FromState = T2.ProvinceAbbr
LEFT JOIN ZipCodes AS T3 ON T1.toCity = T3.CityName AND T1.toState = T3.ProvinceAbbr
WHERE T1.coordinatesChecked = 0