-1

내가 몇 가지 물건에 대한 좋은 반응 시간을 얻고 몇 가지 물건에 대한 메모리 최적화 테이블
와 큰 테이블을 대체 그것은
그것은 복합 기본 키
유일한 방법 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) 

참고 문제를 해결 한 것으로 보인다이었다
최적화 된 메모리가 더 빨리로드되었지만이 테이블은 한 번 쓰고 읽기가 많습니다.

+0

보유하고있는 레코드 수를 언급하지 않았습니다. –

+0

@HamletHakobyan 어떻게 그게 중요합니까? 상위 10 위도 실행되지 않으며 쿼리 계획을 표시하지도 않습니다. 2 억 개의 행과 같습니다. 나는 기존 데이터로부터 버킷의 크기를 조정했다. – Paparazzi

+0

'OPTION (FAST 10)'힌트를 사용해보고 결과를 알려주십시오. –

답변

1

해시 인덱스는 범위 스캔에 사용할 수 없습니다. | 위 인덱스는 다음과 같습니다.

+0

그게 무슨 뜻인지 모르겠다 – Paparazzi

+0

해시 인덱스를 사용하면 지정된 검색 키가있는 모든 행을 가져올 수 있습니다. 색인 범위를 정렬하거나 검색하는 데 사용할 수 없습니다. 문서를 참조하십시오. – usr

+0

그러나 범위 색인이라고하는 것은 없습니다. 나는 비 클러스터 인덱스 (해시가없는)를 의미한다고 생각합니다. – Paparazzi