Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / КЛАДР, улучшение скорости запросов / 25 сообщений из 35, страница 1 из 2
08.11.2010, 10:48
    #36941610
zvezda_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
Здравствуйте!

Подскажите пожалуйста как правильно написать индексы для таблиц КЛАДР расположенных на Microsoft SQL Server 2005?

Или же есть другие способы увеличить скорость выполнения запросов к таблицам КЛАДР?

В приложении используются запросы, вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//выбираем районы и города относящиеся непосредственно к региону	
mssql_query("SELECT * FROM dbo.kladr WHERE
((left(CODE,2) ='$region' and right(CODE, 8) = '00000000') 
OR
(left(CODE,5) ='".$region."000' and right(CODE, 5) = '00000')
OR
(left(CODE,8) ='".$region."000000' and right(CODE, 2) = '00'))
AND CODE<>'".$region."00000000000' ORDER BY name");

//выбираем населённый пункты и улицу относящиеся непосредственно к городу
mssql_query("SELECT name,socr,code,[index] FROM dbo.kladr  WHERE 
(left(CODE,8) = '".$region.$district.$city."' and right(CODE, 2) = '00')
AND CODE<>'".$region.$district.$city."00000' 
UNION
SELECT name,socr,code,[index] FROM dbo.street WHERE 
left(CODE,11) = '".$region.$district.$city."000' and right(CODE, 2) = '00' ORDER BY name ");
Заранее огромное спасибо!
...
Рейтинг: 0 / 0
08.11.2010, 14:39
    #36942442
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
заменить OR на union
заменить left(CODE,11) на like
или попробовать computed column index
...
Рейтинг: 0 / 0
08.11.2010, 14:40
    #36942446
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
как вариант - indexed вью
...
Рейтинг: 0 / 0
08.11.2010, 14:53
    #36942501
zvezda_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
ScareCrow
заменить left(CODE,11) на like

в первоначальном варианте использовалась инструкция - like, запрос выполнялся медленнее
...
Рейтинг: 0 / 0
08.11.2010, 14:56
    #36942513
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
как вариант не использовать структуру КЛАДР "как есть", а рекструктуризовать в более удобный вид, например, 1С так и поступает
...
Рейтинг: 0 / 0
08.11.2010, 15:13
    #36942590
zvezda_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
Naf , хочу использовать КЛАДР как есть.
...
Рейтинг: 0 / 0
08.11.2010, 20:37
    #36943531
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
zvezda_t Naf , хочу использовать КЛАДР как есть.Добавьте к исходной структуре всего один столбец - ParentID и сделайте обычно дерево. "Деревянные" запросы помогут избежать таких предикатов
Код: plaintext
and right(CODE,  5 ) = '00000'
и других, что не зер гут. Вычисляемые выражения, как известно, индексами не могут пользоваться.
...
Рейтинг: 0 / 0
09.11.2010, 07:54
    #36943891
zvezda_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
Senya_L
авторВычисляемые выражения, как известно, индексами не могут пользоваться.
спасибо, что вовремя предупредили!
Позвольте вопрос?
Вычисляемые-это вида:
Код: plaintext
left(CODE, 2 ) ='$region'
а если писать:
Код: plaintext
CODE ='$region'
, то индексы помогут улучшить быстродействие так?

авторДобавьте к исходной структуре всего один столбец - ParentID и сделайте обычно дерево.
скажите пожалуйста можно это как то автоматически сделать?
подскажите пожалуйста, как такое дерево создать...
...
Рейтинг: 0 / 0
09.11.2010, 12:01
    #36944431
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
Здравствуйте zvezda_t!,

в продолжении разговора про адреса:
zvezda_t
у меня есть кладр, но бывают случаи когда - хочешь - не хочешь приходиться адрес в ручную вбивать - ибо кладр не совершенен и некоторых адресов там нет.
вот поэтому я решила сделать отдельную таблицу для тех адресов которые не нашлись по кладр - или лучше оставить дополнительные адресные поля в каждой из таблиц?

Мы тогда решили, что лучше в одну таблицу адреса заводить.
Но я так понимаю вы все равно из самого кладра запросы строите.
Вам же не все адреса нужны, которые в кладре есть? Я так понимаю.
Т.е. Вам нужно хранить только нужные адреса в Вашей таблице, включая те, которые в кладре есть и те которых там нет.
И работать с ней, а не с кладром.
Кладр используется только во время ввода данных в таблицу адресов.
Например:
- триггер или просто процедурка на проверку правильности ввода адресов.
- представляет список улиц/областей и прочее на форме для ввода адреса.

А так если отвечать на Ваш вопрос, то два пути:
1) при перекачке KLADR в таблицы добавить дополнительные поля, по которым вы и будете строить запросы
2) если не хочется корректировать структуру (что странно, при закачке ведь все равно...), то можно посложнее сделать добавить доп. таблицы :
KLADR_EX
id
CODE - ссылка на кладр (по коду)
tip - тип, по которому будет отсеиватся записи, можно еще другие поля добавить

