![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]
> таблицы НЕ индексированы
Даже не вдаваясь в детали: почем НЕ индексированы?