SQL Server 2014에는 다음과 같은 테이블이 있습니다.
CREATE TABLE dbo.MyTable
(
[id1] [bigint] NOT NULL,
[id2] [bigint] NOT NULL,
[col1] [int] NOT NULL default(0),
[col2] [int] NOT NULL default(0)
)
(id1, id2)는 PK입니다. 기본적으로 id1은 pk가 id2 인 결과 집합 (id2, col1, col2)을 그룹화하는 식별자입니다.
병목 현상 인 기존 디스크 기반 테이블을 제거하기 위해 메모리 내 테이블을 사용하려고합니다.
- 테이블의 데이터는 기록-> 읽기-> 한 번 삭제됩니다.
- 각 id1 값에는 수천 개의 id2가 있습니다 (수십 / 수백).
- 데이터는 매우 짧은 시간 (예 : 20 초) 동안 테이블에 저장됩니다.
이 테이블에서 수행 된 쿼리는 다음과 같습니다.
-- INSERT (can vary from 10s to 10,000s of records):
INSERT INTO MyTable
SELECT @fixedValue, id2, col1, col2 FROM AnotherTable
-- READ:
SELECT id2, col1
FROM MyTable INNER JOIN OtherTbl ON MyTable.id2 = OtherTbl.pk
WHERE id1 = @value
ORDER BY col1
-- DELETE:
DELETE FROM MyTable WHERE id1 = @value
테이블에 사용한 현재 정의는 다음과 같습니다.
CREATE TABLE dbo.SearchItems
(
[id1] [bigint] NOT NULL,
[id2] [bigint] NOT NULL,
[col1] [int] NOT NULL default(0),
[col2] [int] NOT NULL default(0)
CONSTRAINT PK_Mem PRIMARY KEY NONCLUSTERED (id1,id2),
INDEX idx_Mem HASH (id1,id2) WITH (BUCKET_COUNT = 131072)
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
불행히도,이 정의는 디스크 기반 테이블의 이전 상황과 관련하여 성능이 저하됩니다. 크기 차수는 10 % 정도 더 높거나 적습니다 (일부 경우 100 %에 도달하므로 더블 타임).
무엇보다도 Microsoft가 광고하는 잠금없는 아키텍처를 고려할 때 동시성 시나리오에서 뛰어난 이점을 얻을 것으로 기대했습니다. 대신 최악의 성능은 테이블에서 여러 쿼리를 실행하는 여러 명의 동시 사용자가있을 때입니다.
질문 :
- 올바른 BUCKET_COUNT는 무엇입니까?
- 어떤 종류의 색인을 사용해야합니까?
- 디스크 기반 테이블보다 성능이 떨어지는 이유는 무엇입니까?
sys.dm_db_xtp_hash_index_stats 의 쿼리 는 다음을 반환합니다.
total_bucket_count = 131072 empty_bucket_count = 0 avg_chain_len = 873 max_chain_length = 1009
버킷 수를 변경하여 sys.dm_db_xtp_hash_index_stats 의 출력 은 다음과 같습니다.
total_bucket_count = 134217728 empty_bucket_count = 131664087 avg_chain_len = 1 max_chain_length = 3
그럼에도 불구하고 결과는 더 나쁘지 않더라도 거의 같습니다.
select * from sys.dm_db_xtp_hash_index_stats
? 또한이 링크는 대부분 / 모든 질문에 답변해야합니다. msdn.microsoft.com/en-us/library/…
OPTION(OPTIMIZE FOR UNKNOWN)
( 테이블 힌트 참조)로 쿼리를 실행 해 보셨습니까 ?