Sql 和s和或s(在WHERE子句中),这使得索引很困难,因为您正在根据参数搜索不同的列。如果是动态搜索查询,我建议您阅读。这是关于这个问题的规范性文章(就我而言),没有什么我可以说Erland没有说过的。如果它在没有对所有参数进行distinct的情况下立即运

Sql 和s和或s(在WHERE子句中),这使得索引很困难,因为您正在根据参数搜索不同的列。如果是动态搜索查询,我建议您阅读。这是关于这个问题的规范性文章(就我而言),没有什么我可以说Erland没有说过的。如果它在没有对所有参数进行distinct的情况下立即运,sql,indexing,sql-server-2012,distinct,Sql,Indexing,Sql Server 2012,Distinct,和s和或s(在WHERE子句中),这使得索引很困难,因为您正在根据参数搜索不同的列。如果是动态搜索查询,我建议您阅读。这是关于这个问题的规范性文章(就我而言),没有什么我可以说Erland没有说过的。如果它在没有对所有参数进行distinct的情况下立即运行,那么听起来像是distinct从根本上改变了计划的形状。你能发布有和没有DISTINCT的执行计划吗?我想尝试的一件事是去掉DISTINCT并使用带有行号()的窗口函数。。。根据识别重复项所需的任何条件进行分区,然后在WHERE子句中过滤数


s和
s(在
WHERE
子句中),这使得索引很困难,因为您正在根据参数搜索不同的列。如果是动态搜索查询,我建议您阅读。这是关于这个问题的规范性文章(就我而言),没有什么我可以说Erland没有说过的。如果它在没有对所有参数进行distinct的情况下立即运行,那么听起来像是
distinct
从根本上改变了计划的形状。你能发布有和没有
DISTINCT
的执行计划吗?我想尝试的一件事是去掉
DISTINCT
并使用带有
行号()的窗口函数。。。根据识别重复项所需的任何条件进行分区,然后在
WHERE
子句中过滤数据,如-
WHERE RowNum=1
。。。如果这不合理,请告诉我。谢谢你是唯一一个真正尝试重做查询的人!不幸的是,它有一些语法错误,我不知道如何解决。但是集合将返回到后端c#asp.net系统,因此我们使用LINQ完成了重复删除
SELECT 
    Sku,
    Name,
    ccp.Polygon,
    MarketAvailability,
    Coverage,
    Range  
FROM
    (SELECT DISTINCT
         dbo.CatalogEntry.CatalogEntryId as Id,
         dbo.CatalogEntry.Code as Sku,
         CoverageNode.Name as Coverage,
         RangeNode.Name as [Range],
         (SELECT CatalogContentProperty.LongString
          FROM CatalogContentProperty                         
          WHERE MetaFieldName = 'ItemChartName' 
            AND (CatalogContentProperty.LongString IS NOT NULL) 
            AND (CatalogContentProperty.ObjectId = dbo.CatalogEntry.CatalogEntryId)) AS [Name],
         (SELECT CatalogContentProperty.LongString
          FROM CatalogContentProperty                         
          WHERE MetaFieldName = 'MarketAvailabilityDetailsCollection' 
            AND (CatalogContentProperty.LongString IS NOT NULL) 
            AND (CatalogContentProperty.ObjectId = dbo.CatalogEntry.CatalogEntryId)) AS MarketAvailability
     FROM            
         dbo.CatalogEntry 
     INNER JOIN
         dbo.NodeEntryRelation ON dbo.CatalogEntry.CatalogEntryId = dbo.NodeEntryRelation.CatalogEntryId 
     INNER JOIN
         dbo.CatalogNode AS CoverageNode ON dbo.NodeEntryRelation.CatalogNodeId = CoverageNode.CatalogNodeId 
     INNER JOIN
         dbo.CatalogNode AS RangeNode ON CoverageNode.ParentNodeId = RangeNode.CatalogNodeId 
     INNER JOIN
         dbo.CatalogContentProperty ON dbo.CatalogEntry.CatalogEntryId = dbo.CatalogContentProperty.ObjectId 
     INNER JOIN
         dbo.CatalogNode AS ModelNode ON RangeNode.ParentNodeId = ModelNode.CatalogNodeId 
     INNER JOIN
         dbo.CatalogNode AS BrandNode ON ModelNode.ParentNodeId = BrandNode.CatalogNodeId 
     WHERE        
         (dbo.CatalogEntry.ClassTypeId = N'Variation') AND
         (dbo.CatalogContentProperty.MetaFieldName = N'ItemIsChart') AND
         RangeNode.Name != 'C-MAP'  AND
         (BrandNode.Name = '' OR '' = '' OR '' IS NULL) AND
         (ModelNode.Name = '' OR '' = '' OR '' IS NULL) AND 
         (CoverageNode.Name = '' OR '' = '' OR '' IS NULL) AND
         (RangeNode.Name = '' OR '' = '' OR '' IS NULL) 
    ) AS CmapResults 
