加速MSSQL SELECT DISTINCT语句
在我将加速MSSQL SELECT DISTINCT语句,sql,sql-server,database,tsql,relational-database,Sql,Sql Server,Database,Tsql,Relational Database,在我将DISTINCT添加到SELECT语句之前,这个查询工作正常,不到1秒。我尝试了按分组,也尝试了MAX到每一列。所有这些都会给你5秒以上的时间。如果有人对如何加快跑步速度有任何建议,我将不胜感激 这是来自 传递参数 @PAGENUM=0 @PERPAGE=20 @SORTBY=N'Price DESC' @FILTERBY=N'“城市”、“村庄”、“沿海地区” 结果 如评论中所述,不要对所有内容运行函数,只对要返回的内容运行函数: 更好的是,去掉这些函数。SQL中的函数总是有DBA的坏代码
DISTINCT
添加到SELECT
语句之前,这个查询工作正常,不到1秒。我尝试了按
分组,也尝试了MAX
到每一列。所有这些都会给你5秒以上的时间。如果有人对如何加快跑步速度有任何建议,我将不胜感激
这是来自
传递参数
@PAGENUM=0
@PERPAGE=20
@SORTBY=N'Price DESC'
@FILTERBY=N'“城市”、“村庄”、“沿海地区”
结果
如评论中所述,不要对所有内容运行函数,只对要返回的内容运行函数: 更好的是,去掉这些函数。SQL中的函数总是有DBA的坏代码味道,而DBA还没有集中思考。我相信有一种更快的方法来获取这些值
SELECT
[rownum],
dbo.funcSellIdByPropId(T0.id) as SellerId,
dbo.funcDefaultImage(T0.id, 1) as propImage,
dbo.funcDefaultImage(T0.id, 2) as propImage2,
dbo.funcDefaultImage(T0.id, 3) as propImage3,
dbo.funcDefaultImage(T0.id, 4) as propImage4,
dbo.funcCountPropertyImages(T0.id) as imageCount,
dbo.funcGetPropertyTypeListGB(T0.id) as TypeGB,
dbo.funcGetPropertyTypeListFR(T0.id) as TypeFR,
dbo.funcGetPropertyEnviListGB(T0.id) as EnviGB,
dbo.funcGetPropertyEnviListFR(T0.id) as EnviFR,
dbo.funcGetDepartmentByTown(T0.Town) as Department,
dbo.funcCheckFeaturedProperty(T0.id) as Featured,
T0.id, T0.Price, T0.BedRooms, T0.Town, T0.Postcode,
T0.Mandate, T0.MinLandArea, T0.Rooms, T0.HabitableSurface,
T0.Active, T0.Budget,
T1.TitleFR, T1.TitleGB, SUBSTRING(T1.DescFR, 0, 300) as DescFR,
SUBSTRING(T1.DescGB, 0, 300) as DescGB
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY ' + @SORTBY + ') AS [rownum], *
FROM (
SELECT DISTINCT
T0.id
FROM
PROPERTIES T0
INNER JOIN PROPERTYTRANSLATIONS T1 ON T1.PropertyId = T0.id
INNER JOIN MATRIXPROPENVIRONMENT T2 ON T2.PropertyId = T0.id
INNER JOIN ENVIRONMENT T3 ON T3.id = T2.EnvironmentId
WHERE
T0.Deleted = 0
AND T0.Active = 1
AND T3.GB IN (' + @FILTERBY + ')
) T ) TT
WHERE rownum BETWEEN (' + CONVERT(varchar(4), @PERPAGE * @PAGENUM) + ')
AND (' + CONVERT(varchar(4), @PERPAGE * (@PAGENUM + 1)) + ')'
) TTT
JOIN PROPERTIES T0 ON T0.id = TTT.id
JOIN PROPERTYTRANSLATIONS T1 ON T1.PropertyId = T0.id
Distinct、Max和Group将根据您的结果集进行比较或排序。如果你有一个大的结果集CPU,我将很难排序比较行,甚至为每一行创建一个哈希。因为您的值来自函数而不是列,所以对索引没有帮助。也许您可以将该数据集“存储”到一个临时表中,创建一个索引或哈希列,或者两者都创建,并使用它进行排序,甚至可以使用快进游标进行插入排序。所有这些都是远大目标,也许你只是得到了一个太大的数据集,不可能及时处理它。如果你不能通过加快查询速度来解决问题,你可以尝试另一种方法,比如argh!反规范化或从此表创建搜索并每次更新(在此处放置一个时间段)为什么需要
DISTINCT
?也许你只需要在连接T1、T2或T3时添加一个补充条件。这些重复行来自何处?您是否可以发布一个查询计划来查看?添加一个CTE,您可以在其中区分真正需要区分的列。然后使用内部连接获取其他字段。这是一个很好的答案,当您不返回行时,不要对所有行运行func。另外:尽可能不要使用动态SQL语句。如果将其设置为TVF或存储过程,则SQL Server可以更轻松地缓存其计划。@jhilden-如果使用参数化查询,则将编译并缓存此查询。在第一次调用后,它应该具有与SP相同的性能。我不得不稍微修改一下你放在那里的内容,但它现在又在一秒钟内运行,并且拥有所有相同的功能!上帝保佑。非常感谢你@盎格鲁撒克逊-很高兴听到它,祝你好运,并摆脱所有这些功能!当你说在场景中思考是什么意思?只是出于好奇?我是一个非常喜欢LINQ的人,所以任何类型的SQL SP提示都会有很大的帮助。
SELECT
[rownum],
dbo.funcSellIdByPropId(T0.id) as SellerId,
dbo.funcDefaultImage(T0.id, 1) as propImage,
dbo.funcDefaultImage(T0.id, 2) as propImage2,
dbo.funcDefaultImage(T0.id, 3) as propImage3,
dbo.funcDefaultImage(T0.id, 4) as propImage4,
dbo.funcCountPropertyImages(T0.id) as imageCount,
dbo.funcGetPropertyTypeListGB(T0.id) as TypeGB,
dbo.funcGetPropertyTypeListFR(T0.id) as TypeFR,
dbo.funcGetPropertyEnviListGB(T0.id) as EnviGB,
dbo.funcGetPropertyEnviListFR(T0.id) as EnviFR,
dbo.funcGetDepartmentByTown(T0.Town) as Department,
dbo.funcCheckFeaturedProperty(T0.id) as Featured,
T0.id, T0.Price, T0.BedRooms, T0.Town, T0.Postcode,
T0.Mandate, T0.MinLandArea, T0.Rooms, T0.HabitableSurface,
T0.Active, T0.Budget,
T1.TitleFR, T1.TitleGB, SUBSTRING(T1.DescFR, 0, 300) as DescFR,
SUBSTRING(T1.DescGB, 0, 300) as DescGB
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY ' + @SORTBY + ') AS [rownum], *
FROM (
SELECT DISTINCT
T0.id
FROM
PROPERTIES T0
INNER JOIN PROPERTYTRANSLATIONS T1 ON T1.PropertyId = T0.id
INNER JOIN MATRIXPROPENVIRONMENT T2 ON T2.PropertyId = T0.id
INNER JOIN ENVIRONMENT T3 ON T3.id = T2.EnvironmentId
WHERE
T0.Deleted = 0
AND T0.Active = 1
AND T3.GB IN (' + @FILTERBY + ')
) T ) TT
WHERE rownum BETWEEN (' + CONVERT(varchar(4), @PERPAGE * @PAGENUM) + ')
AND (' + CONVERT(varchar(4), @PERPAGE * (@PAGENUM + 1)) + ')'
) TTT
JOIN PROPERTIES T0 ON T0.id = TTT.id
JOIN PROPERTYTRANSLATIONS T1 ON T1.PropertyId = T0.id