select * from dbo.kladr a inner join dbo.kladr_ex b on a.code = b.code where b.tip = ...

Т.е для каждой таблицы кладра будет соответсвующая "теневая "таблица в котором будут вычесленные поля.
На эти поля в любом из вариантов можно построить индекс.
...
Рейтинг: 0 / 0
09.11.2010, 12:29
    #36944529
zvezda_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
авторМы тогда решили, что лучше в одну таблицу адреса заводить.
Но я так понимаю вы все равно из самого кладра запросы строите.
Вам же не все адреса нужны, которые в кладре есть? Я так понимаю.
Т.е. Вам нужно хранить только нужные адреса в Вашей таблице, включая те, которые в кладре есть и те которых там нет.
И работать с ней, а не с кладром.

Да, я из самого КЛАДРа запросы строю, потому что есть необходимость адреса менять, и тогда вновь открывается форма ввода адреса с использованием кладра, но эта форма грузиться очень долго, потому что адреса извлекаются по ранее сохранённому коду, идет полная расшифровка адреса, плюс подгружаются варианты выбора для каждого из адресов...
...
Рейтинг: 0 / 0
09.11.2010, 12:53
    #36944602
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
zvezda_t
Да, я из самого КЛАДРа запросы строю

Ну не совсем правильно это...
Я живу в поселке, там 3 улицы.
Представляете, если в проге, где будут только люди из моего поселка, будут постоянно выполнятся запросы с кладром, где море адресов.
Это с проектной точки зрения неэффективно.
Если есть таблица адресов (своя) где хранятся адреса для людей в базе, то нет смысла лазить в кладр. Вед в той таблице будут поля: КодГорода, НаименованиеГорода и.т.д.
zvezda_t
потому что есть необходимость адреса менять
и тогда вновь открывается форма ввода адреса с использованием кладра, но эта форма грузиться очень долго, потому что адреса извлекаются по ранее сохранённому коду, идет полная расшифровка адреса, плюс подгружаются варианты выбора для каждого из адресов...
Ну может проблема тут еще в неэффективной работы с кладром на форме выбора адреса.
Тут примерно так:
Выбирается в списке область - получаем код.
Выбираем в списке город (отсеивается по области, т.е. показывем города только данной области) - получаем код.
Т.е. пошагово, не надо грузить все города и улицы в элементы управления.
Есть поле редактирования и справа некая кнопочка <...> по нажатию на которую выводится форма со списком. Во время нажатия на эту кнопочку происходить обращение к кладру.
Коды выбранных адресов, сохраняются и происходить сверка и прочие проверки с кладром.

При перекачке данных из кладра никто желательно не просто перекидывать таблички оттуда, а написать программу, которая постоит нужные дополнительные поля и индексы во врема алгоритма перекачки данных из кладра в Вашу базу... Тем более всякие "$region.$district.$city" вам явно не нужны, почему бы это не преобразовать при перекачке данных из кладра.

Простите если чего не так сказал и за много слов.
...
Рейтинг: 0 / 0
09.11.2010, 14:34
    #36944949
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
авторвычисляемые выражения, как известно, индексами не могут пользоваться.
моя плакает горючими слезами.
...
Рейтинг: 0 / 0
09.11.2010, 15:00
    #36945048
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
Да, пока Вы юзаете КЛАДР "как есть" клятая 1С прекрасно конвертирует его в свой регистр сведений с удобной разбивкой полей и их индексацией
...
Рейтинг: 0 / 0
09.11.2010, 16:56
    #36945437
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
...
Рейтинг: 0 / 0
09.11.2010, 23:41
    #36946026
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
ScareCrowавторвычисляемые выражения, как известно, индексами не могут пользоваться.
моя плакает горючими слезами.Формулировка не нравится? Я ж как попроще автору объяснить. При желании можно достигнуть Index Seek и по вычисляемым полям, но лучше не надо... ;)
...
Рейтинг: 0 / 0
09.11.2010, 23:47
    #36946028
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
zvezda_tскажите пожалуйста можно это как то автоматически сделать?
подскажите пожалуйста, как такое дерево создать... КЛАДР
...
Рейтинг: 0 / 0
09.11.2010, 23:52
    #36946034
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
zvezda_tВ приложении используются запросы, вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//выбираем районы и города относящиеся непосредственно к региону	
mssql_query("SELECT * FROM dbo.kladr WHERE
((left(CODE,2) ='$region' and right(CODE, 8) = '00000000') 
OR
(left(CODE,5) ='".$region."000' and right(CODE, 5) = '00000')
OR
(left(CODE,8) ='".$region."000000' and right(CODE, 2) = '00'))
AND CODE<>'".$region."00000000000' ORDER BY name")

Абзац... Автора выгнать, КЛАДР распилить по уровням, выборки делать с помощью BETWEEN.

zvezda_tЗаранее огромное спасибо!
Не за что .
...
Рейтинг: 0 / 0
10.11.2010, 08:16
    #36946222
zvezda_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
NafДа, пока Вы юзаете КЛАДР "как есть" клятая 1С прекрасно конвертирует его в свой регистр сведений с удобной разбивкой полей и их индексацией
Naf , но я же не использую 1С. или Вы предлагаете от туда структуру как то перенести?


ScareCrow
, так всё таки в моём случае можно делать индексацию что-ли?

Dim2000
Абзац... Автора выгнать, КЛАДР распилить по уровням, выборки делать с помощью BETWEEN.


Dim2000 , не выгоняйте меня пожалуйста, я исправлюсь...
Распелить по уровням - значит сделать иерархию, добавив дополнительное поле ParentID как предлагал Senya_L ?
...
Рейтинг: 0 / 0
10.11.2010, 08:34
    #36946234
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
zvezda_tРаспилить по уровням - значит сделать иерархию, добавив дополнительное поле ParentID как предлагал Senya_L ?Скорее он имеет в виду раскидать элементы КЛАДРа по 5 таблицам в соответствии с количеством уровней оригинального классификатора.

ИМХО, лучше так не делать. Конечно, если "дружите" с CTE-запросами. ;) С кладром в виде дерева исходная задача решается элементарно с помощью нехитрого запроса с самосоединением:
Код: plaintext
1.
2.
3.
4.
5.
-- все районы и города регионального подчинения
select
..............
from Kladr KP
  join Kladr KK on KP.KladrID = KK.ParentID