INNER JOIN
    (SELECT   
         GEOMETRY::STGeomFromText(CatalogContentProperty.LongString,4326) AS PolygonGeometry,
         CatalogContentProperty.LongString AS Polygon,
         CatalogContentProperty.ObjectId
     FROM       
         CatalogContentProperty                         
     WHERE   
         MetaFieldName = 'ItemChartCoordinates' AND 
         (CatalogContentProperty.LongString IS NOT NULL)) ccp ON ccp.ObjectId = CmapResults.Id 
WHERE 
    ((GEOGRAPHY::STGeomFromText(PolygonGeometry.MakeValid().STUnion(PolygonGeometry.MakeValid().STStartPoint()).STAsText(), 4326).STDistance(GEOGRAPHY::STGeomFromText('POINT(50.9835929 -1.4205852)', 4326)) / 1609.344) <= 100 OR 'POINT(50.9835929 -1.4205852)' IS NULL)
  AND MarketAvailability IS NOT NULL
ORDER BY 
     GEOGRAPHY::STGeomFromText(PolygonGeometry.MakeValid().STUnion(PolygonGeometry.MakeValid().STStartPoint()).STAsText(), 4326).STArea() DESC;
SELECT DISTINCT ce.Code as Sku
, max(case when ccp.MetaFieldName = 'ItemChartName' then ccp.LongString end) as 'Name'
, max(case when ccp.MetaFieldName = 'MarketAvailabilityDetailsCollection' then ccp.LongString end) as 'MarketAvailability'
, max(case when ccp.MetaFieldName = 'ItemChartCoordinates' then ccp.LongString end) as 'Polygon'
, CoverageNode.Name as Coverage
, RangeNode.Name as 'Range'

FROM dbo.CatalogEntry ce
  INNER JOIN dbo.NodeEntryRelation ner ON ce.CatalogEntryId = ner.CatalogEntryId
  INNER JOIN dbo.CatalogNode CoverageNode ON dbo.NodeEntryRelation.CatalogNodeId = CoverageNode.CatalogNodeId
  INNER JOIN dbo.CatalogNode RangeNode ON CoverageNode.ParentNodeId = RangeNode.CatalogNodeId
  INNER JOIN dbo.CatalogContentProperty ccp ON ce.CatalogEntryId = ccp.ObjectId
  INNER JOIN dbo.CatalogNode ModelNode ON RangeNode.ParentNodeId = ModelNode.CatalogNodeId
  INNER JOIN dbo.CatalogNode BrandNode ON ModelNode.ParentNodeId = BrandNode.CatalogNodeId

WHERE ce.ClassTypeId = N'Variation'
  and ccp.MetaFieldName = N'ItemIsChart'
  and RangeNode.Name != 'C-MAP'
  --and (BrandNode.Name = '' OR '' = '' OR '' IS NULL)      --  always true
  --and (ModelNode.Name = '' OR '' = '' OR '' IS NULL)      --  always true
  --and (CoverageNode.Name = '' OR '' = '' OR '' IS NULL)   --  always true
  --and (RangeNode.Name = '' OR '' = '' OR '' IS NULL)      --  always true
  and (GEOGRAPHY::STGeomFromText(GEOMETRY::STGeomFromText(ccp.LongString,4326).MakeValid().STUnion(GEOMETRY::STGeomFromText(ccp.LongString,4326).MakeValid().STStartPoint()).STAsText(), 4326).STDistance(GEOGRAPHY::STGeomFromText('POINT(50.9835929 -1.4205852)', 4326)) / 1609.344) <= 100   -- OR 'POINT(50.9835929 -1.4205852)' IS NULL    --  redundant
)
and max(case when ccp.MetaFieldName = 'MarketAvailabilityDetailsCollection' then ccp.LongString end)

ORDER BY GEOGRAPHY::STGeomFromText(GEOMETRY::STGeomFromText(ccp.LongString,4326).MakeValid().STUnion(GEOMETRY::STGeomFromText(ccp.LongString,4326).MakeValid().STStartPoint()).STAsText(), 4326).STArea() DESC;