Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Таблица со множеством полей. Медленный SELECT...  [new]
Santa89
Member

Откуда:
Сообщений: 1480
Таблица содержит 100 полей и 90 000 строк.
Ужасно медленный SELECT, TOP 1000 выполнялся 5 секунд, про SELECT * вобще молчу.

Что можно придумать?
11 сен 15, 15:22    [18138480]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
нормализовать таблицу.... менее избыточные типы данных использовать чтобы сократить логические чтения...
11 сен 15, 15:26    [18138505]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
структуру таблицы в студию пжл :)
11 сен 15, 15:27    [18138509]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Santa89
Member

Откуда:
Сообщений: 1480
AlanDenton,

вы имеете в виду код CREATE_TABLE?
11 сен 15, 15:29    [18138520]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
угу... было бы неплохо... иначе сложно догадаться почему так....
11 сен 15, 15:43    [18138621]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Santa89
Member

Откуда:
Сообщений: 1480
CREATE TABLE [dbo].[BIGTABLE](
	[department_level_1] [varchar](255) NULL,
	[department_level_2] [varchar](1000) NULL,
	[department_level_3] [varchar](1000) NULL,
	[department_level_4] [varchar](1000) NULL,
	[department_level_5] [varchar](1000) NULL,
	[department_level_6] [varchar](1000) NULL,
	[department_level_7] [varchar](1000) NULL,
	[department_level_8] [varchar](1000) NULL,
	[department_level_9] [nvarchar](225) NULL,
	[project_name] [nvarchar](225) NULL,
	[ReportDate] [datetime] NULL,
	[SubmissionDate] [datetime] NULL,
	[UpdateDate] [date] NULL,
	[project_top] [nvarchar](255) NULL,
	[customer_pm] [nvarchar](4000) NULL,
	[customer_pm_id] [nvarchar](255) NULL,
	[pm] [nvarchar](255) NULL,
	[pm_pin] [nvarchar](255) NULL,
	[headcount] [nvarchar](255) NULL,
	[status_staffing_rag] [nvarchar](255) NULL,
	[status_staffing_comments] [nvarchar](4000) NULL,
	[status_delivery_rag] [nvarchar](255) NULL,
	[status_delivery_comments] [nvarchar](4000) NULL,
	[status_production_rag] [nvarchar](255) NULL,
	[status_production_comments] [nvarchar](4000) NULL,
	[status_relationship_rag] [nvarchar](255) NULL,
	[status_relationship_comments] [nvarchar](4000) NULL,
	[status_morale_rag] [nvarchar](255) NULL,
	[status_morale_comments] [nvarchar](4000) NULL,
	[status_budget_rag] [nvarchar](255) NULL,
	[status_budget_comments] [nvarchar](4000) NULL,
	[update_comments] [nvarchar](4000) NULL,
	[Plans] [nvarchar](4000) NULL,
	[status_other_rag] [nvarchar](255) NULL,
	[status_other_comments] [nvarchar](4000) NULL,
	[bench] [nvarchar](255) NULL,
	[project_size] [nvarchar](255) NULL,
	[project_potential] [nvarchar](255) NULL,
	[Project close date] [datetime] NULL,
	[Rename Date] [datetime] NULL,
	[date_start] [datetime] NULL,
	[HistoricalProjectName] [nvarchar](255) NULL,
	[DeliveryMaturityLevel] [varchar](3) NULL,
	[Process Management] [varchar](3) NULL,
	[Project Management] [varchar](3) NULL,
	[Requirements] [varchar](3) NULL,
	[Atchitecture and Design] [varchar](3) NULL,
	[Verification and Validation] [varchar](3) NULL,
	[Customer Feedback] [varchar](3) NULL,
	[People Management] [varchar](3) NULL,
	[Budget/ Contract/ Finance] [varchar](3) NULL,
	[Delivery Reporting] [varchar](3) NULL,
	[Team Morale] [varchar](3) NULL,
	[comments] [nvarchar](255) NULL,
	[SubmissionDateRankReversed] [bigint] NULL,
	[ReportDateNumberReversed] [bigint] NULL,
	[project_review_status] [datetime] NULL,
	[max_project_review_status] [datetime] NULL,
	[ReviewedProjects] [bigint] NULL,
	[DataSource] [varchar](5) NULL,
	[ProgramGuid] [uniqueidentifier] NULL,
	[ProjectGuid] [uniqueidentifier] NULL,
	[CurrentState] [varchar](3) NOT NULL,
	[MaturityDate] [datetime] NULL,
	[ProcessName] [nvarchar](250) NULL,
	[department_id] [uniqueidentifier] NULL,
	[Assessed Program Manager] [nvarchar](255) NULL,
	[bu_group_account] [varchar](255) NULL,
	[bu_group_company] [varchar](255) NULL,
	[bu_group_division] [varchar](255) NULL,
	[bu_group_id] [uniqueidentifier] NULL,
	[bu_group_level] [int] NULL,
	[bu_group_lob] [varchar](255) NULL,
	[bu_group_name] [varchar](255) NULL,
	[bu_group_practice] [varchar](255) NULL,
	[bu_group_program] [varchar](255) NULL,
	[bu_group_root] [varchar](8000) NULL,
	[bu_group_segment] [varchar](255) NULL,
	[bu_group_sesubdivision] [varchar](255) NULL,
	[EngagementModel] [nvarchar](255) NULL,
	[PricingModel] [nvarchar](255) NULL,
	[ReviewedTierHeadcount] [int] NULL,
	[TierHeadcount] [int] NULL,
	[SegmentHC] [float] NULL,
	[HasContractualDetails] [varchar](3) NULL,
	[Tier Expiration] [varchar](30) NULL,
	[IsOnSite] [varchar](3) NULL,
	[FeedbackRate] [float] NULL,
	[FeedbackComment] [nvarchar](1000) NULL,
	[FeedbackDate] [datetime] NULL,
	[FeedbackPerson] [nvarchar](300) NULL,
	[FeedbackAVGRateName] [nvarchar](20) NULL,
	[FeedbackAVGRate] [float] NULL,
	[ProjectDescription] [nvarchar](4000) NULL,
	[HPAccountName] [varchar](50) NULL,
	[ReviewProcess] [nvarchar](250) NULL,
	[Outlook] [varchar](10) NULL,
	[ProjectStatus] [varchar](15) NULL,
	[ProjectAge] [int] NULL
)
11 сен 15, 16:07    [18138790]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
нет ни PK , ни индексов?
11 сен 15, 16:09    [18138807]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
честно... почитайте про нормализацию данных.... и выбирайте типы данных исходя из ситуации... для столбцов где много NULL сделайте их sparse.... сократите логические чтения - решите проблему вычитки данных.... и индекс кластерный желателен также точно как и ограничение unique по какому столбцу.
11 сен 15, 16:16    [18138850]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Santa89
Member

