অ্যারেগুলির দক্ষ মার্জিং (সদৃশগুলি অপসারণ)


10

আমার দুটি টেবিল আছে, left2এবং right2। উভয় সারণী বড় হবে (1-10 এম সারি)।

CREATE TABLE left2(id INTEGER, t1 INTEGER, d INTEGER);
ALTER TABLE left2 ADD PRIMARY KEY (id,t1);

CREATE TABLE right2( t1 INTEGER, d INTEGER, arr INTEGER[] );
ALTER TABLE right2 ADD PRIMARY KEY(t1,d);

আমি এই ধরণের কোয়েরি সম্পাদন করব:

SELECT l.d + r.d,
       UNIQ(SORT((array_agg_mult(r.arr)))
FROM left2 l,
     right2 r
WHERE l.t1 = r.t1
GROUP BY l.d + r.d
ORDER BY l.d + r.d;

অ্যারে সংহত করার জন্য যেখানে আমি এই ফাংশনটি ব্যবহার করি:

CREATE AGGREGATE array_agg_mult(anyarray) (
SFUNC=array_cat,
STYPE=anyarray,
INITCOND='{}');

অ্যারেগুলি কনটেনেট করার পরে আমি মডিউলটির UNIQফাংশনটি ব্যবহার করি intarray। এটি করার আরও কার্যকর উপায় আছে? arr(ডুপ্লিকেট অপসারণ সহ) একত্রীকরণের গতি বাড়ানোর জন্য মাঠে কি কোনও সূচক রয়েছে ? সামগ্রিক ফাংশন ডুপ্লিকেটগুলি সরাসরি মুছে ফেলতে পারে? আসল অ্যারেগুলি সাজানো হিসাবে বিবেচনা করা যেতে পারে (এবং তারা অনন্য) যদি এটি সাহায্য করে।

এসকিউএল ফিডল এখানে রয়েছে :


আপনি একবারে কয়েক মিলিয়ন সারি জিজ্ঞাসা করতে যাচ্ছেন? ফলাফল নিয়ে আপনি কী করছেন? বা কিছু নির্বাচন করার পূর্বাভাস থাকবে? right2.arr আপনার ডেমো স্কিমার পরামর্শ মতো নুল কি হতে পারে? ফলস্বরূপ আপনার কি সাজানো অ্যারে দরকার?
এরউইন ব্র্যান্ডসেটেটার

উত্তর:


9

সঠিক ফলাফল?

প্রথম বন্ধ: সঠিকতা। আপনি অনন্য উপাদানের একটি অ্যারে উত্পাদন করতে চান? আপনার বর্তমান ক্যোয়ারী এটি করে না। ইনটারে মডিউলuniq() থেকে ফাংশনটি কেবল প্রতিশ্রুতি দেয়:

সংলগ্ন সদৃশগুলি মুছে ফেলুন

ম্যানুয়ালটিতে নির্দেশিত মত , আপনার প্রয়োজন হবে:

SELECT l.d + r.d, uniq(sort(array_agg_mult(r.arr)))
FROM   ...

আপনাকে সাজানো অ্যারেও দেয় - ধরে নিলেন যে আপনি এটি চান, আপনি স্পষ্ট করেননি।

আমি দেখতে পাচ্ছি যে আপনার ফ্রিডলটি আপনার কাছে sort() রয়েছে তাই এটি আপনার প্রশ্নের মধ্যে একটি টাইপও হতে পারে।

পোস্টগ্রাগেস 9.5

উভয় ক্ষেত্রেই, আপনি হবে ভালবাসেন নতুন Postgres 9.5 (বর্তমানে বিটা)। এটি array_agg_mult()বাক্সের বাইরে চলে যাওয়ার ক্ষমতা এবং আরও দ্রুত সরবরাহ করে:

অ্যারে হ্যান্ডলিংয়ের জন্য অন্যান্য কার্যকারিতা উন্নতিও হয়েছে।

প্রশ্ন

এর মূল উদ্দেশ্য array_agg_mult()হ'ল বহু-মাত্রিক অ্যারেগুলি একত্রিত করা, তবে আপনি কেবল যাইহোক 1-মাত্রিক অ্যারে উত্পাদন করেন। সুতরাং আমি অন্তত এই বিকল্প কোয়েরি চেষ্টা করব:

SELECT l.d + r.d AS d_sum, array_agg(DISTINCT elem) AS result_arr
FROM   left2  l
JOIN   right2 r USING (t1)
     , unnest(r.arr) elem
GROUP  BY 1
ORDER  BY 1;

যা আপনার প্রশ্নকেও সম্বোধন করে:

সামগ্রিক ফাংশন ডুপ্লিকেটগুলি সরাসরি মুছে ফেলতে পারে?

হ্যাঁ, এটি পারে DISTINCT। তবে এটি uniq()পূর্ণসংখ্যার অ্যারেগুলির চেয়ে দ্রুততর নয় , যা পূর্ণসংখ্যার অ্যারেগুলির জন্য অনুকূলিত করা হয়েছে, যখন DISTINCTসমস্ত যোগ্যতার ডেটা ধরণের ক্ষেত্রে জেনেরিক।

intarrayমডিউলটির প্রয়োজন নেই । তবে ফলাফলটি বাছাই করা অগত্যা নয়। পোস্টগ্র্রেস DISTINCT(আইআইআরসি) এর জন্য পৃথক পৃথক অ্যালগরিদম ব্যবহার করে , বড় সেটগুলি সাধারণত হ্যাশ করা হয়, তবে আপনি স্পষ্টভাবে যুক্ত না করলে ফলাফল বাছাই করা হয় না ORDER BY। আপনার যদি সাজানোর অ্যারে দরকার হয় তবে আপনি সরাসরি সামগ্রিক ক্রিয়ায় যুক্ত করতে পারেন ORDER BY:

array_agg(DISTINCT elem ORDER BY elem)

তবে এটি প্রাক-সাজানো ডেটাগুলিকে খাওয়ানোর চেয়ে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়array_agg() one সুতরাং আমি একটি subquery বাছাই এবং তারপর সমষ্টি:

SELECT d_sum, uniq(array_agg(elem)) AS result_arr
FROM  (
   SELECT l.d + r.d AS d_sum, elem
   FROM   left2  l
   JOIN   right2 r USING (t1)
        , unnest(r.arr) elem
   ORDER  BY 1, 2
   ) sub
GROUP  BY 1
ORDER  BY 1;

এটি পোস্টগ্রিস 9.4-এ আমার কার্সারি পরীক্ষার সবচেয়ে দ্রুততম বৈকল্পিক ছিল।

আপনি যে সরবরাহ করেছেন তার উপর ভিত্তি করে এসকিউএল ফিডল

সূচক

আমি এখানে কোনও সূচকের পক্ষে খুব বেশি সম্ভাবনা দেখছি না। একমাত্র বিকল্প হবে:

CREATE INDEX ON right2 (t1, arr);

কেবলমাত্র যদি আপনি এর বাইরে সূচি-কেবল স্ক্যানগুলি পান তবেই তা বোঝা যায় - যা যদি অন্তর্নিহিত টেবিলটি right2কেবলমাত্র এই দুটি কলামের চেয়ে আরও বিস্তৃত হয় এবং আপনার সেটআপ কেবলমাত্র সূচি-স্ক্যানের জন্য যোগ্যতা অর্জন করে । পোস্টগ্রিস উইকিতে বিশদ।


ধন্যবাদ +1 আমি যাইহোক যাইহোক পরে UNNEST করতে হবে, তবে অ্যারেগুলিতে সদৃশগুলি অপসারণ করা উচিত এবং তারপরে UNNEST দ্রুততর কিনা তা পরীক্ষা করতে চাই।
আলেকজান্দ্রোস

0

আমি সত্যিই হতাশ, মাইক্রোসফ্ট অ্যাক্সেসে এটি করা সহজ কাজ। আপনি "ডুপ্লিকেটগুলি সরান" ক্যোয়ারী তৈরি করতে পারেন এবং এসকিউএল এটি কীভাবে করছে তা দেখুন। আমি দেখতে একটি উইন্ডোজ মেশিন জ্বালিয়ে দিতে হবে। তারা পরিবর্তিত হয়, ক্যোয়ারী উইজার্ড এটি করে।

আমার মনে হয় যে কাজ করে তা হ'ল আপনার সমস্ত ডেটা এক টেবিলের মধ্যে লোড করা, তারপরে একটি নতুন টেবিলের মধ্যে নির্বাচন নির্বাচন করুন do আপনি যখন থাকবেন তখন আপনি ধারা দ্বারা কোনও অর্ডারে আটকেও রাখতে পারেন। আমি এক বছর আগে এটি কোনওভাবে করেছি, এটি অবশ্যই হবে।

আমি 2 বছরের মূল্যবান তাপমাত্রার ডেটা একত্রিত করছি, সেন্সর প্রতি মিনিটে একই তথ্য পয়েন্টের 2 অনুলিপি অপ্রয়োজনীয় সেফগার্ড হিসাবে প্রেরণ করে। কখনও কখনও একজন ট্র্যাশ হয়ে যায় তবে আমি কেবল এটি রাখতে চাই। আমারও ফাইলগুলির মধ্যে ওভারল্যাপ রয়েছে।

যদি ডেটা পুরো রান করার সময় ঠিক একই ফর্ম্যাট হয় তবে ইউনিক্স মেশিনে আপনি এর মতো কিছু করতে পারেন

cat *.tab > points.txt
sort -n < points.txt > sorted.txt
uniq -u sorted.txt unique.txt

তবে ইউনিক স্ট্রিংগুলির সাথে লাইনগুলির তুলনা করে এবং উদাহরণস্বরূপ 18.7000 18.7 এর মতো নয়। আমি আমার সফ্টওয়্যারটি 2 বছরের মধ্যে পরিবর্তন করেছি যাতে আমার উভয় ফর্ম্যাট থাকে।


পোস্টগ্রিস থেকে হতাশ? অ্যাক্সেস এমনকি অ্যারে আছে?
ypercubeᵀᴹ

আমি জানি না তবে এটি সদৃশগুলি মুছে ফেলতে পারে, এটি ডেটা সাফ করার ক্ষেত্রে যথেষ্ট সাধারণ সমস্যা। পৃথক নির্বাচন যথেষ্ট যথেষ্ট। বাস্তব বিশ্ব থেকে আপনার কাঁচা ডেটার উপরে সর্বদা আপনার নিয়ন্ত্রণ নেই।
অ্যালান কোরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.