एक स्तंभ पर सांख्यिकी निर्माण को कैसे रोकें?


18

मेरे पास एक कॉलम है जिसमें मैं नहीं चाहता हूं कि आंकड़े बनाए जाएं या अपडेट किए जाएं। यदि मैं उस स्तंभ पर मौजूद आँकड़े हिस्टोग्राम के विपरीत प्राथमिक कुंजी पर आँकड़ों के घनत्व का उपयोग करने के लिए क्वेरी ऑप्टिमाइज़र को बाध्य करता हूं, तो मुझे कार्डिनैलिटी अनुमान में बेहतर जुड़ाव मिलता है। डेटाबेस स्तर पर ऑटो-अपडेट और ऑटो-क्रिएट आँकड़े जारी हैं और मैं इसे बदल नहीं सकता।

यदि आप सांख्यिकी निर्माण को रोकने के लिए विकल्प सुझाना चाहते हैं, तो ध्यान रखें कि तालिका का उपयोग हजारों विभिन्न प्रश्नों के संदर्भ में किया गया है। मुझे चलाए जा रहे प्रश्नों पर नियंत्रण नहीं है।

मेरी प्रारंभिक रणनीति कॉलम NOCOMPUTEऔर SAMPLE 0 ROWSविकल्पों के साथ कॉलम पर आंकड़े बनाने के लिए थी । मैं इस धारणा के तहत था कि SQL सर्वर स्वचालित रूप से एक स्तंभ पर आंकड़े नहीं बनाएगा जिसमें पहले से ही एक वस्तु ऑब्जेक्ट हो, लेकिन यह हमारे देव और QA सर्वर पर हुआ है।

के लिए नए आँकड़े बनाए गए COL_GROUP। मेरा NORECOMPUTEआँकड़ा अपडेट नहीं हुआ। मुझे नहीं पता कि आँकड़े क्यों बनाए गए थे और मैं प्रश्नों को चलाकर खुद को ट्रिगर करने में असमर्थ था।

क्या एक कॉलम पर स्वचालित रूप से आँकड़े बनाने से SQL सर्वर को रोकने का कोई तरीका है? मेरी तालिका में केवल दो कॉलम हैं ताकि एक समाधान एक ही तालिका पर ऑटो-आँकड़ों को बनने से रोकता है और मेरी समस्या को भी हल करेगा।

ट्रेस झंडे 4139 और 2371 के मामले में यह फर्क पड़ता है।

यदि आप तालिका संरचना के साथ खेलना चाहते हैं, तो मैंने इसे शामिल किया है और नीचे दिए गए नमूने डेटा:

CREATE TABLE X_NO_COLUMN_STATS(
    [COL_USER] [varchar](256) NOT NULL,
    [COL_GROUP] [int] NOT NULL,
 CONSTRAINT [PK_X_NO_COLUMN_STATS] PRIMARY KEY CLUSTERED 
(
    [COL_USER] ASC,
    [COL_GROUP] ASC
)WITH (DATA_COMPRESSION = PAGE)
);

-- prevent stats from being updated on COL_GROUP
CREATE STATISTICS [X_NO_COLUMN_STATS__COL_GROUP] ON X_NO_COLUMN_STATS ([COL_GROUP]) WITH NORECOMPUTE, SAMPLE 0 ROWS;

BEGIN TRANSACTION;
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',104);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',106);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',107);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',108);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',110);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',111);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',112);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',113);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',114);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',116);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',117);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',118);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',121);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',123);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',124);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',125);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',126);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',129);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',132);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',137);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',139);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',140);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',144);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',145);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',147);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',152);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',153);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',154);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',155);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',162);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',163);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',165);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',168);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',169);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',170);
INSERT INTO X_NO_COLUMN_STATS VALUES ('CUSER1',178);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',102);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',103);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',109);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',110);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',111);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',112);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',114);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',115);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',119);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',120);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',121);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',123);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',124);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',126);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',128);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',136);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',137);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',138);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',142);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',143);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',148);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',151);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',152);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',155);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',156);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',157);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',158);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',165);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',167);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',168);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',169);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',171);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',173);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',176);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',177);
INSERT INTO X_NO_COLUMN_STATS VALUES ('OUSER19',178);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',104);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',108);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',109);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',111);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',112);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',113);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',114);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',116);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',117);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',118);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',121);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',123);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',124);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',125);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',126);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',129);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',132);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',137);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',139);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',140);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',144);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',145);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',147);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',152);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',154);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',155);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',162);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',163);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',165);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',168);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',169);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',170);
INSERT INTO X_NO_COLUMN_STATS VALUES ('TUSER30',178);
COMMIT TRANSACTION;

मुझे पता है, sp_autostatsलेकिन मुझे स्वचालित आँकड़ों के निर्माण को रोकने के लिए कुछ चाहिए। sp_autostatsकेवल आँकड़ों को स्वतः-अद्यतन होने से रोकता है।


1
आपकी वास्तविक तालिका में कितना डेटा है? और दैनिक आधार पर कितना डेटा जोड़ा जाता है?
जॉन उर्फ ​​हॉट 2 यूज

क्या आपने दोनों स्तंभों पर एक आँकड़ा बनाने पर ध्यान दिया है और देखा है कि क्वेरी के प्रदर्शन को कैसे प्रभावित करता है? सृजन सांख्यिकी [X_NO_COLUMN_STATS__COL_GROUP] X_NO_COLUMN_STATS ([COL_USER], [COL_GROUP]) पर; यदि दोनों कॉलम जहां क्लॉज में हैं, तो वह COL_GROUP पर एक स्टेटस नहीं बनाएगा, लेकिन यदि COL_GROUP है तो वह होगा। लेकिन उस मामले में प्रदर्शन COL_USER सांख्यिकीय की तुलना में उस सांख्यिकीय के साथ बेहतर होना चाहिए।
cfradenburg

जवाबों:


1

एक नया डेटाबेस बनाएं (इसे टेस्टस्टैट्स कहते हैं), ऑटो बनाएँ सांख्यिकी को अक्षम करें और वहां X_NO_COLUMN_STATS तालिका को स्थानांतरित करें। इसके बाद अपने डेटाबेस में एक दृश्य बनाएं जो हिस्टोग्राम के बिना तालिका को इंगित करेगा:

CREATE VIEW X_NO_COLUMN_STATS
AS
    SELECT [COL_USER], [COL_GROUP] FROM TestStats.dbo.X_NO_COLUMN_STATS;
GO

अगर मुझे आपकी समस्या सही ढंग से मिल गई तो आप जो चाहते हैं वह हासिल कर लेंगे। आपके CRUD ऑपरेशन बिना किसी तालिका के साथ काम करेंगे (हाँ, यह किसी अन्य डेटाबेस में स्थित होगा, और यह हमेशा ध्यान में रखा जाना चाहिए) दृश्य के माध्यम से उसी नाम के साथ जैसा आपकी तालिका थी।


दुर्भाग्य से इसमें बहुत सारी कमियां हैं: यह विदेशी कुंजी रिश्तों को तोड़ता है, क्रॉस-डेटाबेस लेनदेन का परिचय देता है, बैकअप और रिकवरी को एक समय में अधिक चुनौतीपूर्ण बना देता है, आदि
ब्रेंट ओजर

@BrentOzar यकीन के लिए! लेकिन चुनौतीपूर्ण कार्यों के लिए इसका बहुत बार होना - यह तय करना कि यहाँ क्या बुरा होगा :)
डेनिस रेज़निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.