Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.12.31;
Скачать: [xml.tar.bz2];

Вниз

MsAccess связь таблиц, индексация, как ускорить запрос?   Найти похожие ветки 

 
gedevan   (2016-01-26 08:42) [0]

AConnection.Execute("CREATE TABLE Templates " +
     "(_Index int IDENTITY(1,1) PRIMARY KEY,ShotNumber numeric(19,0), Name char(100));");


Я создаю несколько таблиц такого типа(т.е. тут не все поля, это пример). в ней поле ShotNumber  не уникально. Но последующие запросы делаются на получение выборки с определенным значением ShotNumber (т.е. 1 запрос всегда с отбором по какому то одному значению ShotNumber )

и есть таблица в которой ShotNumber является полем уникальным

AConnection.Execute
     ("CREATE TABLE ScreenShots(ShotNumber numeric(19,0),jpgSize numeric(19,0),jpgPosition numeric(19,0),CONSTRAINT ScreenShotsConstraint UNIQUE (ShotNumber));");


сейчас эта таблица не используется при выполнении запроса к первым таблицам. Из того что я понял о индексировании создавать индекс для таблиц первого типа по полю ShotNumber нет смысла, т.к. он не уникальный???

Может ли ускорить запрос связывание этих таблиц? т.е. если таблицы первого типа будут привязаны к таблице второго типа по полю ShotNumber  и как тогда должен выглядеть такой запрос? я представления не имею.

Также не очень понятно как связывать. Когда я таблицы заполняю, каждая из них находится в отдельном файле (потому что когда они все в одном, получается ооооочень медленно). А потом когда запись окончена я копирую их всех в 1 файл, т.е. мне в этом едином файле сначала нужно создать таблицу 2го типа, потом запросом скопировать в нее данные. Затем создать таблицы первого типа указав связь с таблицей второго типа и просто скопировать целиком данные? или есть какие то особенности этого процесса? т.е. если в ClientDataSet таблицы связаны, то чтобы добавить в подчиненную таблицу запись нужно сначала выбрать в главной таблице запись к которой будет привязана запись подчиненной (т.е. получается что тупо скопировать я не могу)

Если бы "хранилище данных" делал я сам, то у меня бы не составило проблем упорядочить массивы первого типа по полю ShotNumber  и создать второй массив(1 на каждый массив первого типа) в котором ShotNumber  был бы индексом элемента массива, а в ячейке хранился бы диапазон индексов элементов массива первого типа в котором находятся интересующие меня значения. И соответственно можно было бы очень быстро найти все интересующие строки.

Но что можно сделать в случае использования MsAccess  мне не известно. Можно ли что то в этом роде в нем провернуть? или что делать? Я чувствую что  что то тут можно сделать, но понятия не имею куда копать.


 
кгшзх ©   (2016-01-26 09:21) [1]

Удалено модератором


 
sniknik ©   (2016-01-26 11:18) [2]

судя по
> http://delphimaster.net/view/2-1452253920/
> ...
> "FROM Templates where ShotNumber = :prm"
индекс по этому полю обязателен.

> Из того что я понял о индексировании создавать индекс для таблиц первого типа по полю ShotNumber нет смысла, т.к. он не уникальный???
понимай по новой.

нет смысла, на малых количествах... при малом количестве записей скан часто быстрее чем индекс, а таблица при частом использовании часто уже вся в памяти. и малом количестве значений (например 2 - true/false) на множество записей, все одно будет фулскан.
... да и то могут быть исключения, например при использовании в джойнах и/или выбор например только по true там где по логике они в меньшинстве например 1% против 99% false.
вообще есть инструменты которые тестят данные, используемые запросы и рекомендуют необходимый индекс. в акцессе нет, но можно к примеру на mssql аналогичную базу развернуть и проверить.


 
gedevan   (2016-01-26 14:59) [3]

AConnection.Execute("CREATE TABLE Templates " +
     "(_Index int IDENTITY(1,1),ShotNumber numeric(19,0),Name char(50),"
     ",CONSTRAINT ScreenShotsConstraint PRIMARY KEY (ShotNumber));");


эм...попытался добавить индекс, и он сворачивает мне таблицу по ShotNumber, т.е. я не получаю много строк с одним значением ShotNumber, я получаю одну с каждым уникальным значением ShotNumber. Что я делаю не так?


 
gedevan   (2016-01-26 15:15) [4]

