Another DBA question

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Another DBA question

Сообщение StS »

Есть таблица в которой миллион записей. Треть полей заполнено всегда, но остальные используются крайне редко. Время селекта из таблицы критично. Какие будут соображения по оптимизации селекта?

1. При грамотных индексах все будет шуршать довольно быстро.
2. Создать еще одну таблицу в которую засунуть редко используемые поля.
3. Сгруппировать записи и создать несколько таблиц каждая из которых будет иметь минимальное количество пустых полей. Такая возможность есть, но как быстро при этом будет работать выборка из нескольких таблиц?
Donskoy Melnik
Пользователь
Сообщения: 96
Зарегистрирован: 19 фев 2005, 10:10
Откуда: GTA - Brampton

Сообщение Donskoy Melnik »

2+3+experiment+profile
hawk
Пользователь
Сообщения: 141
Зарегистрирован: 21 мар 2005, 20:08
Откуда: St. Petersburg->Vancouver

Сообщение hawk »

[trn]
Dostatochno ne malovazhno, kakaya RDBMS ispol'zuetsya.
orakl - naprimer po null-am ne sozdaet index entries, informiks - sozdaet.
db2 - ne pomnyu, no vrode-bi net.
Format hraneniya tozhe sil'no zavisit ot konkretnoi RDBMS. teoreticheski esli v orakle vse null-like polya zabrosit' v hvost, to vliyanie na razmer tablici budet nebol'shim.


"redko ispol'zuyutsya" - ne selektyatsya, ili ne zapolnyayutsya?
esli poslednee, to IMHO pol'zi ot razdvoeniya tablici odin-k-odnomu budet nemnogo. lishnie 3-4 logikal reads na poisk po klyuchyu i access po onomu.

[/trn]
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

DBA question

Сообщение Yuri Dimant »

Nowadays таблица в 1 миллион это ерунда. Я полагаю ты выполняешь SELECT statement с WHERE clause.

Однозначно 1 опция. Consider using covering indexes
Donskoy Melnik
Пользователь
Сообщения: 96
Зарегистрирован: 19 фев 2005, 10:10
Откуда: GTA - Brampton

Re: DBA question

Сообщение Donskoy Melnik »

He's got a large table with some unused columns. You are suggesting something, that will blow up the table size even more, despite the fact that highly non-unique indices are inefficient.
Yuri Dimant писал(а):Nowadays таблица в 1 миллион это ерунда. Я полагаю ты выполняешь SELECT statement с WHERE clause.

Однозначно 1 опция. Consider using covering indexes
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

DBA question

Сообщение Yuri Dimant »

Melnik
I did not uderstand your point. If he has a properly defined indexes on the colums that means the query optimizer will be able to create an efficient execution plan so that speeds up the query. My point was to exclude "unused" column/s from SELECT.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

hawk писал(а):[trn]
"redko ispol'zuyutsya" - ne selektyatsya, ili ne zapolnyayutsya?
esli poslednee, to IMHO pol'zi ot razdvoeniya tablici odin-k-odnomu budet nemnogo. lishnie 3-4 logikal reads na poisk po klyuchyu i access po onomu.

[/trn]
[trn]
Ne zapolnyajutsya. Indeksov po wtim polyam net, tak kak selekt po nim vypolnyaetsya krajne redko i ne kritichen po vremeni.

Vsego polej okolo 30; redko ispol'zuemye - prakticheski vse celye, ne [/trn] varchar.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

StS: можешь показать схему, запросы и тип базы? можно в приват.
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Re: Another DBA question

Сообщение Vovchik »

StS писал(а):Есть таблица в которой миллион записей. Треть полей заполнено всегда, но остальные используются крайне редко. Время селекта из таблицы критично. Какие будут соображения по оптимизации селекта?

1. При грамотных индексах все будет шуршать довольно быстро.
2. Создать еще одну таблицу в которую засунуть редко используемые поля.
3. Сгруппировать записи и создать несколько таблиц каждая из которых будет иметь минимальное количество пустых полей. Такая возможность есть, но как быстро при этом будет работать выборка из нескольких таблиц?
Пункт первый. Не вижу причин городить огород с пунктами 2 или 3. Единственоое но - при наличии большого количества индексов возможна значительная потеря производительности на insert/update (overindexing). В этом случае действительно будет лучше разбить таблицу на несколько. И миллион записей - это ничто для современной базы. Вот ежели б там был миллиард... Да и тогда пункт первый.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

