[英]a query optimisation on Sql Server 2005
我們在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]
第二是;
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]
我們有一個查詢取決於這兩個,如下:
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';
如你所知,我們用[language] ='en'選擇所有記錄但如果沒有'en'記錄,則查詢采用'de'(默認)。 但該查詢需要更長的時間(大約13秒)。
你認為任何其他優雅的方法可以減少相同的結果嗎?
提前感謝您提供的任何幫助。
可能很慢,因為當case語句評估null並運行子查詢時,它必須按需執行查詢。
也許這會更快,總是連接到'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');
試試這個:
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.