AConnection.Execute("CREATE TABLE Templates " +
     "(_Index int IDENTITY(1,1),ShotNumber numeric(19,0),Name char(50),"
     ",CONSTRAINT ScreenShotsConstraint PRIMARY KEY (_Index,ShotNumber));");


так? строки теперь есть все...


 
кгшзх ©   (2016-01-26 15:29) [5]

Что я делаю не так?


не понимаешь различия между констрейнтом и индексом.
праймари кей это констрейнт (ограничение) хотя под него и создается индекс.

а индекс это не констрейнт, хотя и индекс.


 
кгшзх ©   (2016-01-26 15:31) [6]

эм...попытался добавить индекс
.... но создал зачем-то первичный ключ.

и он сворачивает мне таблицу по ShotNumber
ну было бы странно если бы шотнамбер был бы одновременно и ПК и не уникальным.


 
gedevan   (2016-01-26 15:52) [7]


> праймари кей это констрейнт (ограничение) хотя под него
> и создается индекс.

> а индекс это не констрейнт, хотя и индекс.


ну, легко же понять.


 
sniknik ©   (2016-01-26 15:55) [8]

вообще в access-е (программе) есть прекрасный визуальный построитель запросов... "строишь" мышкой (выбирая галочки), после переключаешь на "режим SQL" и получаешь готовый запрос, синтаксически правильный. с логикой у "тупой программы" само собой напряг, думать за тебя она не сможет.

> AConnection.Execute("CREATE TABLE Templates " +
>      "(_Index int IDENTITY(1,1),ShotNumber numeric(19,0),Name char(50),"
>     ",CONSTRAINT ScreenShotsConstraint PRIMARY KEY (_Index,ShotNumber));");
>
> так? строки теперь есть все...
такой "индекс" не даст абсолютно ничего для поиска по второму полю, только по первому и составному первое+второе, что в общем то тут бессмысленно т.к. первое автоинкремент/уникально.


 
кгшзх ©   (2016-01-26 15:59) [9]

ну, легко же понять.

ну если ты уже понял,
что если хочется индекс,
то создавать надо индекс,
а не праймари кей,

то уже создай индекс по своему многострадальному шотнамберу.


 
sniknik ©   (2016-01-26 16:04) [10]

> ну, легко же понять.
невозможно. разные вещи. и пока ты в них видишь "синонимы" ты даже и не начнешь понимать...

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


 
gedevan   (2016-01-26 16:13) [11]

AConnection.Execute("CREATE TABLE Templates " +
     "(_Index int IDENTITY(1,1),ShotNumber numeric(19,0)," + "Name char(50));");

   AConnection.Execute
     ("create index ScreenShotsIndex on Templates (ShotNumber);");CODE>

сделал так....пока думаю что это я такое сделал...


 
gedevan   (2016-01-26 17:27) [12]

ура! работает.  в базе с миллионами записей стало работать быстро.


 
кгшзх ©   (2016-01-26 18:17) [13]

теперь ты первый грузинский программист
http://www.youtube.com/watch?v=e_w1Zf6SnyQ


 
ramstain   (2016-01-31 19:58) [14]

допустим в базе access есть таблица: kod число и firstname, lastname, adres строки.
есть индекс по адресу.

выбор через sql:
select * from .. order by firstname, lastname

поможет ли индекс этот при поиске если добавить where adres like "%...%" ?

и есть ли вообще смысл индекса если в запросе мы определяем order других полей?


 
sniknik ©   (2016-01-31 21:52) [15]

> есть индекс по адресу.
> поможет ли индекс этот при поиске если добавить where adres like "%...%" ?
нет, но поможет если where adres like "...%"

> и есть ли вообще смысл индекса если в запросе мы определяем order других полей?
разные вещи вообще то...
есть ли вообще смысл в машине если дома мы ходим пешком?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2017.12.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.001 c
15-1469188893
MsGuns
2016-07-22 15:01
2017.12.31
Стоимость системного блока в Москве


2-1453786938
gedevan
2016-01-26 08:42
2017.12.31
MsAccess связь таблиц, индексация, как ускорить запрос?


4-1283703046
Romingood
2010-09-05 20:10
2017.12.31
Нужен алгоритм распознавания номеров


11-1266153845
L`Autour
2010-02-14 16:24
2017.12.31
ownerItem в главной строке меню работает, а в подменю нет


15-1469166903
Leonid Troyanovsky
2016-07-22 08:55
2017.12.31
про rsdn





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский