Sql 如何提高此慢速查询的性能

Sql 如何提高此慢速查询的性能,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个大约10分钟的问题。我需要这个更快。 您知道如何调整此查询吗?r\u pos\u transaction\u head表的记录略低于500000条,而r\u pos\u transaction\u detl的记录略低于900000条 我已经在我认为合适的地方创建了索引(您可以在计划中看到这些索引) truncate table t_retail_历史记录 插入t_零售_历史记录 选择 h、 源数据库作为遗留源数据库, h、 公司作为遗产公司, h、 存储\u代码作为旧存储\u代码, h、

我有一个大约10分钟的问题。我需要这个更快。 您知道如何调整此查询吗?
r\u pos\u transaction\u head
表的记录略低于500000条,而
r\u pos\u transaction\u detl
的记录略低于900000条

我已经在我认为合适的地方创建了索引(您可以在计划中看到这些索引)

truncate table t_retail_历史记录
插入t_零售_历史记录
选择
h、 源数据库作为遗留源数据库,
h、 公司作为遗产公司,
h、 存储\u代码作为旧存储\u代码,
h、 注册为遗产登记册,
转换(h.注册为char(1))+'/'+转换(h.事务号为varchar(10))为遗留事务号,
t_warehouse.store_编号作为store_编号,
h、 交易编号作为参考,
将(varchar(10),dbo.datefromdays(h.date),103)转换为交易日,
将(varchar(5),dateadd(second,h.time,cast(cast(getdate()as date)as datetime)),108)转换为事务时间,
d、 产品代码作为遗留产品代码,
合并(d.颜色编号,0)为传统颜色编号,
合并(g颜色名称替换。新颜色名称,s颜色名称“”)作为传统颜色名称,
合并(d.size\u no,0)为旧版\u size\u no,
合并(s.size_代码“”)为旧版_大小_代码,
d、 价格税作为遗产价格税,
d、 库存品编号作为遗留库存品编号,
空为条形码,
d、 数量作为数量,
d、 净总额作为销售总额,
作为个人代码为空,
t_warehouse.destination_busdiv_前缀
从…起
高级副总裁职位交易主管h
内连接
svi.r\u pos\u交易详细信息
d、 公司=h公司
和d.store\u code=h.store\u code
和d.register=h.register
和d.tx_代码=h.transaction_编号
内连接
svi.g_SKU上的
s、 公司=h公司
s.product\U code=d.product\U code
及(
s、 颜色\位置=d.颜色\编号
或s.colour\U位置为空,d.colour\U no=0
)
及(
s、 尺寸\位置=d.尺寸\编号
或s.size_位置为空,d.size_编号为0
)
左外连接
g\u颜色\u名称\u更换
g_颜色_名称_替换。产品_代码=d。产品_代码
和g颜色名称替换。旧颜色名称=s颜色名称
左外连接
t_仓库
t_warehouse.legacy_svi_代码=右侧('000')+铸造(h.store_代码为nvarchar(5)),3)
哪里
d、 数量0
和d.net_总计0


感谢您的帮助

您可以使用索引视图来执行更好的连接。 执行更好的索引,以便它可以使用索引搜索而不是索引扫描。
图像百分比总和不是100%,而其他百分比总和不是100%。

您似乎没有支持查询所需的索引。您应该看看是否可以在加入的列上创建索引。

正如大家所建议的那样,查询编写正确,请尝试在加入的字段上添加一些索引

对我来说,查询中不好的部分是:

and (
    s.colour_position = d.colour_no
    or s.colour_position is null and d.colour_no = 0
)
and (
    s.size_position = d.size_no
    or s.size_position is null and d.size_no = 0
)
因为
内部联接
语句中的
或条件
性能杀手。它们有很多技巧来避免这种情况(比如对每个条件执行2个左连接,然后在where子句中删除出现null的左连接)

我只是做了一些其他的研究,我发现这给你提出了一些建议。您应该尝试使用Union选项,以不重新生成所有“选择字段”零件


我没有时间为您重写所有查询,请随时通知我。

您是否尝试过在数据库Engine Tuning Advisor中对其进行分析?您能否告诉我们
SELECT语句
是否也只需
10分钟?因为如果要插入大约1亿行,则很难对其进行优化:p@user1994514-没有。我以前从来没用过,我可以看看。是的,
SELECT
也需要同样的时间,所以我不认为insert本身就是问题所在。用您需要的其他表中的列替换所有“整表”联接如何?或者甚至用这些信息创建临时表并将它们连接到主查询可能会有所帮助?您忘记了在该查询中包含r_pos_transaction_head表。为什么这么说?如果您看到我的计划,它几乎在所有联接上都使用索引。使用索引可能是索引查找而不是索引扫描。@首先锁定索引扫描可能意味着SQL Server找不到更好的索引来支持您的联接。此外,散列联接也证明了您的查询没有得到索引的很好支持。谢谢。我觉得
将是性能杀手。我工作的一位DBA说,有时候,数据库基本上可以运行两次查询,基本上在结果集之间执行
联合。不过,我想我可以通过在这些源表上运行更新并将null值设置为0,然后在联接中不使用
来解决这个问题。我要在附近玩一玩。不过,我很感激花了这么多时间来帮忙!哈哈,我爱你!我对上面提到的表进行了更新,将size\u位置和color\u位置中的空值更新为0。。查询耗时28秒!!非常感谢你。
and (
    s.colour_position = d.colour_no
    or s.colour_position is null and d.colour_no = 0
)
and (
    s.size_position = d.size_no
    or s.size_position is null and d.size_no = 0
)