C# 代替UNION以删除与UNION关联的独特检查(除非您知道这将复制结果) 或者,在(cp.PartNumber1,cp.PartNumber2)中移除接头并用pg.PartNumber替换接头 检查你的索引和len(p.Text01)>0将阻止使用索引搜索。请尝试,p.Text01不为空,p.Text01!=“0”取而代之 尝试为临时表编制索引在#零件组(零件号)上创建唯一聚集索引IX_零件组\u tmp,以及在#零件号1,零件号2上创建非聚集索引IX_coreParts\u tmp

C# 代替UNION以删除与UNION关联的独特检查(除非您知道这将复制结果) 或者,在(cp.PartNumber1,cp.PartNumber2)中移除接头并用pg.PartNumber替换接头 检查你的索引和len(p.Text01)>0将阻止使用索引搜索。请尝试,p.Text01不为空,p.Text01!=“0”取而代之 尝试为临时表编制索引在#零件组(零件号)上创建唯一聚集索引IX_零件组\u tmp,以及在#零件号1,零件号2上创建非聚集索引IX_coreParts\u tmp,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,尽量将数据处理保持在数据库中,因为数据平台为此进行了优化。尽可能多地过滤,只向客户返回所需内容。另一个想法是创建报表数据服务 这会在现有数据上运行,使用优化的报告结构填充一个单独的数据库,您的报告会在这上面运行,这应该快几个数量级,因为所有繁重的工作都是由报告服务完成的 一个缺点是,新数据将“过时”,这取决于更改填充到报告数据库的速度。许多企业不会注意到或在意数据已过期60秒或90秒,但这显然取决于您自己的用例。另一个想法是创建报告数据服务 这会在现有数据上运行,使用优化的报告结构填充一个单独的

尽量将数据处理保持在数据库中,因为数据平台为此进行了优化。尽可能多地过滤,只向客户返回所需内容。

另一个想法是创建报表数据服务

这会在现有数据上运行,使用优化的报告结构填充一个单独的数据库,您的报告会在这上面运行,这应该快几个数量级,因为所有繁重的工作都是由报告服务完成的


一个缺点是,新数据将“过时”,这取决于更改填充到报告数据库的速度。许多企业不会注意到或在意数据已过期60秒或90秒,但这显然取决于您自己的用例。

另一个想法是创建报告数据服务

这会在现有数据上运行,使用优化的报告结构填充一个单独的数据库,您的报告会在这上面运行,这应该快几个数量级,因为所有繁重的工作都是由报告服务完成的


一个缺点是,新数据将“过时”,这取决于更改填充到报告数据库的速度。许多企业不会注意到或关心数据已过期60秒或90秒,但这显然取决于您自己的用例。

我的方法是将计算列添加到表中:

