2016-04-14 5 views
0

у меня есть запрос SQL, который используется для поиска имени в двух столбцах:КОПИЙ Latin1_General_CI_AI медленная работа с различными строками

set statistics time on 
select top 200 lsp.Id, sp.Id as SanPhamId, t.Title, sp.MaNhaSanXuat, lsp.NhaSanXuat_id, ISNULL(lsp.GiaSi, 0) AS GiaSi, ISNULL(lsp.GiaLe, 0) AS GiaLe, ISNULL(lsp.GiaThau, 0) AS GiaThau 
    , ISNULL(lsp.GiaVangLai, 0) AS GiaVangLai, ISNULL(lsp.GiaLoai1, 0) AS GiaLoai1, ISNULL(lsp.GiaLoai2, 0) AS GiaLoai2, ISNULL(lsp.GiaLoai3, 0) AS GiaLoai3, ISNULL(lsp.GiaLoai4, 0) AS GiaLoai4, ISNULL(lsp.ChietKhau, 0) AS ChietKhau, ta.TermRecord_id 
    , case when aut.DisplayAlias in(N'donvi/cay-x-met', 'donvi/tam-x-met', 'donvi/cuon-x-met') then cast(sp.SoLuongCoTheBan as nvarchar) + ' x '+ cast(sp.ChieuDaiCoTheBan as nvarchar) 
    when aut.DisplayAlias = N'donvi/cay-x-met-cđ' then case sp.TinhTrang when 'TonKho' then cast(round(sp.ChieuDaiCoTheBan/sp.ChieuDaiNhap, 2) as nvarchar) else cast(sp.SoLuongCoTheBan as nvarchar) end 
    else cast(sp.SoLuongCoTheBan as nvarchar) end as CotheBan 
    , sp.TinhTrang, aut.DisplayAlias, autlh.DisplayAlias as LoaiHang 
from 
    Futurify_QLBH_KhoHang_LoaiSanPhamPartRecord lsp 
    inner join Orchard_Taxonomies_TermContentItem ta on lsp.Id = ta.TermsPartRecord_id 
    inner join Orchard_Framework_ContentItemVersionRecord pub on pub.ContentItemRecord_id = lsp.Id 
    inner join Title_TitlePartRecord t on t.Id = pub.Id 
    inner join Futurify_QLBH_KhoHang_SanPhamPartRecord sp on sp.LoaiSanPham_id = lsp.Id 
    inner join Orchard_Framework_ContentItemVersionRecord spver on spver.ContentItemRecord_id = sp.Id 
    inner join Orchard_Autoroute_AutoroutePartRecord aut on aut.ContentItemRecord_id = sp.DonVi_Id 
    inner join Orchard_Framework_ContentItemVersionRecord termVer on termVer.Id = aut.Id 
    inner join Orchard_Taxonomies_TermContentItem termlh on lsp.Id = termlh.TermsPartRecord_id 
    inner join Orchard_Framework_ContentItemVersionRecord termlhver on termlh.TermRecord_id = termlhver.ContentItemRecord_id 
    inner join Orchard_Autoroute_AutoroutePartRecord autlh on autlh.Id = termlhver.Id 
where ta.Field IN ('DonVi', 'LoaiSong') AND termVer.Published = 1 and pub.Published = 1 and spver.Published = 1 and sp.TrangThaiSanPham = 'Active' and termlhver.Published = 1 and termlh.Field = 'LoaiHang' 
    and (t.Title LIKE N'%tns%' COLLATE Latin1_General_CI_AI or sp.MaNhaSanXuat LIKE N'%tns%' COLLATE Latin1_General_CI_AI) 
order by lsp.Id 
set statistics time off 

Моей проблемой является линией (рядом с последней строкой)

and (t.Title LIKE N'%tns%' COLLATE Latin1_General_CI_AI or sp.MaNhaSanXuat LIKE N'%tns%' COLLATE Latin1_General_CI_AI) 

Когда я ищу строку «tns», производительность слишком медленная: время CPU = 1515 мс, истекшее время = 1530 мс.

Но когда я ищу строку «тонна»: время процессора = 203 мс, прошедшее время = 204 мс.

Затем я удалил второй COLLATE Latin1_General_CI_AI

and (t.Title LIKE N'%tns%' COLLATE Latin1_General_CI_AI or sp.MaNhaSanXuat LIKE N'%tns%') 

Производительность при поиске строки «ТНС» улучшается: время ЦП = 203 мс, прошедшее время = 205 мс.

И производительность при поиске строки «тонна» также улучшена: время процессора = 79 мс, прошедшее время = 138 мс.

Что сделал COLLATE Latin1_General_CI_AI?

Почему производительность, когда я ищу эти строки настолько разными?

Удачи, что колонка sp.MaNhaSanXuat не использует акцент, поэтому я могу удалить второй COLLATE Latin1_General_CI_AI, но если он использует акцент, что мне делать, чтобы улучшить производительность?

+1

ли вы ясно 'CACHE/BUFFERS' между выполнением запроса? – lad2025

+0

Да, я очищаю CACHE после удаления второго 'COLLATE Latin1_General_CI_AI', производительность действительно улучшается, когда я добавляю' COLLATE Latin1_General_CI_AI' назад, производительность при поиске строки «tns» медленнее (около 1500 мс), но все же быстро, когда поиск строки «тон» –

+0

Я проверил снова с очищающим кешем/буфером для каждого выполнения запроса. Результаты те же, что и выше. Время excute при поиске строки «tns» всегда слишком длиннее, чем поиск строки «ton» (1500 мс против 160 мс, с использованием 'COLLATE Latin1_General_CI_AI' на столбцах' t.Title' и 'sp.MaNhaSanXuat'), производительность улучшено, если не использовать 'COLLATE Latin1_General_CI_AI' в столбце' sp.MaNhaSanXuat' (240 мс против 90 мс) –

ответ

0

Попробуйте использовать двоичную сортировку для повышения производительности:

ALTER TABLE dbo.Title_TitlePartRecord 
    ADD Title2 AS UPPER(VarCol) COLLATE Latin1_General_100_Bin2 PERSISTED 
GO 

ALTER TABLE dbo.Futurify_QLBH_KhoHang_SanPhamPartRecord 
    ADD MaNhaSanXuat2 AS UPPER(MaNhaSanXuat) COLLATE Latin1_General_100_BIN2 PERSISTED 
GO 


DECLARE @mask NVARCHAR(100) = N'tns' 

... 
WHERE ta.Field IN ('DonVi', 'LoaiSong') 
    AND termVer.Published = 1 
    AND pub.Published = 1 
    AND spver.Published = 1 
    AND sp.TrangThaiSanPham = 'Active' 
    AND termlhver.Published = 1 
    AND termlh.Field = 'LoaiHang' 
    AND (
      t.Title2 LIKE N'%' + UPPER(@mask) + N'%' COLLATE Latin1_General_100_Bin2 
     OR 
      sp.MaNhaSanXuat LIKE N'%' + UPPER(@mask) + N'%' COLLATE Latin1_General_100_Bin2 
    ) 
... 
OPTION(RECOMPILE) 
Смежные вопросы