Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Int23
Guest |
Вот есть у меня запросы, в которых я выбираю масштаб детализации и прямоугольник координат, который необходимо извлекать. Когда фильтрую по одному условию (либо масштаб, либо прямоугольник), то все выполняется быстро. А по обоим условиям долго. Вот мои запросы1. SELECT * FROM [M0].[dbo].[water_levels_polygon] where [Level]=@level 0.4 сек. , 1135 строк, ------------------- 2. SELECT * FROM [M0].[dbo].[water_levels_polygon] where [Level]=@level and @region.STIntersects([geom])=1 7 сек, 455 строк, ------------------- Тот же запрос для крупного масштаба и меньшего прямоуголььника 260 строк, 0.4 сек. Мне нужно чтобы запрос 2 работал быстро. В аттаче план выполнения К сообщению приложен файл (exex_plan2.sqlplan - 91Kb) cкачать ![]() |
30 авг 12, 13:41 [13088563] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
У вас не актуальный план, а оценочный. При этом пишет: Columns With No Statistics: [M0].[sys].[extended_index_1285579618_384000].Cell_Attributes; [M0].[sys].[extended_index_1285579618_384000].SRID; [M0].[sys].[extended_index_1285579618_384000].pk0Что какбэ намекает что нужно обновить статистику. UPDATE STATISTICS dbo.water_levels_polygon WITH FULLSCAN; Но я не спец, может быть этого мало (или не так или мало чё даст). Планы могут быть разными для других "масштабов". Но главное другое - spatial индексы не реактивные сами по себе, просто с ними лучше чем без них. PS: Скалярки зло, и не опускайте никогда имена схем (dbo) в названиях. |
30 авг 12, 16:20 [13089902] Ответить | Цитировать Сообщить модератору |
serg3
Guest |
Тут даже проблема в том что геометрический индекс сильно замедляет, из-за того что плохо подходит такой план. Если фильтрацию разбить на 2 прохода (через временную таблицу): сначала по числовому полю, потом по геометрическому. То ускоряется 10-15 раз. Просто число строк которые оставляет фильтр по геометрическому полю - миллионы (и они перебираются), а фильтр по [Level] оставляет только 1000 строк. SELECT * into #temp1 FROM [M0].[dbo].[water_levels_polygon] where [Level]=@level select * from #temp1 where [geom].STIntersects(@region)=1 drop table #temp1 Так понимаю, единственный выход : для каждого значения [Level], создать отдельный столбец [geom], либо для каждого заначения [Level] по отдельной таблице? |
||
30 авг 12, 17:26 [13090464] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
Или обновится. Ибо обещали что кое что улучшили. Какая версия. |
30 авг 12, 22:23 [13091845] Ответить | Цитировать Сообщить модератору |
serg3
Guest |
Версия 2008 R2 Хотя обновиться врядли получится. |
31 авг 12, 10:55 [13093279] Ответить | Цитировать Сообщить модератору |
serg3
Guest |
В версии 2012 примерно также работает(процентов на 20% быстрее) |
19 окт 12, 13:52 [13346672] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |