у меня есть запрос 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
, но если он использует акцент, что мне делать, чтобы улучшить производительность?
ли вы ясно 'CACHE/BUFFERS' между выполнением запроса? – lad2025
Да, я очищаю CACHE после удаления второго 'COLLATE Latin1_General_CI_AI', производительность действительно улучшается, когда я добавляю' COLLATE Latin1_General_CI_AI' назад, производительность при поиске строки «tns» медленнее (около 1500 мс), но все же быстро, когда поиск строки «тон» –
Я проверил снова с очищающим кешем/буфером для каждого выполнения запроса. Результаты те же, что и выше. Время excute при поиске строки «tns» всегда слишком длиннее, чем поиск строки «ton» (1500 мс против 160 мс, с использованием 'COLLATE Latin1_General_CI_AI' на столбцах' t.Title' и 'sp.MaNhaSanXuat'), производительность улучшено, если не использовать 'COLLATE Latin1_General_CI_AI' в столбце' sp.MaNhaSanXuat' (240 мс против 90 мс) –