powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / КЛАДР, улучшение скорости запросов
25 сообщений из 35, страница 1 из 2
КЛАДР, улучшение скорости запросов
    #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
КЛАДР, улучшение скорости запросов
    #36942442
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
заменить OR на union
заменить left(CODE,11) на like
или попробовать computed column index
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #36942446
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант - indexed вью
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #36942501
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow
заменить left(CODE,11) на like

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

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

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

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

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

Простите если чего не так сказал и за много слов.
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #36944949
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвычисляемые выражения, как известно, индексами не могут пользоваться.
моя плакает горючими слезами.
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #36945048
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, пока Вы юзаете КЛАДР "как есть" клятая 1С прекрасно конвертирует его в свой регистр сведений с удобной разбивкой полей и их индексацией
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #36945437
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #36946026
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавторвычисляемые выражения, как известно, индексами не могут пользоваться.
моя плакает горючими слезами.Формулировка не нравится? Я ж как попроще автору объяснить. При желании можно достигнуть Index Seek и по вычисляемым полям, но лучше не надо... ;)
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #36946028
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_tскажите пожалуйста можно это как то автоматически сделать?
подскажите пожалуйста, как такое дерево создать... КЛАДР
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #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
КЛАДР, улучшение скорости запросов
    #36946222
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NafДа, пока Вы юзаете КЛАДР "как есть" клятая 1С прекрасно конвертирует его в свой регистр сведений с удобной разбивкой полей и их индексацией
Naf , но я же не использую 1С. или Вы предлагаете от туда структуру как то перенести?


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

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


Dim2000 , не выгоняйте меня пожалуйста, я исправлюсь...
Распелить по уровням - значит сделать иерархию, добавив дополнительное поле ParentID как предлагал Senya_L ?
...
Рейтинг: 0 / 0
КЛАДР, улучшение скорости запросов
    #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
КЛАДР, улучшение скорости запросов
    #36946237
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_LСо вторым запросом "выбираем населённый пункты и улицу относящиеся непосредственно к городу" - с этим сложнее, но постановка какая-то неестественная. Обычно еще и уточняют конкретный город. Что, кстати, относится и к первому запросу.
Senya_L , да конечно, указывается конкретный город, что задается через переменные $region.$district.$city, а для первого запроса конкретный регион задается через переменную - $region.

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

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

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

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

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

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

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

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

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

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


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