加速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