|
|
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Вопрос собственно в следующем: На MSSQL при создании внешнего ключа к справочнику по нему автоматом создаётся индекс, и запросы с использованием справочников идут быстрее. В PG, я так понял, такого нет. Если я правильно понял, FK - для проверки целостности, а индекс нужно создавать отдельно (чекбокс "покрывающий индекс" в pgAdmin). Сейчас у нас идёт миграция из Access, где никаких FK не было, т.е. проверки целостности были, но на уровне приложения, что при сбоях приводило к некритичным нарушениям целостности (ну и проверки вводились не сразу, так что например исторические данные имеют структуру слегка отличную от актуальной - пустые поля, поля, которые больше не используются и т.п.) Хотелось бы понять, что в этой ситуации логичнее - чистить данные, или ограничится индексом? И как правильно создать индексы в такой ситуации? Я так понял, что null для FK не критичен, но я опасаюсь за пустые строки (""), дефолты вне справочника и прочий Ассess'овский ливер (типа update значений уже после вставки строки в рамках трансакции). Есть ощущение, что если навешать FK всё тупо перестанет работать (сейчас хоть работает, но иногда критически медленно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 12:48 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ШыфлНа MSSQL при создании внешнего ключа к справочнику по нему автоматом создаётся индексПри создании ограничений типа FOREIGN KEY на MSSQL индекс автоматически не создается. Об этом внятно указано в документации и легко подтвердить простым тестом. Индексы автоматически создаются только на ограничения типа PRIMARY KEY и UNIQUE, о чём также написано в документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 13:53 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Шыфл, индексы на кандидаты в fk скорей всего в любом случае понадобятся, если их нет, раз работает медленно. т.е. начать с них, потом почистить данные и навешать fk. индексы создаются просто через Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 16:41 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ChA, спорить не буду, но по-моему до 2005 всё создавалось. Вообще заметил странную тенденцию - при создании дополнительных индексов, скорость выборок в линкованных таблицах Access парадоксально падает! Очевидно из-за возрастающей нагрузки на сеть (асс тянет все данные себе, и только потом начинает их обрабатывать, возможно даже без использования индекса как такового). Естественно потом это всё нужно переделать на прямые запросы к серверу, но это очень много работы, а хочется иметь функциональный вариант уже сейчас... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 16:54 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Шыфлпри сбоях приводило к некритичным нарушениям целостностисоздать fk и не париться за сбои и забывчивость тех, кто лезет в данные немытыми руками. А приложение тестировать так или иначе придется, вот и причешете шероховатости прикладных проверок. Если мастер-таблица короткий справочник без удалений ключа, то полезность индекса на fk в деталь-таблице крайне редка. Индекс на FK может ускорять удаления и апдейты ключа мастер-таблицы. А также выборку по значению fk деталь-таблицы, впрочем это общее правило, а не какие-то особенности fk. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 16:55 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ШыфлСейчас у нас идёт миграция из Access братан, ты ли это!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 17:18 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ШыфлChA, спорить не буду, но по-моему до 2005 всё создавалось.И не надо. Я работал с MS SQL начиная с версии 4.21 и никогда он автоматически не создавал индексы для FK. Для проверки целостности нет необходимости в индексе на таблице с FK, так как поиск существования значения происходит в другой таблице с PK или UQ ограничением, в которых обязательно есть соответсвующий индекс. Индексе на таблице с FK нужен только, если планируется активное соединение обоих таблиц по ссылочным полям, да и то не всегда, обратите внимание на комментарий p2. ШыфлВообще заметил странную тенденцию - при создании дополнительных индексов, скорость выборок в линкованных таблицах Access парадоксально падает! Очевидно из-за возрастающей нагрузки на сеть (асс тянет все данные себе, и только потом начинает их обрабатывать, возможно даже без использования индекса как такового). Естественно потом это всё нужно переделать на прямые запросы к серверу, но это очень много работы, а хочется иметь функциональный вариант уже сейчас...Вы думаете postgresql всё сделает за вас ? Если вы плохо знаете инструментарий с которым работаете, то переход на другой сервер не поможет. Возможно, даже усложнит, так в postgresql много не так, как в MS SQL и MS Access, о которых у вас есть хоть какое-то представление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 17:34 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Ivan DurakШыфлСейчас у нас идёт миграция из Access братан, ты ли это!!!!! Хм, у меня есть брат Иван в Минске... Ты что же, тоже PG увлёкся? Буду тебя напрямую дёргать, если что ChAВы думаете postgresql всё сделает за вас ? Если вы плохо знаете инструментарий с которым работаете, то переход на другой сервер не поможет. Возможно, даже усложнит, так в postgresql много не так, как в MS SQL и MS Access, о которых у вас есть хоть какое-то представление. За свою не очень долгую карьеру программиста БД я поработал минимум с 8 различными СУБД, и не поверите, в каждой из них "много не так". Естественно, что я не очень углублялся в принципы, но всё работало годами без нареканий. Дошла очередь и до изучения PG, пока что особых затыков нет, но и с успехами пока туго. Хочется же идти путём наименьшего сопротивления и получить удовлетворительно работающую версию целого приложения уже "вчера" с минимальными исправлениями клиентской части, а "чистку данных" и "оптимизацию запросов" растянуть по времени и разбить на куски. Тут такая специфика, что не достаточно знать, как себя ведёт PG, нужно ещё понять, как себя с ним будет вести Access. Выяснилось, к примеру, что DAO.Recordset.FindFirst, который на таблице Jet без индекса отрабатывал моментом, с случае с PG ODBC без индекса просто зависает. А, например, если создать пару-тройку индексов на большой таблице, то они по размеру займут места больше, чем сама таблица и Access при работе с формами начинает подтормаживать :( Ещё хотелось бы знать, как поведёт себя PG c таблицами без первичного ключа при массовой вставке/удалении... Короче, куча нюансов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 18:27 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Шыфлне достаточно знать, как себя ведёт PG, нужно ещё понять, как себя с ним будет вести Access. Выяснилось, к примеру, что DAO.Recordset.FindFirst, который на таблице Jet без индекса отрабатывал моментом, с случае с PG ODBC без индекса просто зависает. А, например, если создать пару-тройку индексов на большой таблице, то они по размеру займут места больше, чем сама таблица и Access при работе с формами начинает подтормаживать :( Ещё хотелось бы знать, как поведёт себя PG c таблицами без первичного ключа при массовой вставке/удалении...Если вы работаете с SQL-сервером любого вида через MS Access, то надо забыть о файлсерверных привычках. Насколько помню, там есть механизм ODBC Direct, который позволяет посылать запросы на выполнение серверу, а не тащить все данные на клиента и выполнять запрос на месте. Не понял о каких индексах вы хотели сказать, индексы должны быть на сервере и пользоватся его engine. MS Access не должен создавать никаких локальных индексов в таком случае, он должен "тупо" посылать на сервер "правильные" запросы. За таблицу без первичного ключа надо увольнять за профнепригодность. Никогда не надейтесь ни на какие "встроенные" уникальные идентификаторы. Они живут собственной жизнью и вы можете сильно пострадать, если решите, что их использование - нормальная практика. Всегда только явные и понятные вам primary key. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2015, 19:18 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ChA, Подскажите, в PostgreSQL, как Oracle, если на fk таблицы-факта нет индекса, то при обновлении зависимой справочной таблицы будет наложен share lock на связанную таблицу-факт? (оракловая дока: http://docs.oracle.com/cd/E11882_01/server.112/e40540/datainte.htm#CNCPT1660 "Prevents a full table lock on the child table. Instead, the database acquires a row lock on the index." ) Или в PostgreSQL этой проблемы нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2015, 09:44 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ChAЕсли вы работаете с SQL-сервером любого вида через MS Access, то надо забыть о файлсерверных привычках. Насколько помню, там есть механизм ODBC Direct, который позволяет посылать запросы на выполнение серверу, а не тащить все данные на клиента и выполнять запрос на месте. С сервером я обычно работаю через ADO/ADO.net, но тут пришлось столкнуться с суровым DAO. Имеем то, что имеем... ChAНе понял о каких индексах вы хотели сказать, индексы должны быть на сервере и пользоватся его engine. MS Access не должен создавать никаких локальных индексов в таком случае, он должен "тупо" посылать на сервер "правильные" запросы. Какие запросы посылает на сервер MS Access мне бы тоже очень хотелось знать. Не подскажете нормальный бесплатный трассировщик запросов для PG? Потому что там хитрая система - он посылает запрос, а пока он грузится, посылает второй запрос вдогонку для отображения на форме части полученных данных. Надо бы посмотреть, как это работает "поближе". К тому же, когда у вас таблица на 100мб и 150мб индексов к ней, это ИМХО не здорОво, хотя бы с точки зрения нагрузки на shared_buffers... ChAЗа таблицу без первичного ключа надо увольнять за профнепригодность. Никогда не надейтесь ни на какие "встроенные" уникальные идентификаторы. Они живут собственной жизнью и вы можете сильно пострадать, если решите, что их использование - нормальная практика. Всегда только явные и понятные вам primary key. Ну, я шефу уже сказал, что его рекомендовали уволить за то, что он 10 лет назад на коленке это всё мастерил. А вообще, за профнепригодность нужно увольнять тех, кто такие таблицы ака "куча" не умеет использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2015, 10:07 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
pihel, В случае отсутствия индекса, DML-операции будут использовать SeqScan'ы для проверки целостности, и это будет основной проблемой. Ну а использовании таблицы подразумевает ее блокировку, хотя бы для того, чтобы другая сессия ее не DROP-нула. Подробнее в доках . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2015, 10:18 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
pihelChA, Подскажите, в PostgreSQL, как Oracle, если на fk таблицы-факта нет индекса, то при обновлении зависимой справочной таблицы будет наложен share lock на связанную таблицу-факт? (оракловая дока: http://docs.oracle.com/cd/E11882_01/server.112/e40540/datainte.htm#CNCPT1660 "Prevents a full table lock on the child table. Instead, the database acquires a row lock on the index." ) Или в PostgreSQL этой проблемы нет?Понятия не имею, у меня стаж в PostgreSQL минимален. Этот вопрос лучше не ко мне. Хотя чисто по логике, в этом есть здравый смысл. Данные в обоих таблицах согласованы, значит при обновлении одной требуется верификация значения в другой, и без лока, тут, ну никак не обойтись, точнее, можно, но гораздо более дорогой ценой. Другой вопрос, что без индекса придется сканировать всю таблицу, поэтому проще всего наложить временную разделяемую табличную блокировку. В то же время, обновления полей в pk это плохая практика, так как оно собственно и требует каскадных проверок в подчинёненных(fk) таблицах. Именно поэтому активно используются суррогатные ключи, которые нет нужды менять на протяжениии всего жизненного цикла сущности. А раз pk меняться не будет, то и необходимости в блокировке связанных таблиц не появится, разве только при удалении. Но удаление сущности, в принципе, более сложный вопрос, чем только удаление строки из таблицы. В грамотных системах и удаления, как правило, не происходит, чтобы сохранить целостность исторической картины. Просто каким-либо признаком сущность выводится из активных. Обычно периодом существования или моментом с которого она считается активной, тут есть нюансы. ШыфлС сервером я обычно работаю через ADO/ADO.net, но тут пришлось столкнуться с суровым DAO.Насколько помню, ADO заточен под MS SQL Server. Всё-таки, если собираетесь продолжать использовать MS Access в качестве frontend, то настоятельно рекомендую разобраться с ODBC Direct.ШыфлКакие запросы посылает на сервер MS Access мне бы тоже очень хотелось знать. Не подскажете нормальный бесплатный трассировщик запросов для PG? Потому что там хитрая система - он посылает запрос, а пока он грузится, посылает второй запрос вдогонку для отображения на форме части полученных данных. Надо бы посмотреть, как это работает "поближе". К тому же, когда у вас таблица на 100мб и 150мб индексов к ней, это ИМХО не здорОво, хотя бы с точки зрения нагрузки на shared_buffers...Именно поэтому пользуйтесь прямым доступом(ODBC Direct), а не через DAO. Это не так уж сложно, просто в запросах MS Access подправить нужные свойства. Тогда всё будет очевидно, что послали, то и "полетело". И никаких индексов на стороне MS Access. А по поводу трассировщика, такого как под MS SQL нет, так что кроме гугля ничего рекомендовать не возьмусь. Многие вообще пользуются анализом логов.ШыфлА вообще, за профнепригодность нужно увольнять тех, кто такие таблицы ака "куча" не умеет использовать.Возможно, вы мастер использования "куч", но вы нарушаете базовый принцип РМД, все элементы множества должны быть уникально идентифицируемы. В противном случае, вы рискуете "поскользнуться" на "куче" в любой момент. Впрочем, хозяин - барин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2015, 12:32 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Что-то мне уже не нравится PG за подобные вольности... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ОШИБКА: указанная в ключе колонка "id" не существует LINE 17: PRIMARY KEY (Id) ^ ********** Ошибка ********** ОШИБКА: указанная в ключе колонка "id" не существует SQL-состояние: 42703 Символ: 1080 Вроде как case sensitive, а позволяет себе такие вольности - написано Id, а преобразуется в id... Тоже самое, написано EMail, а он его почему-то в email преобразует, если в кавычки не взять... С русскими буквами он себе такого не позволяет, но если название поля английское, то без кавычек всё уходит в нижний регистр :/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2015, 15:46 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Шыфл, С PostgreSQL все хорошо. Проблема именно в синтаксисе: В объявлении указано "Id" - именно как регистрозависимое. А в объявлении первичного ключа объявлено Id без кавычек. Это Id рассматривается как регистронезависимое. Соответственно потом PG честно говорит что регистронезависимое id (автоматическое преобразование к нижнему регистру указано где-то в документации) не найдено среди регистрозависимого "Id". Все вполне очевидно. Таким образом, если взялись все писать в двойных кавычка - делайте это везде. В от это туда-сюда -- раздражает. То есть проблема не в PostgreSQL. Ну, и общее место: идентификаторы на русском языке -- это фе! Если уж есть идентификаторы на русском языке, но не взяты в двойные кавычки -- два раза фе! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2015, 16:09 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ШыфлЧто-то мне уже не нравится PG за подобные вольности... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Если в названиях используются кавычки, а внутри них буквы с разными регистрами и на других языках, то потом везде придется писать эти названия в кавычках. Такая особенность, но явно прописанная в документации. Лучше не смешивать стиль написания с кавычками или без кавычек. И лучше забыть о русских наименованиях в принципе. P.S. Вас же предупреждали, что в postgresql много не так, как в MS SQL или MS Access. Ещё не раз споткнётесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2015, 16:16 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ШыфлЧто-то мне уже не нравится PG за подобные вольности... Кстати, да. Никаких вольностей. Читайте документацию : postgresql.orgQuoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case. For example, the identifiers FOO, foo, and "foo" are considered the same by PostgreSQL, but "Foo" and "FOO" are different from these three and each other. (The folding of unquoted names to lower case in PostgreSQL is incompatible with the SQL standard, which says that unquoted names should be folded to upper case. Thus, foo should be equivalent to "FOO" not "foo" according to the standard. If you want to write portable applications you are advised to always quote a particular name or never quote it.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2015, 16:23 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
авторДатаВыписки КодОрг Братан, что за махровое одинэсничество. Пиши латиницей!!! p.s. А данные почисти - ибо нефиг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2015, 16:33 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ШыфлЧто-то мне уже не нравится PG за подобные вольности... что--то мне не нравятся дятлы деятлы деятели, не прочитавшие азов по правилам именования в используемом ими продукте, и напрягающие олла своими домыслами. я, когда писал мигратор из аксесс в postgresql, специально заложил авто--транслитерацию имен всех объектов БД (кроме возможности вести словарь синонимов -- который имел приоритет над транслитерацией). в аксессе все подменялось разыменовывающими вьюхами (на автомате -- тем же мигратором). просто -- чтобы при любой локали видеть хотя бы имена объектов без проблем. хотя, если аккуратно везде квотить идентификаторы -- проблем не должно возникать и с местными именами -- но вот зависимость от окружения при необходимости что--то срочно сделать с чужого места -- таки будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2015, 16:33 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Как можно так коряво, я не понимаю... Поле IdПриход переделывать в idПриход, а потом ругаться сам на себя, что переделал... Я уж не говорю про UpdateUserID. Есть какая-то настройка, чтобы это выключить? Или функция, чтобы это победить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2015, 16:57 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
Ivan DurakШыфлДатаВыписки КодОрг Братан, что за махровое одинэсничество. Пиши латиницей!!! p.s. А данные почисти - ибо нефиг Да я не заметил сразу, что если название не квотированное, то английская часть приводится к нижнему регистру, потому что русская остаётся регистрозависимой. Латиницей тут не писать нужно, а переписывать 10 человеко-лет работы, что-то не хоцца, хоцца по-хитрому. П.с. Данные чистятся в процессе импорта, а то по датам попадаются раннехристианские накладные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2015, 17:07 |
|
||
|
FOREIGN KEY vs INDEX
|
|||
|---|---|---|---|
|
#18+
ШыфлChA, спорить не буду, но по-моему до 2005 всё создавалось. Вообще заметил странную тенденцию - при создании дополнительных индексов, скорость выборок в линкованных таблицах Access парадоксально падает! Очевидно из-за возрастающей нагрузки на сеть (асс тянет все данные себе, и только потом начинает их обрабатывать, возможно даже без использования индекса как такового). Естественно потом это всё нужно переделать на прямые запросы к серверу, но это очень много работы, а хочется иметь функциональный вариант уже сейчас... да ты просто фантазер! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2015, 09:33 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39066023&tid=1997735]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 387ms |

| 0 / 0 |
