简体   繁体   English

Sql Server 2005上的查询优化

[英]a query optimisation on Sql Server 2005

we have two related tables(inventory and inventoryLocalization) on Sql Server 2005. the first table's script. 我们在Sql Server 2005上有两个相关的表(inventory和inventoryLocalization)。第一个表的脚本。

CREATE TABLE [dbo].[inventory](
    [code] [varchar](35) NOT NULL,
    [salePrice1] [decimal](22, 2) NULL,
 CONSTRAINT [PK_inventory] PRIMARY KEY CLUSTERED 
(
    [code] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

and the second is; 第二是;

CREATE TABLE [dbo].[inventoryLocalization](
    [code] [varchar](35) NOT NULL,
    [language] [varchar](2) NOT NULL,
    [name] [nvarchar](100) NOT NULL,
    [description] [nvarchar](max) NULL,
 CONSTRAINT [PK_inventoryLocalization] PRIMARY KEY CLUSTERED 
(
    [code] ASC,
    [language] ASC,
    [name] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

And we have a query depends on these two, as follows: 我们有一个查询取决于这两个,如下:

select  i.[code],
        iL.[language], 
        case  
        when iL.[name] is null then (select iL2.name  from dbo.inventoryLocalization iL2 where iL2.[language] = 'de' and iL2.code = i.[code])
        else iL.[name]
        end as [name]
from dbo.inventory i
left join dbo.inventoryLocalization iL on i.code = iL.code and iL.[language] =  'en';

as you guess, we select all records with [language] = 'en' but if there is no record for 'en', query takes 'de'( as default). 如你所知,我们用[language] ='en'选择所有记录但如果没有'en'记录,则查询采用'de'(默认)。 But that query takes much longer (approximately 13 seconds). 但该查询需要更长的时间(大约13秒)。

Do you think any other elegant methods for the same result to reduce the amount of time it takes ? 你认为任何其他优雅的方法可以减少相同的结果吗?

Thanks in advance for any assistance you can provide. 提前感谢您提供的任何帮助。

Probably slow because it has to do a query on demand when the case statement evaluates a null and runs the sub-query. 可能很慢,因为当case语句评估null并运行子查询时,它必须按需执行查询。

Maybe this will be faster, always do the join to 'de' rather than it doing a query each time a null is found. 也许这会更快,总是连接到'de'而不是每次找到null时都进行查询。

select  i.[code],
        iL.[language], 
        case  
        when iL.[name] is null then iL2.name
        else iL.[name]
        end as [name]
from dbo.inventory i
left join dbo.inventoryLocalization iL on i.code = iL.code and iL.[language] =  'en'
left join dbo.inventoryLocalization iL2 on i.code = iL2.[code] and iL2.[language] = 'de'
select i.code
      ,coalesce(en.language, de.language) as language
      ,coalesce(en.name, de.name) as name
  from inventory i
  left join inventoryLocalization en on(i.code = en.code and en.language = 'en')
  left join inventoryLocalization de on(i.code = de.code and de.language = 'de');

Try this: 试试这个:

select  i.[code],
        iL.[language], 
        coalesce(il.[name],il2.[name],'Unknown') as [name]
from dbo.inventory i
left join dbo.inventoryLocalization iL on i.code = iL.code and iL.[language] =  'en';
left join  dbo.inventoryLocalization iL2 on i.code=il2.code and il2.[language] = 'de'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM