কোন এসকিউএল গণনা কোয়েরি গতি বাড়িয়ে দিতে পারে?


9

একটি গণনা (সমষ্টিগত) এসকিউএল কোয়েরি করার সময়, এই 3 টি ডাটাবেস সিস্টেমে কার্যকর করার সময়টি কী গতি বাড়িয়ে তুলতে পারে? আমি নিশ্চিত যে অনেক কিছুই এটির গতি বাড়িয়ে দিতে পারে (একটির জন্য হার্ডওয়্যার), তবে আমি কেবল একজন নবজাতক ডিবিএ, সুতরাং আমি নিশ্চিত যে এখানে আমি কয়েকটি উত্তর পাব। আমি প্রায় 157 মিলিয়ন সারি একটি এসকিউএল সার্ভার ডাটাবেসে স্থানান্তরিত করেছি এবং এই ক্যোয়ারি চিরকালের জন্য নিচ্ছে। তবে আমার উত্স নেতেজা ডাটাবেসে, এটি কয়েক সেকেন্ড সময় নেয়।

উদাহরণ স্বরূপ:

Netezza 6:

SELECT COUNT(*) FROM DATABASENAME..MYTABLE

ওরাকল 11 জি:

SELECT COUNT(*) FROM MYTABLE

এসকিউএল সার্ভার ২০১২:

SELECT COUNT(*) FROM DATABASENAME.[dbo].[MYTABLE]

: এই প্রশ্ন তাকান পারে stackoverflow.com/questions/11130448/sql-count-performance

1
আপনার কি একবারে, বা বারবার এটি করা দরকার?
জন সেগেল

@ জোনসিগেল আমরা ইনক্রিমেন্টাল লোড করছি, এবং আমরা প্রতিদিন ডাটাবেস সিস্টেমের মধ্যে রেকর্ডগুলি তুলনা করছি যাতে গণনাগুলি যোগ হয়ে যায়। তাই বারবার।
ম্যাকগাইভার

উত্তর:


10

নেটেজজা এমন একটি সরঞ্জাম যা বড় টেবিল স্ক্যানগুলিতে এক্সেল করার জন্য ডিজাইন করা হয়েছিল, এজন্য আপনি সেই সিস্টেমে এত দ্রুত ফলাফল পেয়ে যাচ্ছেন।

আপনার এসকিউএল সার্ভারের জন্য, আপনি sys.dm_db_partition_stats DMV থেকে জিজ্ঞাসা করে সারি গণনাটি প্রচুর পরিমাণে বাড়িয়ে দিতে পারেন।

SELECT s.name AS [Schema], o.name AS [Table], SUM(p.row_count) AS [RowCount]
FROM sys.dm_db_partition_stats p JOIN sys.objects o
ON p.object_id = o.object_id JOIN sys.schemas s
ON o.schema_id = s.schema_id
WHERE p.index_id < 2
AND o.object_id = object_id('MyTable')
GROUP BY o.name, s.name;

উচ্চ লেনদেনের পরিবেশে, এই ডিএমভি 100% নির্ভুল হওয়ার নিশ্চয়তা দেয় না। তবে আপনার প্রশ্ন থেকে মনে হচ্ছে আপনার স্থানান্তরিত হওয়ার পরে আপনি প্রতিটি টেবিল যাচাই করতে সারি গণনা করছেন, সুতরাং এই ক্যোয়ারীটি আপনার পক্ষে কাজ করা উচিত।


4
@ ফিল কেন? আপনি যদি টেবিলগুলি লুপ করেন এবং প্রতিটি থেকে একটি ব্যয়বহুল নির্বাচন করুন (*) করেন - আপনি শেষ টেবিলে পৌঁছে একবার প্রথম ফলাফলটি কতটা সঠিক?
অ্যারন বারট্রান্ড

1
স্পষ্টতার জন্য, ফিল বলেছিল: "ডেটা ডিকশনারি ব্যবহার করা, যা ১০০% নির্ভুল ফলাফল সরবরাহ করে না তা খারাপ পরামর্শ my আমার মতে উত্তরটি হয় পরামর্শটি সরাতে বা মুছে ফেলা উচিত - লোকদের এই জাতীয় উত্তরের জন্য গুগল মনে রাখবেন এবং অন্ধভাবে চোখ বন্ধ করে দেবেন কাটা এবং পেস্ট করুন ... "আমি সম্মত হলাম যে দাবি অস্বীকার করা গুরুত্বপূর্ণ (এবং এমন কিছু প্রান্তের ঘটনা রয়েছে যেখানে মেটাডেটা বুদ্ধিমান ফলাফল দেয় না), আমি একমত নই যে সাধারণভাবে মেটাডেটা ভিউগুলি ব্যবহার করা খারাপ পরামর্শ।
অ্যারন বারট্র্যান্ড

5

এখানে একটি এসকিউএল সার্ভার সমাধান রয়েছে যা COUNT_BIGএকটি ইনডেক্স ভিউয়ের অভ্যন্তরে ব্যবহার করে । এটি আপনাকে বড় টেবিল বা সূচক স্ক্যানগুলির ওভারহেড ছাড়াই এবং পরবর্তীকালের জন্য প্রয়োজনীয় স্টোরেজটির প্রয়োজন ছাড়াই একটি লেনদেনের ভিত্তিতে সামঞ্জস্যপূর্ণ গণনা অর্জন করবে:

CREATE TABLE [dbo].[MyTable](id int);
GO

CREATE VIEW [dbo].[MyTableRowCount]
    WITH SCHEMABINDING
AS

    SELECT
        COUNT_BIG(*) AS TableRowCount
        FROM [dbo].[MyTable];
GO

CREATE UNIQUE CLUSTERED INDEX IX_MyTableRowCount
    ON [dbo].[MyTableRowCount](TableRowCount);
GO

SELECT
    TableRowCount
    FROM [dbo].[MyTableRowCount] WITH(NOEXPAND);

এর জন্য একটি একক প্রাথমিক স্ক্যানের প্রয়োজন হবে (এ থেকে দূরে সরে যাবেন না) এবং ইনক্রিমেন্টাল টেবিল ডেটা ম্যানিপুলেশনে কিছুটা ওভারহেড যুক্ত করুন। যদি আপনি প্রচুর ডেটা (অনেকগুলি ছোট অপারেশনের বিপরীতে) দিয়ে বড় অপারেশন করেন তবে আমি মনে করি পরিবর্তনের উপরের ওভারহেডটি নগদ হওয়া উচিত।


@ এসকিউএলকিউই: কীভাবে পাঠাগুলি 2012-এর পূর্ববর্তী অবরুদ্ধ? এসকিউএল সার্ভার বাগ?
জন সেগেল

@ জোনসিগেল - আমার $ 0,05: অফলাইনে তৈরি সাধারণ টেবিলের সাধারণ ক্লাস্টারযুক্ত সূচিগুলি টেবিলে একটি শ-এম লক প্রয়োগ করে। একটি দৃশ্যে অবশ্যই এটির প্রয়োজন নেই তবে এর অর্থ সূচক তৈরির জন্য একটি বিশেষ কেস তৈরি করতে সূচক তৈরি করুন ক্রিয়াকলাপে একটি পরিবর্তন - যা এসকিউএল ২০১২ এর জন্য করা হয়েছিল। আইএমএইচও অবশ্যই।
ফ্যাব্রিকিও আরাউজো

3

ওরাকলে, একটি নোট নাল কলামে বাইনারি ট্রি ইনডেক্স একটি COUNT (*) এর উত্তর দিতে ব্যবহার করা যেতে পারে। এটি সম্পূর্ণ টেবিলে স্ক্যানের চেয়ে বেশিরভাগ ক্ষেত্রে দ্রুত হবে কারণ সূচীগুলি সাধারণত তাদের বেস টেবিলের চেয়ে ছোট হয়।

তবে, নিয়মিত বাইনারি ট্রি ইনডেক্স 157 মওস সহ এখনও বিশাল still যদি আপনার টেবিলটি একই সাথে আপডেট হয় না (যেমন, শুধুমাত্র ব্যাচ লোড প্রক্রিয়া), তবে আপনি পরিবর্তে একটি বিটম্যাপ সূচক ব্যবহার করতে চাইতে পারেন।

ক্ষুদ্রতম বিটম্যাপ সূচকটি এরকম কিছু হবে:

CREATE BITMAP INDEX ix ON your_table(NULL);

নাল এন্ট্রিগুলি বিটম্যাপ সূচক দ্বারা বিবেচনা করা হয়। নিয়মিত বাইনারি ট্রি ইনডেক্স বা বেস টেবিলের তুলনায় ফলস সূচকটি ছোট (20 মিলিয়ন 8 কে 8 ব্লক প্রতি মিলিয়ন সারি) হবে।

ফলাফলের পরিকল্পনাটি নিম্নলিখিত ক্রিয়াকলাপগুলি দেখানো উচিত:

----------------------------------------------
| Id  | Operation                     | Name | 
----------------------------------------------
|   0 | SELECT STATEMENT              |      |
|   1 |  SORT AGGREGATE               |      |
|   2 |   BITMAP CONVERSION COUNT     |      |
|   3 |    BITMAP INDEX FAST FULL SCAN| IX   |
----------------------------------------------

যদি আপনার টেবিলটি একই সাথে আপডেট করা হয়, তবে একটি অনন্য মান সহ একটি বিটম্যাপ সূচকটি একটি বিতর্ক বিষয় হবে এবং এটি ব্যবহার করা উচিত নয়।


3

ওরাকলে, সাধারণ গণনা ক্যোয়ারী প্রায়শই পুরো টেবিলের পরিবর্তে একটি সূচি স্ক্যান করে সম্পাদন করা হয়। সূচকটি অবশ্যই বিটম্যাপ সূচক হতে হবে বা একটি কলামে নুয়াল বাধা নয় defined পূর্ণ টেবিল স্ক্যানের প্রয়োজন এমন আরও জটিল প্রশ্নের জন্য আপনি সমান্তরাল ক্যোয়ারী ব্যবহার করতে পারেন।

সমান্তরাল ক্যোয়ারী সক্ষম করতে (এন্টারপ্রাইজ সংস্করণ প্রয়োজন), আপনি অপটিমাইজার ইঙ্গিতটি ব্যবহার করতে পারেন:

select /*+ PARALLEL(mytable, 12) */ count(*) from mytable;

বা টেবিলের সমস্ত প্রশ্নের জন্য সমান্তরাল ক্যোয়ারী সক্ষম করুন:

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