ALTER TABLE CoreStockParts 
ADD PartNumber AS RTRIM(LTRIM((REPLACE(REPLACE(PartNo,' ',''), '-','')));

ALTER TABLE CoreParts
ADD PartNumber1 AS RTRIM(REPLACE(REPLACE(p.Text01,' ',''), '-','')),
    PartNumber2 AS RIGHT(p.Text01, LEN(p.Text01)-1);
现在您已经有了这些计算列,可以为它们编制索引:

CREATE NONCLUSTERED INDEX IX_CoreStockParts_PartNumber ON CoreStockParts (PartNumber)
    --INCLUDE ([Description], GroupCode)
不确定确切的表结构,但在索引中包含非键列可能有助于提高性能,如果您认为第二行会取消注释,请取消注释

CREATE NONCLUSTERED INDEX IX_CoreParts_PartNumber1__part ON CoreParts (PartNumber1)
    --WHERE Category = 'PART' AND LEN(Text01) > 0

CREATE NONCLUSTERED INDEX IX_CoreParts_PartNumber2__part ON CoreParts (PartNumber2)
    --WHERE Category = 'PART' AND LEN(Text01) > 0
根据您在其他地方使用该表的方式,此索引可能受益于作为筛选索引,必要时再次取消注释。您可能还需要有关
CoreStockPartsGroups.code
和“CoreStockParts.GroupCode”的更多索引

最后,我不会使用临时表,通常最好避免使用临时表,因为您会失去源表上现有索引的好处:

WITH PartGroups AS
(   SELECT  csp.PartNumber,
            csp.[Description], 
            csp.GroupCode, 
            ISNULL(cspg.[Group], 'Unknown') AS [Group], 
            ISNULL(cspg.SuperGroup, 'Unknown') AS SuperGroup
    FROM    CoreStockParts AS csp
            LEFT JOIN CoreStockPartsGroups AS cspg 
                ON csp.GroupCode = cspg.Code
)
SELECT  p.ID, 
        p.PartNumber1, 
        p.PartNumber2, 
        p.[Description], 
        CostAmount = p.Numeric01, 
        SaleAmount = p.Numeric02,
        ExtendedCostAmount = p.Numeric03, 
        ExtendedSaleAmount = p.Numeric04, 
        Quantity = p.Numeric05, 
        InvoiceDate = p.Date01, 
        pg.[Group], 
        pg.SuperGroup
FROM    Assets as p
        INNER JOIN partGroups AS pg 
            ON p.PartNumber1 = pg.PartNumber
WHERE   p.Category = 'PART'
AND     LEN(p.Text01) > 0 as cp
UNION 

SELECT  p.ID, 
        p.PartNumber1, 
        p.PartNumber2, 
        p.[Description], 
        CostAmount = p.Numeric01, 
        SaleAmount = p.Numeric02,
        ExtendedCostAmount = p.Numeric03, 
        ExtendedSaleAmount = p.Numeric04, 
        Quantity = p.Numeric05, 
        InvoiceDate = p.Date01, 
        pg.[Group], 
        pg.SuperGroup
FROM    Assets as p
        INNER JOIN partGroups AS pg 
            ON p.PartNumber2 = pg.PartNumber
WHERE   p.Category = 'PART'
AND     LEN(p.Text01) > 0 as cp;

在启用“显示实际计划”的SSMS中运行将通过添加索引建议进一步改进。

我的方法是将计算列添加到表中:

ALTER TABLE CoreStockParts 
ADD PartNumber AS RTRIM(LTRIM((REPLACE(REPLACE(PartNo,' ',''), '-','')));

ALTER TABLE CoreParts
ADD PartNumber1 AS RTRIM(REPLACE(REPLACE(p.Text01,' ',''), '-','')),
    PartNumber2 AS RIGHT(p.Text01, LEN(p.Text01)-1);
现在您已经有了这些计算列,可以为它们编制索引:

CREATE NONCLUSTERED INDEX IX_CoreStockParts_PartNumber ON CoreStockParts (PartNumber)
    --INCLUDE ([Description], GroupCode)
不确定确切的表结构,但在索引中包含非键列可能有助于提高性能,如果您认为第二行会取消注释,请取消注释

CREATE NONCLUSTERED INDEX IX_CoreParts_PartNumber1__part ON CoreParts (PartNumber1)
    --WHERE Category = 'PART' AND LEN(Text01) > 0

CREATE NONCLUSTERED INDEX IX_CoreParts_PartNumber2__part ON CoreParts (PartNumber2)
    --WHERE Category = 'PART' AND LEN(Text01) > 0
根据您在其他地方使用该表的方式,此索引可能受益于作为筛选索引,必要时再次取消注释。您可能还需要有关
CoreStockPartsGroups.code
和“CoreStockParts.GroupCode”的更多索引

最后,我不会使用临时表,通常最好避免使用临时表,因为您会失去源表上现有索引的好处:

WITH PartGroups AS
(   SELECT  csp.PartNumber,
            csp.[Description], 
            csp.GroupCode, 
            ISNULL(cspg.[Group], 'Unknown') AS [Group], 
            ISNULL(cspg.SuperGroup, 'Unknown') AS SuperGroup
    FROM    CoreStockParts AS csp
            LEFT JOIN CoreStockPartsGroups AS cspg 
                ON csp.GroupCode = cspg.Code
)
SELECT  p.ID, 
        p.PartNumber1, 
        p.PartNumber2, 
        p.[Description], 
        CostAmount = p.Numeric01, 
        SaleAmount = p.Numeric02,
        ExtendedCostAmount = p.Numeric03, 
        ExtendedSaleAmount = p.Numeric04, 
        Quantity = p.Numeric05, 
        InvoiceDate = p.Date01, 
        pg.[Group], 
        pg.SuperGroup
FROM    Assets as p
        INNER JOIN partGroups AS pg 
            ON p.PartNumber1 = pg.PartNumber
WHERE   p.Category = 'PART'
AND     LEN(p.Text01) > 0 as cp
UNION 

SELECT  p.ID, 
        p.PartNumber1, 
        p.PartNumber2, 
        p.[Description], 
        CostAmount = p.Numeric01, 
        SaleAmount = p.Numeric02,
        ExtendedCostAmount = p.Numeric03, 
        ExtendedSaleAmount = p.Numeric04, 
        Quantity = p.Numeric05, 
        InvoiceDate = p.Date01, 
        pg.[Group], 
        pg.SuperGroup
FROM    Assets as p
        INNER JOIN partGroups AS pg 
            ON p.PartNumber2 = pg.PartNumber
WHERE   p.Category = 'PART'
AND     LEN(p.Text01) > 0 as cp;

在启用“显示实际计划”的SSMS中运行将建议通过添加索引进行进一步改进。

您可以构建一个视图并查询它吗?不,不是,@O.O.。但是,为了真正帮助您,我们需要查看表的定义以及正在运行的执行计划。你很可能遗漏了重要指标,或者干脆拒绝使用它们(
len(p.Text01)>0
),通常最好将大量数据返回给C,然后让C处理数据的操作-什么?我会说完全相反的事实!数据库是专门为处理数据集而设计的。您是否尝试过删除临时表,只使用一个返回数据的大查询。@O.O,我感觉您在进行跟踪,您的解决方案避免了相同的内存空间,并且确实强制对大量数据集进行网络访问@TMNT2014,我认为他需要它们,因为他的密钥是嵌套的标量混乱,这将避免索引。他的解决方案只是局部的,他需要在
#coreparts
#partgroups
上建立一个索引,用于最终连接。你能构建一个视图并查询它吗?不,不是,@O.O.。但是,为了真正帮助你,我们需要查看表的定义,以及正在运行的执行计划。你很可能遗漏了重要指标,或者干脆拒绝使用它们(
len(p.Text01)>0
),通常最好将大量数据返回给C,然后让C处理数据的操作-什么?我会说完全相反的事实!数据库是专门为处理数据集而设计的。您是否尝试过删除临时表,只使用一个返回数据的大查询。@O.O,我感觉您在进行跟踪,您的解决方案避免了相同的内存空间,并且确实强制对大量数据集进行网络访问@TMNT2014,我认为他需要它们,因为他的密钥是嵌套的标量混乱,这将避免索引。不管怎么说,他的解决方案只是局部的,他需要一个关于
#coreparts
#partgroups
的索引来进行最后的连接感谢@Gusman的输入,但不幸的是,这属于“不,按我们的方式做”的安全领域。正如你所说,分离长期服务是好的——这并不意味着要花那么长的时间。对于我们较小的数据库来说,可能运行良好,但作为一个覆盖,所有开发通常都是在我们较大的客户数据库上作为测试数据进行的。当反对“按我们的方式进行”时,“您的方式赢了”这一事实总是很重要的