[Mssql] как оптимизировать вот такой запрос?
какие индексы есть на этих таблицах?
Если все поля, по которым соединяются таблицы, проиндексированы, и если есть индекс на MessageDT, то добавь подсказку принудительно использовать соединение вложенными циклами.
сколько записей в каждой из таблиц?какие индексы есть на этих таблицах?записец в Messages порядка 4000
в Cats порядка 40
в Subcats порядка 400
сделал так ен помогло. опять отрубили
FROM MessagesRN where RowNum >= @NumFrom and RowNum <= @NumTo
FOR XML AUTO, ELEMENTS
Наводит на мысль, что в XML должен парсится диапазон строк, но @NumFrom и @NumTo нули и нет конструкции order by, которая гарантировала бы повторяемость выборки
Если я правильно понимая, то выделение диапазона строк лучше делать до join.
P.S. MS SQL Server почти не знаю.
неужели у Вас дата храниться как строка в базе?
2. Вынести из with join'ы
P.S. Использование * не очень хороший стиль
1. Желательно исключить функцию dbo.dateFrom120вот интересно чем она мешает
2. Вынести из with join'ы
это как?
WITH MessagesRN AS
(
SELECT ROW_NUMBER OVER (order by MessageDT DESC) AS RowNum, m.*, dbo.dateFrom120(m.MessageDT, 0) as DT from Messages m
)
SELECT m.*,
sc.SubcatName, sc.SubcatCode,
c.CatName, c.CatCode, cs.CityName
FROM MessagesRN m
inner join Subcats sc on sc.SubcatID=m.SubcatID
inner join Cats c on c.CatID=sc.CatID
inner join Cities cs on cs.CityID=m.CityID
where RowNum >= @NumFrom and RowNum <= @NumTo
FOR XML AUTO, ELEMENTS
Был бы left join прокатило бы.
И вообще вот так наверно лучше
WITH MessagesRN AS
(
SELECT ROW_NUMBER OVER (order by MessageDT DESC) AS RowNum, m.*, dbo.dateFrom120(m.MessageDT, 0) as DT from Messages m
)
SELECT m.*,
sc.SubcatName,
sc.SubcatCode,
c.CatName,
c.CatCode,
cs.CityName
FROM MessagesRN m
inner join Subcats sc on sc.SubcatID=m.SubcatID and RowNum >= @NumFrom and RowNum <= @NumTo
inner join Cats c on c.CatID=sc.CatID
inner join Cities cs on cs.CityID=m.CityID
FOR XML AUTO, ELEMENTS
там еще where в другом случае добавляется если @CatID и @SubcatID итд не NULL
Ну это вроде как ID-шники и не должны быть NULL. Хотя если для Messages используется возможность записывать NULL вместо ID, то да, тогда мой запрос другой и эту проверку надо добавить.
ладно с запросом разобрались. откуда столько обращений к диску?
функции в запросе не используют обычно, ибо в неоптимизированном запросе они могут уменьшать производительность в н-раз в зависимости от сложности функции.
Обращений к диску может быть много, потому что кеша не хватает. А на самом деле - фиг знает - лично я архитектуру MS SQL не знаю.
Оставить комментарий
sanek300509
Народ поясните плиз.есть такая вещь
ALTER procedure [dbo].[off_bm_GetMessages]
@IfCnt bit = 0,
@NumFrom int = 0,
@NumTo int = 0,
@CatID int = null,
@SubcatID int = null,
@CityID int = null,
@MessageSearch text = null
as
if @IfCnt = 0
begin
WITH MessagesRN AS
(
SELECT ROW_NUMBER OVER (order by MessageDT DESC) AS RowNum,
m.*, dbo.dateFrom120(m.MessageDT, 0) as DT,
sc.SubcatName, sc.SubcatCode,
c.CatName, c.CatCode, cs.CityName
from Messages m
inner join Subcats sc on sc.SubcatID=m.SubcatID
inner join Cats c on c.CatID=sc.CatID
inner join Cities cs on cs.CityID=m.CityID
)
SELECT *
FROM MessagesRN where RowNum >= @NumFrom and RowNum <= @NumTo
FOR XML AUTO, ELEMENTS
хостинг рубанул вчера все базы аргументировав
где в данном запросе может быть трабл?
это повторяется раз в три месяца до этого я с ними бодался они ничего вразумительного сказать не могли и не закрывали, а вчера сцуки взяли и закрыли