如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行
Posted
技术标签:
【中文标题】如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行【英文标题】:How to write this query for better performance in Sql Server? Removing SubString rows 【发布时间】:2018-07-23 08:24:42 【问题描述】:如何编写此查询以获得更好的性能?
SELECT T1.flow
FROM #allflows T1 INNER JOIN
#allflows T2
ON t2.flow like t1.flow + '%'
【问题讨论】:
您能否提供您的示例数据和预期输出 最好退后一步想想查询的目的是什么——您从表中选择所有行,然后自连接到与您的“喜欢”匹配的任何行条件 - 你用桌子做什么?我认为您至少会选择所有行,并且您最多可以选择“n-squared”行 因未正确编辑问题并向其添加新的可用信息而被否决。 【参考方案1】:我不明白你为什么想要重复,所以你可以这样做:
select t1.flow
from #allflows t1
where t1.flow is not null;
为什么?那么t1.flow
将匹配like t1.flow + '%'
。
当然,如果您想要重复,那么查询的成本会更高。
我的猜测是,这不一定能回答您的问题。您应该问另一个问题,其中包含适当的样本数据、期望的结果以及您想要做什么的解释。
【讨论】:
但是等等,通过向具有 37K 记录的临时表添加索引,我将时间缩短到了 100 毫秒 - 除非我错过了与缓存有关的内容。他在 Ajan 的答案的 cmets 部分中添加了有关他的查询的更多信息【参考方案2】:我通过查询示例客户表(30,000 行)创建了自己的代表“#allflows”
这就是我得到的
Declare @s as datetime = getdate();
CREATE NONCLUSTERED INDEX ix_tempNCIndexAft ON #allflows (flow);
SELECT 'make index', DATEDIff(second,@s, getdate())
SET @s = getdate();
SELECT t1.flow,COUNT(DISTINCT t2.flow) cnt INTO #realflows FROM #allflows t1
INNER JOIN #allflows t2 ON t2.flow like t1.flow+ '%' GROUP BY t1.flow HAVING COUNT(DISTINCT t2.flow) = 1;
SELECT 'your query', DATEDIff(second,@s, getdate())
select * from #realflows ;
【讨论】:
30000 不是很大。它甚至不小。大约在 1995 年左右,Foxpro 在处理 100 万行查询时没有问题。 @TomTom - 如果你愿意,我可以去获取更多行。不过,你在这里说什么?我没有称它为“非常大”或“非常小” 提问者提到了 60,000 行 - 我很快把那个大小增加了一半,然后减少了 2 分钟,我怀疑我的 30K 与他的 60K 是否是一个大问题 -无论如何,我提供免费帮助,我并没有完全复制他的情况 好的,我确实称我的桌子为“大”——因为它实际上来自一家“大公司”——不过,请随意添加您自己的 FoxPro 解决方案。 我现在可以制作两张表,一张有十亿条记录,然后进行查询没有问题,但我也可以制作一张有十条记录的表,然后设计有性能问题的查询。在这种情况下,他有 6 万条记录,并且存在性能问题 - 不是他的表大小造成问题 或者你只是删除大的声明,这是妄想。【参考方案3】:在这种情况下,您可以通过在加入之前仅选择必要的列来优化查询
SELECT T1.flow FROM #allflows T1
INNER JOIN (SELECT flow from #allflows) T2 ON t2.flow like t1.flow + '%'
【讨论】:
这对改进查询没有任何帮助。执行计划将是相同的。 仅供参考:此临时表只有 1 列 [流] 查询是什么,最终返回多少行? @Cato:此查询用于检查列值是否是任何其他行的子字符串。完整查询在这里 SELECT t1.flow INTO #realflows FROM #allflows t1 INNER JOIN #allflows t2 ON t2.flow like t1.flow + '%' GROUP BY t1.flow HAVING COUNT(DISTINCT t2.flow) = 1 请总结并将所有这些新信息添加到原始问题中以上是关于如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中填充我的日期维度表以获得具有此特定值的列?
以在 Oracle 和 SQL Server 中获得最佳性能为目标的数据建模
如何避免从 C# 构建的 Sql Server 2005 参数化查询变慢
如何在同一个表上组合两个查询以在 MySQL 中获得单个结果集