通过将数据转换为XML来加速SQL查询?

时间:2011-02-22 00:08:04

标签: sql xml

我正在接管一个非常小的利基分类广告网站(每天可能有5个新条目),这个网站运行正常,直到谷歌和Bing发布它。每个类别,子类别和广告都存储在数据库(MS SQL 2005)中,因此他们抓取的每个页面都会点击这些查询并激活CPU。

为了解决这个问题,我的老板希望我将所有数据卸载到XML文件中,然后查询(whaa?)。我认为这需要做的工作远远超过必要的工作,但最好是业余DBA,除了调优查询,使用存储过程,创建适当的索引等等之外,我没有任何可靠的替代方案......

XML参数有什么基础吗?你会怎么做才能避免这个蜘蛛问题?

类别:

SELECT Category.CatID, Category.CatName, Category.Remove, CategorySub.SubCatID, CategorySub.SubCatName, CategorySub.TitleText, CategorySub.ShowPrice, CategorySub.ShowLocation, CategorySub.Remove
FROM Category INNER JOIN CategorySub ON Category.CatID = CategorySub.CatID
WHERE (((Category.Remove)=0) AND ((CategorySub.SubCatID)=" & intSubCatID & ") AND ((CategorySub.Remove)=0))

子类别:

SELECT CategorySub.CatID, CategorySub.SubCatName, CategorySub.SubCatOrder, CategorySub.SubCatID, CategorySub.Remove FROM CategorySub
WHERE (((CategorySub.CatID)=" & intCatID & ") AND ((CategorySub.Remove)=0))
ORDER BY CategorySub.SubCatOrder

广告:

SELECT Ad.AdID, Ad.ModifiedDate, Ad.CatID, CategorySub.SubCatName, Ad.Title, Ad.ShortDesc, Ad.Price, Ad.Location, Count(Pictures.PictureID) AS CountOfPictureID
FROM (Ad INNER JOIN CategorySub ON Ad.SubCatID = CategorySub.SubCatID) LEFT JOIN Pictures ON Ad.AdID = Pictures.AdID
WHERE (((Ad.SubCatID)=" & intSubCatID & ") AND ((Ad.Activated)<>0) AND ((Ad.Remove)=0))
GROUP BY Ad.AdID, Ad.ModifiedDate, Ad.CatID, CategorySub.SubCatName, Ad.Title, Ad.ShortDesc, Ad.Price, Ad.Location
ORDER BY Ad.ModifiedDate DESC

2 个答案:

答案 0 :(得分:2)

  • 您可以阻止蜘蛛攻击您的网站或某些网页(使用robots.txt)。
  • 或者,当您为自己编制索引时(通过检查User-Agent标头),您可以运行不同的查询(无广告)

答案 1 :(得分:0)

哪些查询存在问题?在我阅读它们时,唯一突然出现的是你的广告查询在group by子句中有很多 - 可能会吃掉很多tempdb,然后它必须用其他东西对结果进行排序。由于进行聚合的唯一原因似乎是将图片折叠成一行,看起来你只关心那里是否有图片,考虑改变它有:

SELECT Ad.AdID, ..., Ad.Location,
       (SELECT COUNT(*) FROM Pictures WHERE Pictures.AdID = Ad.AdID) AS CountOfPictureID
FROM Ad
WHERE ...
ORDER BY ...

或者:

SELECT Ad.AdID, ..., Ad.Location,
       CASE WHEN EXISTS (SELECT COUNT(*) FROM Pictures WHERE Pictures.AdID = Ad.AdID)
            THEN 1 ELSE 0 END AS PictureExists
FROM Ad
WHERE ...
ORDER BY ...

如果你需要在第一张图片上获得一些数据,你可以使用OUTER APPLY,但这不需要产生你已经得到的相同结果。

实际上,除非你有 lot 数据(你没有提到绝对卷),否则这些查询应该不是问题。另一件需要考虑的事情是,旧广告是否保留在主广告表中(如果是,请考虑编写一个过程,以便在过期后将其归档;或者创建一个仅包含应该是广告的AdID值的附加表格显示和INNER JOIN与Ad)。当然,看看导致速度减慢的主要查询的计划...你有足够的日志记录,你可以看到哪些查询占用了时间?你能否证明SQL查询是在减慢页面速度还是其他需要占用时间的东西?

缓存不会发生太大变化的数据有一些优点。例如,您的标题和副标题是否会像广告一样频繁更改?我希望会有很大的不同。某些off-DB缓存 - XML文件memcached-可用于删除一遍又一遍地获取相同旧数据的查询,代价是需要一种方法来确保重用的数据是可接受的到目前为止(例如至少每隔X分钟刷新一次)。

我们自己,我们不得不改变一堆浏览页面来从本地文档数据库而不是RDBMS中获取数据,因为有问题的RDBMS无法很好地将几个正交的非选择性标准组合在一起(而不是无论如何,运行网站的其余部分)。我对使用“NoSQL”时刻的流行语犹豫不决,但这就是它的原因(虽然问题不在于理论上使用SQL数据库,只是我们没有充分规划查询的那个)。