Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MSSQL2000 [D6, MSSQL]


Delph ©   (2004-02-02 17:26:00) 

Проблема, как всегда в долгом исполнении запросов.
Имеются 2 связанные таблицы допустим, продацы и их заказы. таблицы НЕ индексированы. У каждого заказа есть время его исполнения.
При старте прога заполняет 3 таблицы (соотв. у меня 3 хранимые процедуры в которые посылается дата за которую, надо отобразить данные):
1. Общее количество заказов (число)время исполнения которых больше даты Х.
2. Имена продавцов и количество их заказов время исполнения которых больше даты Х.
3. Данные о заказах время исполнения которых больше даты Х.

Выборки постоянно идут в зависимости от даты X.
Примерное количество данных - 70 продавцов и 15000 заказов.
Время выполнения - 8 сек. на PIII и от 10 на менее производительных машинах.
Можно-ли сделать быстрее?
Для написания проги, воспользовался компонентами ADO.
примеры хранимых процедур:

2.
CREATE PROCEDURE AllFrm @Date char(10) AS
BEGIN TRANSACTION
INSERT into VAllFrm
SELECT Abr, COUNT(*) AS [Size]
FROM WPlc
WHERE CONVERT(DateTime, WPlc.Dtp, 104) >= CONVERT(DateTime, @Date, 104)
GROUP BY Abr
SELECT WFrm.Nms, WFrm.Abr, WFrm.Kfc,VAllFrm.[Size]
FROM WFrm INNER JOIN
VAllFrm ON WFrm.Abr = VAllFrm.Abr
GROUP BY ALL WFrm.Nms, WFrm.Abr, WFrm.Kfc,VAllFrm.[Size]
UNION
SELECT Nms, Abr, Kfc, 0 AS [Size]
FROM WFrm
WHERE NOT (Abr = ANY
(SELECT Abr
FROM VAllFrm))
ORDER BY WFrm.Nms
Delete from VAllFrm
COMMIT TRANSACTION
GO


Таблица VAllFrm - вспомогательная.
3.
CREATE PROCEDURE AllPlc @Date char(10) AS
SELECT *
FROM WPlc
WHERE (CONVERT(datetime, Dtp, 104) >= CONVERT(datetime,@Date , 104))
ORDER BY St1 DESC,Dks, Nmb DESC
GO


Я новичек во SQL. Буду рад любым советам.


Fay   (2004-02-03 17:36:00) [1]

2Ega23 © (03.02.04 16:28) [12]
2Delph © (03.02.04 16:32) [13]

> а в другой и вовсе некорректные(недозаполненные) даты(например
> __.__.2004).


Delph   (2004-02-03 16:32:00) [2]

Почему-то никому не приходит в голову хранить незаполненный Int...
Это как?


Ega23   (2004-02-03 16:28:00) [3]


> типа 123???321

Это о чём?


Ega23   (2004-02-03 16:26:00) [4]


> Всем спасибо. Понял, что изначально не правильно хранил
> даты.
> Вместо datetime - char[10]. Этот шаг был вызван тем, что
> пользователь хотел видеть в одной таблице дату в формате
> дд.мм.гггг, а в другой и вовсе некорректные(недозаполненные)
> даты(например __.__.2004). Надо было лучше продумать структуру:)

Ты всегда при выборке можешь сделать
Select MyDate=Convert(varchar(10), MyDate, 104) from MyTable


Fay   (2004-02-03 16:26:00) [5]

типа 123???321


Fay   (2004-02-03 16:25:00) [6]

Почему-то никому не приходит в голову хранить незаполненный Int...


Delph   (2004-02-03 16:23:00) [7]

Всем спасибо. Понял, что изначально не правильно хранил даты.
Вместо datetime - char[10]. Этот шаг был вызван тем, что пользователь хотел видеть в одной таблице дату в формате дд.мм.гггг, а в другой и вовсе некорректные(недозаполненные) даты(например __.__.2004). Надо было лучше продумать структуру:)


Ega23   (2004-02-03 09:15:00) [8]

CREATE PROCEDURE AllFrm @Date char(10) AS
А почему @Date не datetime?


Nikolay M.   (2004-02-03 09:15:00) [9]


> А по какому полю прикажете индексировать? Выборка идет по
> дате

А тыблицы кто вместо тебя джойнит? И это по неиндексированным полям?
INNER JOIN VAllFrm ON WFrm.Abr = VAllFrm.Abr


hfa   (2004-02-03 08:38:00) [10]

Используй SDAC и с этими компонентами будет намного быстрее..
www.crlab.com


sniknik   (2004-02-03 08:10:00) [11]

> А по какому полю прикажете индексировать? Выборка идет по дате. Даты абсолютно разные (каждый день). Я тут почитал - выигрыша не будет.
неправильно воспринял то что читал. наоборот максимальный выигрыш индекса на разнородных данных, и нет смысла его делать на однородных, к примеру всего 2 значения на большой обьем. (нерационально, время сохранения увеличено но скорость выборки примерно такая же как без индекса).
перечитай то что читал, наверняка там также написано.
и вот это тоже не лишний совет > ZrenBy © (02.02.04 18:10) [3], советую его придерживатся. ;о)


ZrenBy   (2004-02-02 18:10:00) [12]

Даже если будут индексы, при таком


WHERE CONVERT(DateTime,WPlc.Dtp,104)>=CONVERT(DateTime,@Date,104)


поимеете table scan

Никогда так не делай.


Delph   (2004-02-02 17:47:00) [13]

А по какому полю прикажете индексировать? Выборка идет по дате. Даты абсолютно разные (каждый день). Я тут почитал - выигрыша не будет.


Nikolay M.   (2004-02-02 17:41:00) [14]


> таблицы НЕ индексированы

Даже не вдаваясь в детали: почем НЕ индексированы?


Наверх

Титульная страница Поиск, карта сайта Написать письмо