Sys.stats_colम গুলো কি ভুল?


28

ধরা যাক আমার কাছে Fooকলাম ID1, ID2এবং একটি সংমিশ্রিত প্রাথমিক কী সংজ্ঞাযুক্ত একটি টেবিল রয়েছে ID2, ID1। (আমি বর্তমানে একটি সিস্টেম সেন্টার পণ্য নিয়ে কাজ করছি যার বিপরীতে ক্রমে তালিকাভুক্ত প্রাথমিক কী কলামগুলি টেবিলে সংজ্ঞায় প্রদর্শিত হবে তার সাথে বেশ কয়েকটি সারণী এইভাবে সংজ্ঞায়িত করা আছে))

CREATE TABLE dbo.Foo(
  ID1 int NOT NULL,
  ID2 int NOT NULL,
CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED (ID2, ID1)
);
GO

-- Add a row and update stats so that histogram isn't empty
INSERT INTO Foo (ID1, ID2) VALUES (1,2);
UPDATE STATISTICS dbo.Foo;

key_ordinalকলাম sys.index_columnsশো একই আদেশ তারা যৌগিক প্রাথমিক কী ঘোষণা করা হয়েছে সূচক কলাম:

SELECT t.name, i.name, c.column_id, c.name, ic.index_column_id, ic.key_ordinal
FROM sys.tables AS t
JOIN sys.indexes AS i
ON t.[object_id] = i.[object_id]
JOIN sys.index_columns AS ic
ON ic.[object_id] = i.[object_id]
AND ic.index_id = i.index_id
JOIN sys.columns AS c
ON ic.column_id = c.column_id
AND ic.[object_id] = c.[object_id]
WHERE t.name = 'Foo';

সূচক

হিস্টগ্রাম একই পরিসংখ্যানও পরিসংখ্যান দেখায়:

DBCC SHOW_STATISTICS ('Foo',PK_Foo);

পরিসংখ্যান

তবে sys.stats_columnsবিপরীত ক্রমে তালিকাভুক্ত কলামগুলি দেখায় ( ID1, ID2)।

SELECT s.name, sc.stats_column_id, c.name
FROM sys.stats AS s
JOIN sys.stats_columns AS sc 
ON s.stats_id = sc.stats_id 
AND s.[object_id] = sc.[object_id] 
JOIN sys.columns AS c 
ON c.[object_id] = s.[object_id]
AND c.column_id = sc.column_id
JOIN sys.objects AS o 
ON o.[object_id] = c.[object_id] 
WHERE o.name = 'Foo'
AND s.name = 'PK_Foo';

stats_columns

বই অনলাইন বলছে stats_column_idএকটি "পরিসংখ্যান কলামগুলির সেটগুলির মধ্যে 1-ভিত্তিক অর্ডিনাল", তাই আমি প্রত্যাশা করছিলাম পরিসংখ্যানের অবজেক্টের প্রথম কলামটিতে 1 মানটি নির্দেশ করবে।

এটি কি কোনও বাগ sys.stats_columnsবা আমার পক্ষ থেকে ভুল বোঝাবুঝি?

আমি এই আচরণটি এসকিউএল সার্ভার ২০০৫, ২০০৮, ২০০৮ আর ২, ২০১২ এবং ২০১৪ এর বর্তমান বিল্ডগুলিতে ঘটে যাচাই করেছি।

sys.stats_columns অন্যান্য পরিস্থিতিতে যেমন পরিসংখ্যান বস্তুর মধ্যে অর্ডার প্রতিফলিত হয় বলে মনে হয়, উদাহরণস্বরূপ:

CREATE TABLE dbo.Foo2(
  ID1 int NOT NULL,
  ID2 int NOT NULL,
  ID3 int NULL,
  String VARCHAR(10) NULL,
CONSTRAINT [PK_Foo2] PRIMARY KEY CLUSTERED (ID2, ID1)
);

GO

INSERT INTO Foo2 (ID1, ID2, ID3, String) VALUES (1,2,3,'String');

CREATE STATISTICS ST_Test ON Foo2 (ID3, String);
CREATE STATISTICS ST_Test2 ON Foo2 (String, ID3);

DBCC SHOW_STATISTICS ('Foo2',ST_Test);
DBCC SHOW_STATISTICS ('Foo2',ST_Test2);


SELECT s.name, sc.stats_column_id, c.name
FROM sys.stats AS s
JOIN sys.stats_columns AS sc 
ON s.stats_id = sc.stats_id 
AND s.[object_id] = sc.[object_id] 
JOIN sys.columns AS c 
ON c.[object_id] = s.[object_id]
AND c.column_id = sc.column_id
JOIN sys.objects AS o 
ON o.[object_id] = c.[object_id] 
WHERE o.name = 'Foo2'
AND s.name LIKE 'ST_Test%';

morestats

এখানে অন্য উদাহরণ যেখানে sys.stats_columnsসূচকের পরিসংখ্যানগুলির জন্য, সঠিক তথ্যটি ফেরত দেওয়া হচ্ছে:

--drop table dbo.Foo3
CREATE TABLE dbo.Foo3(
  ID1 int NOT NULL,
  ID2 int NOT NULL,
  ID3 int NULL,
  String VARCHAR(10) NULL,
CONSTRAINT [PK_Foo3] PRIMARY KEY CLUSTERED (ID2, ID1)
);

GO

INSERT INTO Foo3 (ID1, ID2, ID3, String) VALUES (1,2,3,'String');
UPDATE STATISTICS Foo3;

CREATE INDEX IX_Test ON Foo3 (ID3, String);
CREATE INDEX IX_Test2 ON Foo3 (String, ID3);

DBCC SHOW_STATISTICS ('Foo3',IX_Test);
DBCC SHOW_STATISTICS ('Foo3',IX_Test2);

SELECT s.name, sc.stats_column_id, c.name
FROM sys.stats AS s
JOIN sys.stats_columns AS sc 
ON s.stats_id = sc.stats_id 
AND s.[object_id] = sc.[object_id] 
JOIN sys.columns AS c 
ON c.[object_id] = s.[object_id]
AND c.column_id = sc.column_id
JOIN sys.objects AS o 
ON o.[object_id] = c.[object_id] 
WHERE o.name = 'Foo3'
AND s.name LIKE 'IX_Test%';

moremorestats


3
কয়েক মাস আগে আমারও একই প্রশ্ন ছিল তবে তা মুছে ফেলেছি। এর জন্যে দুঃখিত. তা সত্ত্বেও, stats_column_idsys.stats_columnsএটি যা বলে এটা আছে কি মনে হচ্ছে না। যেহেতু আপনি একটি সূচককে সমর্থন করছেন, তাই আমি সূচী কলাম ক্রমের সাথে লেগে থাকি। আপনি যদি index_col()
এখনকার

5
সম্ভবত আপনি কি / এর জন্য একটি মাইক্রোসফ্ট কানেক্ট আইটেম ফাইল করতে পারেন? আমার কাছে বগি মনে হচ্ছে।
ম্যাক্স ভার্নন

6
@ ম্যাক্স ভার্নন, স্বাশ্স্ক এখানে
জেমস এল

উত্তর:


5

এটি একটি দীর্ঘস্থায়ী ত্রুটি বলে মনে হচ্ছে:

স্বশেক - মার্চ 5, 2015 পোস্ট করা হয়েছে:

https://connect.microsoft.com/SQLServer/feedback/details/1163126

এমএসডিএন নোট করে যে sys.stats_column.stats_column_id "পরিসংখ্যান কলামগুলির সেটের মধ্যে 1-ভিত্তিক অর্ডিনাল।" যাইহোক, এটি টেবিল সংজ্ঞা ক্রম প্রতিফলিত বলে মনে হচ্ছে। পরিবর্তিত সূচক আদেশটি sys.stats_colums এ প্রতিফলিত হয় না।

ম্যাক্স ভার্নন এবং জেমস লুপল্ট তাদের মন্তব্য / উত্সাহের ভিত্তিতে সম্মত বলে মনে হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.