where KP.ParentID is null
Со вторым запросом "выбираем населённый пункты и улицу относящиеся непосредственно к городу" - с этим сложнее, но постановка какая-то неестественная. Обычно еще и уточняют конкретный город. Что, кстати, относится и к первому запросу. Тогда задача решается не менее элементарно:
Код: plaintext
1.
2.
3.
4.
select
..............
from Kladr KP
  join Kladr KK on KP.KladrID = KK.ParentID
where KP.KladrID = @KladrID
Как решить задачу с "распиленным" КЛАДРом предоставляю оценить Вам. Я испробовал оба подхода. С "деревом" лучше. Хотя бы потому, что это мое решение =)
...
Рейтинг: 0 / 0
10.11.2010, 08:42
    #36946237
zvezda_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
Senya_LСо вторым запросом "выбираем населённый пункты и улицу относящиеся непосредственно к городу" - с этим сложнее, но постановка какая-то неестественная. Обычно еще и уточняют конкретный город. Что, кстати, относится и к первому запросу.
Senya_L , да конечно, указывается конкретный город, что задается через переменные $region.$district.$city, а для первого запроса конкретный регион задается через переменную - $region.

Спасибо Вам за объяснение!!!
...
Рейтинг: 0 / 0
10.11.2010, 09:12
    #36946256
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
zvezda_t,

Вообще-то выбирать одной кучей и районы, и города - не камильфо. Пользователя можно не любить, но уважать его время надо :)
...
Рейтинг: 0 / 0
10.11.2010, 10:32
    #36946430
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
zvezda_t,

Вот еще мысли, может что понадобится, не знаю (видел готовое решение):

1. Таблица <Адреса> пример:
[id] = ...
[тип_адреса] = ...
[код_региона] = 50
[Район] = 'Клинский'
[город] = 'Высоковск'
[Населенный пункт]
[Улица]
[Дом]
[Корпус]
[Квартира]
[Код города] = '5001100200000'
[Код населенного пункта] = '5001100001000'
[Код района] = '5001100000000'
[Код улицы] = '55000000000124000'

2. Не нужно объединять районы + города, населенные пункты + улицы, а выбирать отдельно их.

3. Индексы строятся на кладровском поле CODE.

4. Запросы к кладру лучше, где это возможно, делать SELECT ... WHERE CODE = {Выражение} - тогда точно по индексу будет выбираться.

5. Главное правильно организовать форму ввода адреса.
...
Рейтинг: 0 / 0
10.11.2010, 11:29
    #36946639
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
авторScareCrow, так всё таки в моём случае можно делать индексацию что-ли?
можно. через две вещи
1) indexed view
2) computed column

причем во вторую можно наворотить даже CLR функции
...
Рейтинг: 0 / 0
10.11.2010, 12:31
    #36946933
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
ScareCrowможно. через две вещиВо-первых, неизвестно какая СУБД у автора. Можно догадаться, но об этом ни единого намека не было. Так что этих "вещей" может быть даже меньше, чем одна. Во-вторых, а нужно ли? Если есть фичи, то совсем необязательно ими прикрывать недостатки структуры оригинального КЛАДРа.
...
Рейтинг: 0 / 0
10.11.2010, 12:33
    #36946944
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КЛАДР, улучшение скорости запросов
авторЗдравствуйте!

Подскажите пожалуйста как правильно написать индексы для таблиц КЛАДР расположенных на Microsoft SQL Server 2005?
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / КЛАДР, улучшение скорости запросов / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]