Откуда:
Сообщений: 1480
Konst_One,

PK нет, есть три некластерных индекса
11 сен 15, 16:27    [18138948]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Santa89
Member

Откуда:
Сообщений: 1480
AlanDenton,

эта таблица служит источником данных для отчета, т.е. этот отчет кушает только представления и не позволяет создавать JOIN'ы
11 сен 15, 16:28    [18138957]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
Santa89
Konst_One,

PK нет, есть три некластерных индекса


выкладывайте все скрипты и ещё сам select и план выполнения
11 сен 15, 16:29    [18138960]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
ещё клиентскую статистику выполнения запроса включите, может вы там получаете несколько мегабайт данных, вот и медленно у вас
11 сен 15, 16:42    [18139057]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Попробуй SPARCE COLUMNS
В background-е реализовано через одно поле типа XML. Хорошо подходит для случая, когда полей много и большое их количество почти всегда NULL
11 сен 15, 16:50    [18139098]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Yuri Abele
Попробуй SPARCE COLUMNS
В background-е реализовано через одно поле типа XML. Хорошо подходит для случая, когда полей много и большое их количество почти всегда NULL

А можно про xml бекграунд подробней?
12 сен 15, 13:11    [18141809]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Mike_za
А можно про xml бекграунд подробней?
Как хранятся sparse columns и для чего нужен xml - https://www.microsoftpressstore.com/articles/article.aspx?p=2225060&seqNum=3
12 сен 15, 14:57    [18142010]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
BIGTABLEDEEPTHROAT
Guest
Santa89,

еще можно про структуру хранения данных почитать: что такое страницы, какой у страницы размер, что происходит если поля varchar суммарно по максимальной длине занимают больше ста тысяч байт (примерно 65 тыс символов + юникод)
12 сен 15, 15:13    [18142044]     Ответить | Цитировать Сообщить модератору
 Re: Таблица со множеством полей. Медленный SELECT...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Santa89
CREATE TABLE [dbo].[BIGTABLE](
...
)


select 
    au.type_desc, 
    sum(au.total_pages) as total_pages, 
    sum(au.used_pages) as used_pages,
    sum(au.data_pages) as data_pages
from 
    sys.allocation_units au
        inner join
    sys.partitions p on
    (
        (au.type_desc in (N'IN_ROW_DATA', N'ROW_OVERFLOW_DATA') and au.container_id = p.hobt_id)
        or 
        (au.type_desc in (N'LOB_DATA') and au.container_id = p.partition_id)
    )
where
    object_id = object_id(N'dbo.BIGTABLE')
group by
    au.type_desc;


что выводит? наверное, ныряет ваш select * from dbo.bigtable и select top(...) * from dbo.bigtable в [url=]ROW_OVERFLOW allocation unit[/url]

https://technet.microsoft.com/en-us/library/ms186981(v=sql.105).aspx
Surpassing the 8,060-byte row-size limit might affect performance because SQL Server still maintains a limit of 8 KB per page. When a combination of varchar, nvarchar, varbinary, sql_variant, or CLR user-defined type columns exceeds this limit, the SQL Server Database Engine moves the record column with the largest width to another page in the ROW_OVERFLOW_DATA allocation unit, while maintaining a 24-byte pointer on the original page. Moving large records to another page occurs dynamically as records are lengthened based on update operations. Update operations that shorten records may cause records to be moved back to the original page in the IN_ROW_DATA allocation unit. Also, querying and performing other select operations, such as sorts or joins on large records that contain row-overflow data slows processing time, because these records are processed synchronously instead of asynchronously.
12 сен 15, 16:58    [18142253]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить