|
|
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
По совету на этом форуме объеденил запросом две таблицы Товар-Услуга и вижу что эта конструкция работает в 3 раза медленне чем если искать раздельно в обоих таблицах. Код объеденяющего запроса: SELECT КодФирмы, КодТовара, 0 as КодУслуги, 'Товар' as Вид, ТипТовара as Тип, ПодтипТовара as Подтип, ИмяТовара as Наименование, ФирмаПроизв, МаркаТовара as Марка, ЦенаОпт, ЦенаРозн, Валюта, ЕдИзмерения FROM Запр_Товар UNION SELECT КодФирмы, 0 as КодТовара, КодУслуги as Код, 'Услуга' as Вид, ТипУслуги as Тип, ПодтипУслуги as Подтип, ИмяУслуги as Наименование, "" as ФирмаПроизв, МаркаУслуги as Марка, "" as ЦенаОпт, Цена as ЦенаРозн, Валюта, ЕдИзмерения FROM Запр_Услуга ORDER BY Вид, Наименование; далее set rs = db.OpenRecordset("select * from Запр_ТоварУслуга where КодФирмы=5") это работает примерно в 3 раза медленее чем код: set rs = db.OpenRecordset("select * from ЗапрТовар where КодФирмы=5") set rs = db.OpenRecordset("select * from ЗапрУслуга where КодФирмы=5") Что можно сделать для оптимизации? Чем больше записей тем больше тормозит. Может я что не так делаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 19:01 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
КодУслуги as Код слючайно забралось, ничего не изменилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 19:04 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
Делаешь ты все так, только, наверное, у тебя по полю "КодФирмы" обеих таблиц налажена связь с таблицей "Фирмы", и, соответственно, по этим полям построены индексы. Поэтому по индексу поиск происходит быстро. А в Union'е в лучшем случае происходит тот же поиск по всем индексам, входящим в состав исходных таблиц... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 19:57 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
Принцип понятен, но что делать, к запросу ведь индекс не подключишь. Я попробовал без where но эффект примерно тотже (примерно в 2 раза) может есть более элегантный способ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 20:08 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
> к запросу ведь индекс не подключишь А почему? Так, наверное, индексу придется работать: SELECT * FROM Запр_Товар where КодФирмы=[Параметр] UNION SELECT * FROM Запр_Услуга where КодФирмы=[Параметр]; Кроме того, в твоем запрос используется сортировка по наименованию, непонятно зачем нужная, если тебе хочется выбирать записи по другому полю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 20:21 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
Если я пишу: SELECT * FROM Запр_Товар union select * from Запр_Услуга то получаю "В таблицах или запросах, выбранных в запросе на объединение, не совпадает число столбцов. (Ошибка 3307)" Про указание WHERE в условиях UNION спасибо я так и сделаю но тогда использовать уже созданный запрос не получиться. Я уже писал что без WHERE эффект примерно тотже как это ускорить? set rs = db.OpenRecordset("select * from Запр_ТоварУслуга") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 20:33 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
> Кроме того, в твоем запрос используется сортировка по наименованию, непонятно зачем нужная, если тебе хочется выбирать записи по другому полю. Дык я выбираю товары по фирме, а на экран эти товары надо по именам и в начале товары а затем услуги вот и получается ORDER BY Вид, Наименование; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 20:39 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
> В таблицах или запросах, выбранных в запросе на объединение, не совпадает число столбцов Звездочку я нарисовал только потому, что мне лениво было переписывать имена столбцов - конечно, они нужны. Я имел в виду, что where надо использовать до сортировки. select ... where ... union all select ... where ... order by ... > но тогда использовать уже созданный запрос не получиться Почему тебе нельзя написать select blablabla where (field1=[param1] or [param1] is null) and (field2=param2 or param2 is null) and ... , где в качестве параметров могут выступать, скажем, функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 20:54 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
Я новичёк и такого не знаю, если не сложно напиши примерчик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 21:05 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
SELECT КодФирмы, КодТовара, 0 as КодУслуги, 'Товар' as Вид, ТипТовара as Тип, ПодтипТовара as Подтип, ИмяТовара as Наименование, ФирмаПроизв, МаркаТовара as Марка, ЦенаОпт, ЦенаРозн, Валюта, ЕдИзмерения from Запр_Товар where (КодФирмы=ДайКодФирмы() or ДайКодФирмы() is null) And (ТипТовара=ДайТипТовара() or ДайТипТовара() is null) UNION all SELECT КодФирмы, 0 as КодТовара, КодУслуги as Код, 'Услуга' as Вид, ТипУслуги as Тип, ПодтипУслуги as Подтип, ИмяУслуги as Наименование, "" as ФирмаПроизв, МаркаУслуги as Марка, "" as ЦенаОпт, Цена as ЦенаРозн, Валюта, ЕдИзмерения FROM Запр_Услуга where (КодФирмы=ДайКодФирмы() or ДайКодФирмы() is null) And (ТипТовара=ДайТипТовара() or ДайТипТовара() is null) ORDER BY Вид, Наименование; Выделенное жирным "all" может уберечь тебя от возможных проблем в аналогичных случаях - почитай хелп (по умолчанию одинаковые записи объединяются а во всяких "оборотках" это чревато последствиями). ДайКодФирмы() и ДайКодТовара() надо описать в каком-нибудь модуле: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. После этого, перед выполнением запроса ты можешь написать CodeGood=Null CodeFirm=null , тогда запрос вернет все товары и услуги всех фирм и товаров, или CodeGood=1 CodeFirm=1 , тогда запрос вернет результат по фирме с кодом 1 и товару с кодом 1. И т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2004, 21:57 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
Кстати, ИМХО отсутствие ALL и дает замедление. Например, в M$ SQL в случае отсутствия ALL записи дополнительно считываются во временную таблицу. Что там делает Акс, не знаю, но что-то подобное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2004, 10:18 |
|
||
|
А почему запрос UNION работает в 3 раза медленнее?
|
|||
|---|---|---|---|
|
#18+
Спасибо огромное UNION ALL действительно немного ускорило, а поиск в UNION WHERE так-же помог скорость стала сравнима с выбором по отднльности (на глаз немного медленее но горрраздо быстрее чем была в начале). Но я всё-же остался на простом варианте - скопировав во временную таблицу: DELETE * FROM Табл_ВрТоварУслуга_ INSERT INTO Табл_ВрТоварУслуга_ (...) SELECT ... FROM Запр_Товар WHERE ... а затем туда-же добавляю INSERT INTO Табл_ВрТоварУслуга_ (...) SELECT ...FROM Запр_Услуга WHERE ... эта конструкция работает всё-же быстрее чем такая-же но с UNION ALL ... WHERE КодФирмы=GlobalFuncCodeFirm() Но ещё раз спасибо за содействие, применив все советы я нашёл самое быстрое действие, что было-бы невозможно без внешней помощи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2004, 14:29 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32417865&tid=1676532]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
139ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 263ms |
| total: | 491ms |

| 0 / 0 |
