- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些查询多年来一直运行良好,但突然开始变慢了很多。从几乎瞬间到 25 秒。经过一番研究,发现问题出在索引“损坏”上。重新组织和重建查询使用的四个表的所有索引修复了问题。
太好了,我想一切都完成了。但是过了几天又是同样的问题。重建索引修复了它,但随后它开始每隔几天恢复一次。查询变慢 => 重建索引。这些表非常稳定,一周内添加几百个项目,它们有大约 30 万条记录。
这可能是什么原因?
编辑:
关于这个查询,我不知道如何在不破坏东西的情况下提高效率
ALTER PROCEDURE [dbo].[odat_PricesByDealer]
(
@dealer_id int,
@dealergroup_id int,
@startdate datetime,
@pricetype_id int,
@product_groep nvarchar(30)
)
AS
SET NOCOUNT ON
IF @pricetype_id = 0
SET @pricetype_id = NULL
IF @product_groep = '0'
SET @product_groep = NULL
SELECT a.price_ID
, a.make_id
, e.make_code_name
, a.dealergroup_ID
, c.product_ID
, c.product_code
, c.product_department
, c.product_code_name
, c.product_groep
, c.product_subgroep1
, c.product_subgroep2
, c.product_producent
, b.pricerow_lowerbound
, b.pricerow_upperbound
, b.pricerow_value
, aa.startdate AS startdate
, a.price_enddate AS enddate
, d.pricetype_id
, d.pricetype_name
, 3 AS price_level
FROM dbo.tblPrices a WITH (NOLOCK)
JOIN udf_PricesByDealer(@dealer_id, @startdate) aa ON a.price_startdate = aa.startdate
AND a.product_id = aa.product_id
AND a.pricetype_ID = aa.pricetype_ID
AND a.make_ID = aa.make_ID
AND a.dealergroup_ID = aa.dealergroup_ID
AND a.dealer_ID = aa.dealer_ID
JOIN dbo.tblPriceRows b WITH (NOLOCK) ON a.price_ID = b.price_ID
JOIN dbo.tblProducts c WITH (NOLOCK) ON a.product_ID = c.product_ID
JOIN dbo.tblPriceTypes d WITH (NOLOCK) ON a.pricetype_ID = d.pricetype_ID
JOIN dbo.tblMakes e WITH (NOLOCK) ON a.make_ID = e.make_ID
WHERE a.make_ID <> 0
AND a.dealergroup_ID = @dealergroup_id
AND a.dealer_ID = @dealer_id
AND (d.pricetype_id = @pricetype_id OR @pricetype_id IS NULL)
AND (c.product_groep = @product_groep OR @product_groep IS NULL)
AND a.price_authorized = 1
AND c.product_exclude_from_pricelist = 0
并且 JOIN 中的 UDF 看起来像这样
ALTER FUNCTION [dbo].[udf_PricesByDealer]
(
@dealer_ID numeric,
@startdate datetime
)
RETURNS TABLE
AS
RETURN
(
SELECT MAX(a.price_startdate) AS startdate
, a.make_id
, a.product_id
, a.pricetype_id
, a.dealergroup_id
, a.dealer_id
FROM dbo.tblPrices a WITH (NOLOCK)
JOIN udf_GetMakeIdForDealer(@dealer_id) b ON a.make_ID = b.make_ID
WHERE ( (a.price_startdate <= @startdate AND a.price_enddate >= @startdate)
OR
(a.price_startdate <= @startdate AND a.price_enddate < a.price_startdate) )
AND a.make_ID <> 0
AND a.dealergroup_id <> 0
AND a.dealer_id = @dealer_ID
GROUP BY a.make_id
, a.product_id
, a.pricetype_id
, a.dealergroup_id
, a.dealer_id
)
和另一个加入 UDF
ALTER FUNCTION [dbo].[udf_GetMakeIdForDealer]
(
@dealer_ID numeric
)
RETURNS TABLE
AS
RETURN
(
SELECT m.make_ID
, m.make_code_name
FROM [dbo].[tblMakes] m WITH (NOLOCK)
WHERE (m.make_ID in (SELECT make_ID
FROM tblDealerGroupMakes WITH (NOLOCK)
WHERE dealergroup_ID = (SELECT dealergroup_ID
FROM tblDealers WITH (NOLOCK)
WHERE dealer_ID = @dealer_ID))
OR
m.make_ID IN (SELECT make_ID
FROM tblDealerMakes WITH (NOLOCK)
WHERE dealer_ID = @dealer_ID AND dealermake_exclude = 0))
AND m.make_ID NOT IN (SELECT make_ID
FROM tblDealerMakes WITH (NOLOCK)
WHERE dealer_ID = @dealer_ID AND dealermake_exclude = 1)
)
最佳答案
Punter015 已经发布,你必须调整你的数据库,例如与维护计划。因为你不知道是否有必要(我遇到过同样的问题一次)我做了一些调查,在网上找到了一些样本,最后做了这个程序。
它检查是否需要重建索引,然后执行重建索引。我每晚都使用 cron 任务 (sqlcmd.exe) 运行它。不知道这是否是最好的方法,但对我来说效果很好。
CREATE PROCEDURE [dbo].[proc_ReorganizeIndexes]
AS
BEGIN
DECLARE @table nvarchar(100);
DECLARE @index_name nvarchar(100);
DECLARE @ext_frag float;
DECLARE @int_frag float;
DECLARE @sql nvarchar(max);
DECLARE local_index_cursor CURSOR FOR
SELECT object_name(dt.object_id) Tablename
,si.name IndexName
,dt.avg_fragmentation_in_percent AS ExternalFragmentation
,dt.avg_page_space_used_in_percent AS InternalFragmentation
FROM
(
SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats (db_id(DB_NAME()),null,null,null,'DETAILED'
)
WHERE index_id <> 0) AS dt
INNER JOIN sys.indexes si ON si.object_id=dt.object_id
AND si.index_id=dt.index_id AND dt.avg_fragmentation_in_percent>10
AND dt.avg_page_space_used_in_percent<75 ORDER BY avg_fragmentation_in_percent DESC
OPEN local_index_cursor
FETCH NEXT FROM local_index_cursor
INTO @table, @index_name, @ext_frag, @int_frag
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Need rebuild: ' + @table+ ' for index ' + @index_name + ' Fragmentation (int/ext): ' + CAST(@int_frag AS varchar(100)) + ' / ' + CAST(@ext_frag AS varchar(100))
SET @sql = 'ALTER INDEX ALL ON ' + @table + ' REBUILD WITH (FILLFACTOR=90)'
EXEC sp_executesql @sql
FETCH NEXT FROM local_index_cursor
INTO @table, @index_name, @ext_frag, @int_frag
END
CLOSE local_index_cursor
DEALLOCATE local_index_cursor
END
关于SQL 查询每隔几天就会变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21482893/
我已经在谷歌上搜索这个问题一段时间了,但我还没有找到有效的解决方案。 问题是 SSH 登录到我的服务器突然变得很慢。我可以看到身份验证需要大约 10 秒才能继续,这是我的 ssh 详细日志: Open
我正在使用 AVPlayer 在我的项目中播放在线视频。视频播放良好。现在我想减少/增加视频的 fps。以下是我正在使用的代码: self.asset = [AVAsset assetWithURL:
在 Raspberry Pi 上运行两个使用 python gpio 引脚的程序时,一个变慢。一种是磁传感器,另一种是温湿度传感器。后者是放慢速度的。它不是每 2 秒打印一次温度,而是每 5 到 10
我从 Redis 向我的应用程序提供一个 json,然后我对其进行解码和循环。 这是我从 Redis 提供的 json 的样子: [ { "titel": "test 1",
Ejabberd 版本:19.9.0 在发送 OMEMO 消息时(使用 websockets),例如
我们有相当大的代码库(150 多个项目、400000 多行 Java 代码、一些 Groovy 和 Gradle 代码、一些 Perl 代码、一些 XML、大量 JSP 等)。我设法在 Spring
我在一个网站上工作,您可以在其中创建 svg 艺术品,这意味着您可以动态添加元素、缩放、颜色并移动它们。 问题是,当你开始在他们身上施加阴影时,一切都会开始变慢。对于这个的现场演示,this是我正在开
有没有办法分析 Vim 插件? 当我打开一个大的 .py 时,我的 MacVim 变得越来越慢。我知道我可以取消选择所有插件并逐一重新选择以检查哪个插件是罪魁祸首,但是有没有更快的方法? 我的 dot
我正在构建一个JavaFX应用程序。我知道它使用反射,并且反射可能不如我在代码中构建 UI 时那么快。 所以, 如何设计我的 Controller 以使由反射引起的开销尽可能小? 带/不带 @FXML
我对 UITableViewCell 进行了子类化显示从 1 到 70 的数字。 在每个单元格中,我都在检查中奖号码并检查他们的背景。问题是,经过几次滚动后,tableview 变得非常缓慢,甚至无法
如果我想group_by 和filter 那些在数据集中有任何NA 或factor 值的,我想在 dplyr 中使用 any 函数,但发现它对 NAs 或 factor 运行缓慢(但不是为了寻找任何数
我有一个问题。在我的解决方案中,我需要将数千个数据插入数据库。我正在使用批处理准备语句在一个请求中插入多行。在我调用插入几次之后, hibernate 变得更慢了。 我猜它会在我提交后检查数据库是否有
我从 json url 获取数据,但是当我想加载图像时,速度非常慢! class NewsTableViewController: UITableViewController { var id
我有一个相当简单的托管 Realm 对象 RealmAlertItem由一些字符串和 float 组成。我有一个函数 showAlertNotification()随后被调用(从网络外部触发)并且它依
请参阅下面的表格结构。 CREATE TABLE `oarc` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `zID` int(11) NOT N
IntelliJ 慢得像爬行。键之间没有 1-2 个延迟几乎无法打字。我已经更新了堆大小。我在我的 Macbook Pro 上运行大约 2GB RAM。自从它一直在放缓。我已经增加了堆大小,但无济于事
我的 Web 应用程序遇到了性能问题。发现瓶颈是db。应用程序在具有 4 个 CPU 和 2GB RAM 的 LAMP 服务器 (VPS) 上运行。 将新记录插入数据库(包含大约 100.000 条记
我有关于自定义 DispatchQueue 的问题。 我创建了一个队列,并将其用作captureOutput:方法的队列。这是一个代码片段: //At the file header private
我是一名移动 QA。现在我们有一个关于网络响应和 UI 渲染之间的竞争条件的问题。我们猜测如果 UI 渲染比网络响应慢,那么它就会崩溃。 我们已经尝试通过使用 Charles 的本地 map 功能来加
我在 firefox 中遇到了一些奇怪的行为,我正在构建一个单页作品集,作为一名平面设计师,编码一直很困难。我想平滑地控制导航,然后向所有元素添加缩放(最初设计为 1920x1080 全屏)。讲师扔了
我是一名优秀的程序员,十分优秀!