Я не очень большой эксперт по TSSQL. У нас есть запрос, который возвращает почти 2 миллиона записей. Для запуска требуется более 2,5 минут. Мы добавили индексы, и это сократилось на одну минуту (раньше на это уходило 3,5 минуты), но 2,5 минуты все еще слишком медленно.
Может кто-нибудь показать мне, как изменить этот запрос, чтобы улучшить его производительность? Я подозреваю, что изменение должно произойти с оператором «in» и с тем, как рассчитывается значение «LOCATION», но я не уверен, как это сделать.
select distinct
A.ptid,
A.ptmgrx,
A.ptmgry,
A.fename,
B.fename XFENAME,
A.rt1 route,
A.pr,
A.mp,
A.rdbranch,
A.gs grade,
A.cs,
A.csmp,
A.cspath,
(select distinct twpname from tamc.dbo.fipsmdot where fipscode = A.fmcdl) + '; ' +
(select distinct county from tamc.dbo.fipsmdot where fipsco = A.countyl) + ' County, ' +
(select distinct twpname from tamc.dbo.fipsmdot where fipscode = A.fmcdr) + '; ' +
(select distinct county from tamc.dbo.fipsmdot where fipsco = A.countyr) + ' County' LOCATION
from intersectionApproaches A INNER JOIN intersectionApproaches B ON A.ptid = B.ptid
where A.ptid in
(select distinct C.ptid from intersectionApproaches C, intersectionApproaches B
where C.ptid = B.ptid)
Изменения:
Сервер БД - это MS SQL Server 2008.
У меня есть план выполнения, но, кажется, нет способа сделать его видимым. Сохраняется в виде файла .sqlplan. Не уверен, что это будет работать для кого-то еще.
Но я могу предоставить некоторую информацию от него.
29% времени тратится на различную сортировку.
15% времени тратится на создание "катушки индекса" (это происходит три раза)
6% затрачивается на «настольную катушку» (только один раз)
8% делают "Сортировку"
Чтобы ответить JNK:
Исходный запрос находился в хранимой процедуре и принимал несколько параметров, которые ограничивали набор результатов.
Вот оригинальный запрос с этими параметрами:
select distinct
A.ptid,
A.ptmgrx,
A.ptmgry,
A.fename,
B.fename XFENAME,
A.rt1 route,
A.pr,
A.mp,
A.rdbranch,
A.gs grade,
A.cs,
A.csmp,
A.cspath,
(select distinct twpname from tamc.dbo.fipsmdot where fipscode = A.fmcdl) + '; ' +
(select distinct county from tamc.dbo.fipsmdot where fipsco = A.countyl) + ' County, ' +
(select distinct twpname from tamc.dbo.fipsmdot where fipscode = A.fmcdr) + '; ' +
(select distinct county from tamc.dbo.fipsmdot where fipsco = A.countyr) + ' County' LOCATION
from intersectionApproaches A INNER JOIN intersectionApproaches B ON A.ptid = B.ptid
where A.ptid in
(select distinct C.ptid from intersectionApproaches C, intersectionApproaches B
where C.ptid = B.ptid
and (C.fename + isnull(' ' + C.fetype,'') like @str + '%' or @str in (C.rt1name, C.rt2name, C.rt3name)) and (B.fename + isnull(' ' + B.fetype,'') like @xstr + '%' or @xstr in (B.rt1name, B.rt2name, B.rt3name)))
Надеюсь, это поможет объяснить, что произошло. Я удалил последнюю часть предложения where, так как пытался получить набор результатов, который не был отфильтрован этими параметрами. Вместо этого я хочу переместить это в представление.
Подробнее Редактирование:
Таблица «Перекрестные подходы» - это таблица подходов к перекрестку. Например, стандартное пересечение дорог состоит из 4 подъездов (по одному на каждую сторону пересечения, с которой движение может приблизиться к перекрестку). Первоначальная цель хранимой процедуры состояла в том, чтобы вернуть список подходов пересечения, соответствующих определенной паре названий улиц.
Например, у вас есть "Main" и "1st", и у них есть пересечение.
Существует четыре подхода пересечения для этого пересечения.
"Главный и 1-й"
"1-й и главный"
"1-й и 1-й"
«Главное и главное»
Все они имеют один и тот же PTID, который является ID пересечения.
Однако в таблице IntersectionApproaches есть только одно поле для названия улицы "FENAME". Чтобы завершить запись, нам нужно название соответствующего перекрестка (отсюда и «B.Fename XFENAME» в запросе). Это позволяет нам запросить результат и сказать «достань мне все записи с улицей« Мэйн »и перекрестком с« 1-й »». Кроме того, нам также необходимо заполнить значение «LOCATION», как это определено несколькими операторами «выбрать разные» в запросе, потому что мы можем фильтровать и это.
Я пытался сделать это в виде, вместо того, чтобы сначала указывать перекрестные улицы, чтобы получить управляемый набор записей, а затем снова выполнить фильтрацию в поле Местоположение. Текущая хранимая процедура не помогает мне с поиском или сортировкой. Я просто хотел, чтобы все это было видно, чтобы я мог работать с ним более естественно.
Надеюсь, это поможет ...