내가 몇 가지 물건에 대한 좋은 반응 시간을 얻고 몇 가지 물건에 대한 메모리 최적화 테이블
와 큰 테이블을 대체 그것은
그것은 복합 기본 키
유일한 방법 I하다 사망 이 기본 키는 특정 행 (전체 PK)
사용 기존 데이터메모리 최적화 테이블
에서 해시 버킷 크기의 정렬에 대한 PK 또는 복합 키
의 한 구성 요소를 사용하지 않습니다에 검색하는 것입니다 사용할 수 있습니다 복합 기본 키에 대한이 링크의 구문 원래 (비 메모리 최적화 테이블)에서 Hekaton: Composite Primary Key in create table statement
CREATE TABLE (SQL Server)
CREATE TABLE [dbo].[FTSindex]
(
[sID] [int] NOT NULL,
[wordPos] [int] NOT NULL,
[wordID] [int] NOT NULL,
[charPos] [int] NOT NULL,
INDEX [ix_wordID_MO_2] NONCLUSTERED HASH
(
[wordID]
)WITH (BUCKET_COUNT = 524288),
CONSTRAINT [pk_FTSindexMO_2] PRIMARY KEY NONCLUSTERED HASH
(
[sID],
[wordPos]
)WITH (BUCKET_COUNT = 268435456)
)WITH (MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_ONLY)
select top 10 * from [FTSindex] where [sID] = 100
-- runs in 0 seconds
-- Index Seek on ix_wordID_MO_2
-- it is NOT using the PRIMARY KEY pk_FTSindexMO_2
select top 10 * from [FTSindex] where [wordPos] = 100
-- never finishes (I only waited 10 minutes)
-- will not even display an execution plan
select top 10 * from [FTSindex] where [sID] = 100 and [wordPos] < 1000
-- never finishes (I only waited 10 minutes)
-- will not even display an execution plan
select top 10 * from [FTSindex] order by [sID]
-- never finishes (I only waited 10 minutes)
-- query plan is Table Scan
select top 10 * from [FTSindex] order by [sID], [wordPos]
-- never finishes (I only waited 10 minutes)
-- will not even display an execution plan
select top 10 * from [FTSindex] where [wordID] = 100 and [sID] = 856515
-- runs in 0 seconds
-- Index Seek on ix_wordID_MO_2
select top 10 * from [FTSindex] where [wordID] = 100 and [sID] = 856515 and [wordPos] < 1000
-- never finishes (I only waited 10 minutes)
-- will not even display an execution plan
select * from [FTSindex] where [sID] = 100
-- 45 seconds to return 1500 rows
-- table scan
select * from [FTSindex] where [sID] = 100 and [wordPos] = 1133
-- runs in 0 seconds
-- this uses the pk_FTSindexMO_2
-- this is the only way I could get it to use the primary key
참고
0초
에서 실행 이러한 쿼리의 모든 I은 0 초
ALL 실행을 의미하지 않는다
내 문제가 요약되어 있다고 생각합니다.
Troubleshooting Common Performance Problems with Memory-Optimized Hash Indexes
내가 최적화 된 응용 프로그램 메모리가 사용하는 실제 쿼리에서 기존 디스크 기반 테이블
다시 자극 결국 그것을
CREATE TABLE [dbo].[FTSindex]
(
[sID] [int] NOT NULL,
[wordPos] [int] NOT NULL,
[wordID] [int] NOT NULL,
[charPos] [int] NOT NULL,
INDEX [ix_wordID_MO_2] NONCLUSTERED HASH
(
[wordID]
)WITH (BUCKET_COUNT = 524288),
CONSTRAINT [pk_FTSindexMO_2] PRIMARY KEY NONCLUSTERED
(
[sID] ASC,
[wordPos] ASC
)
)WITH (MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_ONLY)
참고 문제를 해결 한 것으로 보인다이었다
최적화 된 메모리가 더 빨리로드되었지만이 테이블은 한 번 쓰고 읽기가 많습니다.
보유하고있는 레코드 수를 언급하지 않았습니다. –
@HamletHakobyan 어떻게 그게 중요합니까? 상위 10 위도 실행되지 않으며 쿼리 계획을 표시하지도 않습니다. 2 억 개의 행과 같습니다. 나는 기존 데이터로부터 버킷의 크기를 조정했다. – Paparazzi
'OPTION (FAST 10)'힌트를 사용해보고 결과를 알려주십시오. –