[trn]Klassicheskij sluchaj [/trn] transaction history.
http://4test.at.tut.by/Transaction.jpg
[trn]Wto ne vse polya, budut esche, no ne obyazatel'nye.[/trn]

[trn]Vsegda zapolneny polya[/trn] ID, DateTime, AccountID, Amount, TransactionCodeID, SequenceNumber [trn] i libo [/trn] ProgramID, [trn]libo[/trn] EmployeeID.

Select [trn]delaetsya v osnovnom po [/trn]AccountID and Date ([trn]Kstati, budet li luchshe raznesti[/trn] DateTime[trn] v raznye polya?).
Wto naibolee chastyj selekt i vremya otveta nuzhno minimizirovat'. Dlya nekotoryh selektov, tipa[/trn] WHERE TransactionCode=1234[trn] indeksy tozhe prigodyatsya, a vot pri zaprose "kto perevel tri milliona na Bagamy" mozhno i podozhdat' paru minut.[/trn]
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

StS писал(а):[trn]Klassicheskij sluchaj [/trn] transaction history.
http://4test.at.tut.by/Transaction.jpg
[trn]Wto ne vse polya, budut esche, no ne obyazatel'nye.[/trn]

[trn]Vsegda zapolneny polya[/trn] ID, DateTime, AccountID, Amount, TransactionCodeID, SequenceNumber [trn] i libo [/trn] ProgramID, [trn]libo[/trn] EmployeeID.

Select [trn]delaetsya v osnovnom po [/trn]AccountID and Date ([trn]Kstati, budet li luchshe raznesti[/trn] DateTime[trn] v raznye polya?).
Wto naibolee chastyj selekt i vremya otveta nuzhno minimizirovat'. Dlya nekotoryh selektov, tipa[/trn] WHERE TransactionCode=1234[trn] indeksy tozhe prigodyatsya, a vot pri zaprose "kto perevel tri milliona na Bagamy" mozhno i podozhdat' paru minut.[/trn]
А база то какая?
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

StS писал(а):[trn]Klassicheskij sluchaj [/trn] transaction history.
http://4test.at.tut.by/Transaction.jpg
[trn]Wto ne vse polya, budut esche, no ne obyazatel'nye.[/trn]

[trn]Vsegda zapolneny polya[/trn] ID, DateTime, AccountID, Amount, TransactionCodeID, SequenceNumber [trn] i libo [/trn] ProgramID, [trn]libo[/trn] EmployeeID.

Select [trn]delaetsya v osnovnom po [/trn]AccountID and Date ([trn]Kstati, budet li luchshe raznesti[/trn] DateTime[trn] v raznye polya?).
Wto naibolee chastyj selekt i vremya otveta nuzhno minimizirovat'. Dlya nekotoryh selektov, tipa[/trn] WHERE TransactionCode=1234[trn] indeksy tozhe prigodyatsya, a vot pri zaprose "kto perevel tri milliona na Bagamy" mozhno i podozhdat' paru minut.[/trn]
А вообще по любому - два индекса по AcciuntId and Date. И все дела. Далее можно экспериментровать добавляя индексы и удаляя их ежели это создает проблемы.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

А база то какая?
[trn]Ne hotelos' by privyazyvat'sya k konkretnoj baze. Budet [/trn]PostgreSQL or MySQL[trn] - chto-to deshevoe/besplatnoe.

[/trn]DateTime[trn] raznosit' na dva polya [/trn]Date and Time[trn] odnoznachno?[/trn]
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

StS писал(а):
А база то какая?
[trn]Ne hotelos' by privyazyvat'sya k konkretnoj baze. Budet [/trn]PostgreSQL or MySQL[trn] - chto-to deshevoe/besplatnoe.

[/trn]DateTime[trn] raznosit' na dva polya [/trn]Date and Time[trn] odnoznachno?[/trn]
В таком случае - лучше разнести. Тогда получится три индекса и три поля. В противном случае можно попасть на вычисления/конвертацию а это в бесплатных базах бывает кисло устроено.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

Thanks, Vovchik
Ответить