Monday 20 January 2014

Cassandra Data Modelling - Primary Keys

In the previous blog we discussed how data is stored in Cassandra by creating a keyspace and a table. We also inserted rows into the table. The rows in Cassandra are stored in the form of variable key/value pairs or columns. We also observed that each row in a table is referenced by a primary key or a row key. In this post we are going to discuss more about primary keys. Primary key concept in Cassandra is different from Relational databases. Therefore it is worth spending time to understand this concept.


In our last post we created a person table which had a person_id as a primary key column.
create table person (person_id int primary key, fname text, lname text, dateofbirth timestamp, email text, phone text );
We saw that the person_id was used as a row key to refer to person data.


Compound primary key:

As the name suggests, compound primary key is comprised of one or more columns which are referenced in the primary key. One component of compound primary key is called partition key where as the other component is called clustering key. Following are different variations of primary keys. Please note that K1, K2, K3,... and so on represent columns in the table. 

  1. K1: primary key has only one partition key and no cluster key.
  2. (K1, K2): column K1 is a partition key and column K2 is a cluster key.
  3. (K1,K2,K3,...): column K1 is a partition key and columns K2, K3 and so on make cluster key.
  4. (K1, (K2, K3,...)): It is same as 3 i.e column K1 is a partition key and columns K2,K3,... make cluster key.
  5. ((K1, K2,...), (K3,K4,...)): columns K1, K2 make partition key and columns K3,K4,... make cluster key. 
It is important to note that when compound key is K1,K2,K3 then the first key K1 becomes partition key and rest of the keys become part of the cluster key. In order to make composite partition keys we have to specify keys in parenthesis such as: ( ( K1,K2) , K3, K4).  In this case K1 & K2 are part of partition keys and K3, K4 are part of cluster key.

Partition key

The purpose of partition key is to identify the partition or node in the cluster which stores that row. When data is read or write from the cluster a function called Partitioner is used to compute the hash value of the partition key. This hash value is used to determine the node/partition which contains that row. For example rows whose partition key values range from 1000 to 1234 may reside in node A and rows with partition key values range from 1235 to 2000 may reside in node B as shown in figure 1. If a row contains partition key whose hash value is 1233 then it will be stored in node A.
Figure 1: Cluster with node A stores partition keys with hash values from 1000-1234 and node B with hash values from 1235-2000.

Clustering key

The purpose of clustering key is to store row data in sorted order. The sorting of data is based on columns which are included in the clustering key. This arrangement makes it efficient to retrieve data using clustering key.

To make these concepts clear we will consider example of weather forecast system. The purpose of this system is to store weather related data. First we will create a weather keyspace using cqlsh. Type the following command on cqlsh terminal window:

Examples

create keyspace weather with replication = {'class' : 'SimpleStrategy', 'replication_factor':1};
This creates weather keyspace with replication strategy 'SimpleStrategy' and replication_factor 1.


Now switch to weather keyspace:
use weather

We will create a table city which contains general weather information about that city. Type the following create statement into cqlsh.
create table city (cityid int, avg_tmp float, description text, primary key (cityid));
The above statement will create a table city with primary key cityid. As there is only one column in the primary key therefore the partition key would be cityid and there will no clustering key.

Type the following insert statements to enter some data into this table.
insert into city (cityid, avg_tmp, description) values (1,25.5,'Mild weather');
insert into city (cityid, avg_tmp, description) values (2,3,'Cold weather');

Check the data which we have just inserted into the table.

select * from city;

The output would be as follows:

 cityid | avg_tmp | description
--------+---------+--------------
      1 |    25.5 | Mild weather
      2 |       3 | Cold weather


We can see how Cassandra has stored this data under the hood by using cassandra-cli tool. Run cassandra-cli tool in a separate terminal window and type the following command on that terminal.

use weather;

list city;

RowKey: 1
=> (name=, value=, timestamp=1387128357537000)
=> (name=avg_tmp, value=41cc0000, timestamp=1387128357537000)
=> (name=description, value=4d696c642077656174686572, timestamp=1387128357537000)
-------------------
RowKey: 2
=> (name=, value=, timestamp=1387128377816000)
=> (name=avg_tmp, value=40400000, timestamp=1387128377816000)
=> (name=description, value=436f6c642077656174686572, timestamp=1387128377816000)

2 Rows Returned.
Elapsed time: 163 msec(s).

We can see from the above output that the cityid has become the row key and it identifies individual rows. We can use columns in the primary key to filter data in the select statement. Type the following command in the cqlsh window:

select * from city where cityid = 1;


We get the following output:

cityid | avg_tmp | description
--------+---------+--------------
      1 |    25.5 | Mild weather



Now we will create another table called forecast which records temperature of each city for every day. Type the following command on cqlsh:
create table forecast(cityid int,forecast_date timestamp,humidity float,chanceofrain float,wind float,feelslike int, centigrade int, primary key (cityid,forecast_date));

This statement creates forecast table with primary key ( city id, forecast_date). As primary key has two components therefore the first component is considered as partition key and the second component becomes the cluster key. Add some data into the table:

insert into forecast(cityid,forecast_date,humidity,chanceofrain,wind,feelslike,centigrade) values (1,'2013-12-10',0.76,0.1,10,8,8);
insert into forecast(cityid,forecast_date,humidity,chanceofrain,wind,feelslike,centigrade) values (1,'2013-12-11',0.90,0.3,12,4,4);
insert into forecast(cityid,forecast_date,humidity,chanceofrain,wind,feelslike,centigrade) values (1,'2013-12-12',0.68,0.2,6,3,3);

Notice that in this case value of partition key i.e cityid is same where as value of clustering key i.e forcast_date is different. Now retrieve this data from the table.

select * from forecast;

We get following output:

 cityid | forecast_date            | centigrade | chanceofrain | feelslike | humidity | wind
--------+--------------------------+------------+--------------+-----------+----------+------
      1 | 2013-12-10 00:00:00+0000 |          8 |          0.1 |         8 |     0.76 |   10
      1 | 2013-12-11 00:00:00+0000 |          4 |          0.3 |         4 |      0.9 |   12
      1 | 2013-12-12 00:00:00+0000 |          3 |          0.2 |         3 |     0.68 |    6

As expected we get three rows with all rows having same partition key values but different clustering key values. Lets check how it looks like in cassandra-cli. Go to cassandra cli and type the following command:
list forecast

It displays following output:

RowKey: 1
=> (name=2013-12-10 00\:00\:00+0000:, value=, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:centigrade, value=00000008, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:chanceofrain, value=3dcccccd, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:feelslike, value=00000008, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:humidity, value=3f428f5c, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:wind, value=41200000, timestamp=1386700252831000)
=> (name=2013-12-11 00\:00\:00+0000:, value=, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:centigrade, value=00000004, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:chanceofrain, value=3e99999a, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:feelslike, value=00000004, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:humidity, value=3f666666, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:wind, value=41400000, timestamp=1386700252835000)
=> (name=2013-12-12 00\:00\:00+0000:, value=, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:centigrade, value=00000003, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:chanceofrain, value=3e4ccccd, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:feelslike, value=00000003, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:humidity, value=3f2e147b, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:wind, value=40c00000, timestamp=1386700255855000)

1 Row Returned.
Elapsed time: 200 msec(s).

We can see from the output that Cassandra-cli has returned only one row instead of three rows as returned by cqlsh. The reason is that Cassandra stores only one row for each partition key. All the data associated to that partition key is stored as columns in the datastore. The data which we have stored through three different insert statements have the same cityid value i.e. 1 therefore all the data is saved in that row as columns.
If you remember we discussed before that the second component of a primary key is called clustering key. The role of clustering key is to group related items together. All the data which is inserted against same clustering key is grouped together. Lets see how it is done? If you recall the first insert statement which we have issued is as follows:
insert into forecast(cityid,forecast_date,humidity,chanceofrain,wind,feelslike,centigrade) values (1,'2013-12-10',0.76,0.1,10,8,8);
In this case all the columns such as: humidity, chainceofrain, wind, feelslike and centigrade will be grouped by value in forecast_date i.e 2013-12-10 00\:00\:00+0000. If we look at the output of Cassandra-cli we see that the first five column names have 2013-12-10 00\:00\:00+0000 as shown below:

=> (name=2013-12-10 00\:00\:00+0000:, value=, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:centigrade, value=00000008, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:chanceofrain, value=3dcccccd, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:feelslike, value=00000008, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:humidity, value=3f428f5c, timestamp=1386700252831000)
=> (name=2013-12-10 00\:00\:00+0000:wind, value=41200000, timestamp=1386700252831000)

In the above output, first column name is: 2013-12-10 00\:00\:00+0000 which represents clustering key. Note that this column does not have any key value. The value of the column is already stored in the column name. It is important to remember that in Cassandra column names can be of any binary type which is different from Relational databases where column names can only be text. The second column is: 2013-12-10 00\:00\:00+0000:centigrade. Its value is 00000008. Note that the forecast_date value has been appended in the column name. This is same with all the other columns which corresponds to 2013-12-10 00\:00\:00+0000. Similarly different values of forecast_dates are appended to other columns as shown below:

=> (name=2013-12-11 00\:00\:00+0000:, value=, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:centigrade, value=00000004, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:chanceofrain, value=3e99999a, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:feelslike, value=00000004, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:humidity, value=3f666666, timestamp=1386700252835000)
=> (name=2013-12-11 00\:00\:00+0000:wind, value=41400000, timestamp=1386700252835000)
=> (name=2013-12-12 00\:00\:00+0000:, value=, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:centigrade, value=00000003, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:chanceofrain, value=3e4ccccd, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:feelslike, value=00000003, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:humidity, value=3f2e147b, timestamp=1386700255855000)
=> (name=2013-12-12 00\:00\:00+0000:wind, value=40c00000, timestamp=1386700255855000)

In the above output, columns which are associated with clustering key: 2013-12-11 00\:00\:00+000 have columns names starting with 2013-12-11 00\:00\:00+000. Similarly columns which are associated with clustering key: 2013-12-12 00\:00\:00+0000 have column names starting with 2013-12-12 00\:00\:00+0000. As there are three different clustering key values therefore we get three rows when we run select statement in cqlsh.

Suppose that the city is very big and we want to store weather forecast separately for each region/town in that city. One option could be to define a composite partition key which is composed of cityid and regionid. In that case row key would be city id and region id. Lets create this table into the weather keyspace using cqlsh.

create table forecast_for_region(cityid int,regionid int, forecast_date timestamp,humidity float,chanceofrain float,wind float,feelslike int, centigrade int, primary key ((cityid,regionid),forecast_date)); 

Now insert some data into the table:
insert into forecast_for_region(cityid,regionid,forecast_date,humidity,chanceofrain,wind,feelslike,centigrade) values (1,24, '2013-12-10',0.76,0.1,10,8,8);
insert into forecast_for_region(cityid,regionid,forecast_date,humidity,chanceofrain,wind,feelslike,centigrade) values (1,24,'2013-12-11',0.90,0.3,12,4,4);
insert into forecast_for_region(cityid,regionid,forecast_date,humidity,chanceofrain,wind,feelslike,centigrade) values (1,24,'2013-12-12',0.68,0.2,6,3,3);

Check the data in cqlsh using select statement:
select * from forecast_for_region; 

The output would be as follows:
 cityid | regionid | forecast_date            | centigrade | chanceofrain | feelslike | humidity | wind
--------+----------+--------------------------+------------+--------------+-----------+----------+------
      1 |       24 | 2013-12-10 00:00:00+0000 |          8 |          0.1 |         8 |     0.76 |   10
      1 |       24 | 2013-12-11 00:00:00+0000 |          4 |          0.3 |         4 |      0.9 |   12
      1 |       24 | 2013-12-12 00:00:00+0000 |          3 |          0.2 |         3 |     0.68 |    6 

Check the output in cassandra-cli:

list forecast_for_region;

RowKey: 1:24
=> (name=2013-12-10 00\:00\:00+0000:, value=, timestamp=1386777901856000)
=> (name=2013-12-10 00\:00\:00+0000:centigrade, value=00000008, timestamp=1386777901856000)
=> (name=2013-12-10 00\:00\:00+0000:chanceofrain, value=3dcccccd, timestamp=1386777901856000)
=> (name=2013-12-10 00\:00\:00+0000:feelslike, value=00000008, timestamp=1386777901856000)
=> (name=2013-12-10 00\:00\:00+0000:humidity, value=3f428f5c, timestamp=1386777901856000)
=> (name=2013-12-10 00\:00\:00+0000:wind, value=41200000, timestamp=1386777901856000)
=> (name=2013-12-11 00\:00\:00+0000:, value=, timestamp=1386777901907000)
=> (name=2013-12-11 00\:00\:00+0000:centigrade, value=00000004, timestamp=1386777901907000)
=> (name=2013-12-11 00\:00\:00+0000:chanceofrain, value=3e99999a, timestamp=1386777901907000)
=> (name=2013-12-11 00\:00\:00+0000:feelslike, value=00000004, timestamp=1386777901907000)
=> (name=2013-12-11 00\:00\:00+0000:humidity, value=3f666666, timestamp=1386777901907000)
=> (name=2013-12-11 00\:00\:00+0000:wind, value=41400000, timestamp=1386777901907000)
=> (name=2013-12-12 00\:00\:00+0000:, value=, timestamp=1386777901911000)
=> (name=2013-12-12 00\:00\:00+0000:centigrade, value=00000003, timestamp=1386777901911000)
=> (name=2013-12-12 00\:00\:00+0000:chanceofrain, value=3e4ccccd, timestamp=1386777901911000)
=> (name=2013-12-12 00\:00\:00+0000:feelslike, value=00000003, timestamp=1386777901911000)
=> (name=2013-12-12 00\:00\:00+0000:humidity, value=3f2e147b, timestamp=1386777901911000)
=> (name=2013-12-12 00\:00\:00+0000:wind, value=40c00000, timestamp=1386777901911000)

1 Row Returned.
Elapsed time: 225 msec(s).
In the above output we can see that the Row key is the combination of cityid and regionid. This means data for different regions within same city can reside on different partitions or nodes in a cluster.

I hope these examples would have helped you to clarify few concepts of data modelling in Cassandra. Please feel free to leave any comments related to this post.

78 comments:

  1. Ganesh Rajasekaran20 July 2014 at 01:04

    Hey Shakir Ali,
    It is very good article. I was trying to understand how the partitioned and cluster key works, your article is very clear and upto the point, rather too much theoritcal.

    Thanks,
    Ganesh Rajasekaran.

    ReplyDelete
  2. Very informative, thanks!

    ReplyDelete
  3. Thanks, that was very helpful.

    ReplyDelete
  4. Thanks. Explained very clearly. You should write more articles on cassandra :)

    ReplyDelete
  5. Excellent articles. Made things lot more clear. Thank you.

    ReplyDelete
  6. Excellent article.

    ReplyDelete
  7. excellent explanation, excellent article!

    ReplyDelete
  8. Good Understanding of the topic.Explained and clear article.

    ReplyDelete
  9. Excellently explained. I hope you write more articles on Cassandra. I have just started learning Cassandra and your articles are an excellent resource for me to learn it.

    ReplyDelete
  10. Thanks. This was really helpful! definitely keep up the great articles!

    ReplyDelete
  11. Good one. I refer this post whenever I have doubts in Cassandra.

    ReplyDelete
  12. I would like to see the cli representation if the clustering key had another column not just forecast_date

    ReplyDelete
  13. I am new to Cassandra and have been searching for a very basic understanding with some examples, This is probably the best. Thanks Shakir !!! I would love to see more such articles , especially about what is column family, super column family etc.

    Thanks
    Pritam

    ReplyDelete
  14. Very good for beginners !

    ReplyDelete
  15. Thanks! this is a good addition to the datastax training. Was looking for something to make this more clear.

    ReplyDelete
  16. Thanks, This is very useful information.

    Can we know from which node the record is coming in java using any library.

    ReplyDelete
  17. Fabulous work, Thanks a ton for sharing this :)

    ReplyDelete
  18. Great explanation, but I would add that Cassandra can store up to
    2 billion columns per row. That causes some limitation in your examples.

    ReplyDelete
  19. Very well written article. You have explained the concepts of Primary Key, Composite/Compound Key, Partition Key, Clustering Key very well. With your examples of the cassandra-cli output, you have also briefly introduced the storage format in terms of how the bytes are laid out on disk. However, these examples apply for Cassandra versions before Cassandra 3.x. It will be great if you can write similar article for the new storage format used in Cassandra 3.x.

    ReplyDelete
  20. Helps me a lot. Thanks for this.

    ReplyDelete
  21. Very good article. Insightful !

    ReplyDelete
  22. This comment has been removed by the author.

    ReplyDelete
  23. Very good article...!!!

    ReplyDelete
  24. Excellent article! Thanks

    ReplyDelete
  25. This is great article for a beginner. You have documented key concepts with simple and easy to understand examples.

    ReplyDelete
  26. Thanks for this great share. Very Useful Information. Cassandra is a fully distributed, masterless database, offering superior scalability and fault tolerance to traditional single master databases. Compared with other popular distributed databases like Riak, HBase, and Voldemort, Cassandra offers a uniquely robust and expressive interface for modeling and querying data.

    ReplyDelete
  27. very excellent articles. Two ideas:
    1. cassandra-cli is deprecated in cassandra 3.x. Maybe we should use other tool.
    2. We could say clustering key prepend the column name, not append.

    ReplyDelete
  28. Thanks for excellent article

    ReplyDelete
  29. Crystal clear and to the point. Thanks!

    ReplyDelete
  30. here are numerous payroll options made available due to the online kind of QuickBooks varying upon the need of accounting professionals and subscription plans. Quickbooks Payroll Support Number as well provides all possible assist with the users to utilize it optimally. Somebody who keeps experience of experts has the ability to realize about the latest updates.

    ReplyDelete
  31. QuickBooks Tech Support advisors are certified Pro-advisors’ and has forte in furnishing any kind of technical issues for QuickBooks. They have been expert and certified technicians of these domains like QuickBooks accounting,QuickBooks Payroll, Point of Sales, QuickBooks Merchant Services and Inventory issues to provide 24/7 service to our esteemed customers. QuickBooks payroll Services provide methods to all your valuable QuickBooks problem and in addition assists in identifying the errors with QuickBooks data files and diagnose them thoroughly before resolving these problems.

    ReplyDelete
  32. QuickBooks Enterprise has almost eliminated the typical accounting process. Along with a wide range of tools and automations, it provides a wide range of industry verticals with specialized QuickBooks Enterprise Support Phone Number

    ReplyDelete
  33. Our specialist can surely do wonders and they take action every day when a user comes to us with regards to QuickBooks problems. Our QuickBooks Customer Support Number team, especially, tackle every bugs and error of QuickBooks. Because of this, to name a few

    ReplyDelete
  34. In conclusion, don’t hesitate to call us on our QuickBooks Online Help Number. We have been surely here for you personally. To conclude, any error, any difficulty, any bug or anything else associated with QuickBooks related problem, just call our QuickBooks Customer Support Number. Surely, call our QuickBooks Support telephone number

    ReplyDelete
  35. Our support, as covered by Quickbooks Enterprise Support Phone Number Usa Experts at, includes most of the functional and technical aspects from the QuickBooks Enterprise. They include all QuickBooks errors encountered during the running of QuickBooks Enterprise and all sorts of issues faced during Installation, update, and also the backup of QB Enterprise.

    ReplyDelete
  36. The error will not fix completely unless you comprehend the root cause related to problem.As company file plays an extremely crucial role in account management, so that QuickBooks Support Phone Number becomes only a little tough to spot.

    ReplyDelete
  37. If this doesn’t help you, go ahead and connect to us at QuickBooks Tech Support Phone Number. Most of us works 24*7 and serve its customers with excellent service each time they contact us. Regardless of what issue is and however complex it really is, we assure you that we offers you optimal solution as soon as possible.

    ReplyDelete
  38. If you're a QuickBooks POS Users having trouble in your QuickBooks you are able to reach us at QuickBooks Support Phone Number to receive support from our dedicated team.We have a different team to serve the QuickBooks POS users. Our POS Support team will allow you to out 24X7 with all your QuickBooks POS.

    ReplyDelete
  39. QuickBooks Enterprise has got plenty of alternatives for most of us. Significant quantity of features from the end are there any to guide both both you and contribute towards enhancing your online business. QucikBooks Enterprise Technical SupportQuickBooks Enterprise is all about.

    ReplyDelete

  40. You need to decide the QuickBooks Payroll Support Phone Number the terribly second you will get a slip-up on your screen. it is potential that you just may lose information, or get corruption in your record or company file if the error prolongs.

    ReplyDelete
  41. QuickBooks has made payroll management quite definitely easier for accounting professionals. There are plenty people that are giving positive feedback once they process payroll either QB desktop and online options. In this internet site, we will allow you to experience to create and put within the checklist for employee payment. To have more enhanced results and optimized benefits, you can take some help from experts making a call at QuickBooks Payroll Support Phone Number USA. Well! If you’re not in a position to customize employee payroll in Quickbooks which makes the list optimally, in QB and QB desktop, then read the description ahead. Here, you will get the determination of numerous type of information that which you’ve close at hand for assisting the setup process with comfort.

    ReplyDelete
  42. QuickBooks will never ask any of their clients to do face those issues all alone, and they help you in payment and invoice systems. What are the Basic features of QuickBooks Online Phone Number.

    ReplyDelete
  43. When the process of downloading the QuickBooks file doctor will be completed, then you will see the further installation which you will need to do by clicking on the file named QuickBooks Support Number. For the complete installation, it is necessary that the Microsoft Net is enabled on the Windows 10.

    ReplyDelete
  44. QuickBooks Enterprise Support Contact Number software error free, contact us at an get related to us in minutes. before calling us, all you have to do is always to make sure that you have a very good web connection

    ReplyDelete
  45. QuickBooks 2019 will be the better account management product till now. The recent improvement that is built in this system regarding current user requirements and the solutions to overcome the limitation of previous QuickBooks versions. We've been here to improve your understanding with regards to the payroll updates happens in QuickBooks Enterprise, desktop, pro, premier 2019 versions. Solve your queries related to QuickBooks Online Payroll whether Enhanced or Full Service. Fix all of the issues for QuickBooks Desktop Payroll Basic, Standard, & Payroll Assisted. Check out the aforementioned number to get hold of our ProAdvisor to possess support for QuickBooks Payroll Tech Support, Intuit Online & Full Service Payroll.

    ReplyDelete
  46. Intuit has developed these items by continuing to keep contractor’s needs at heart; also, looked after the software solution based on the company size. At the moment, QuickBook Support software covers significantly more than 80% associated with the small-business share of the market.

    ReplyDelete
  47. QuickBooks Payroll Tech Support helps one to resolve all your valuable technical and functional problems whilst looking after this well known extensive, premium and end-to-end business accounting and payroll management software. Our experts team at QuickBooks payroll support number is going to make you understand its advanced functions and assists someone to lift up your business growth.

    ReplyDelete
  48. QuickBooks Support Phone Number accounting software program is compatible even yet in the Macintosh operating system and users can enjoy all the features given by downloading it. This software may also be used on iPhone through the QuickBooks app for iOS users.

    ReplyDelete
  49. The procedure to put in and put up QuickBooks Support Phone Number on Windows is same as that of Mac. The machine requirements when it comes to installation process can vary greatly slightly for both the operating system. You simply need to take proper care of that and just make certain you check and verify them first, before starting with all the procedure.

    ReplyDelete
  50. So for this, QuickBooks is one of the great accounting software to easily manage all of those things. If you utilize this great accounting software if you might be struggling with any errors or issues related to QuickBooks Support Number like undo reconciliation in QuickBooks online and a lot more.

    ReplyDelete
  51. We plan to give you the immediate support by our well- masterly technicians. A group of QuickBooks Support dedicated professionals is invariably accessible to suit your needs so as to arranged all of your problems in an attempt that you’ll be able to do your projects while not hampering the productivity.

    ReplyDelete
  52. QuickBooks Desktop version is usually additionally divided in to QuickBooks professional, QuickBooks Premier and QuickBooks Enterprise. you’ll get the version which may be additional apt for your needs. you must additionally get guidance and QuickBooks Support for the code that square measure obtainable 24/7. If just in case you come across any QuickBooks errors or problems or would really like any facilitate, you’ll dial the direct line variety to achieve the QuickBooks specialists.

    ReplyDelete
  53. facing problem while upgrading QuickBooks Tech Support towards the newest version. There could be trouble while taking backup within your data, you may possibly never be able to open your business file on multi-user mode.

    ReplyDelete

  54. QuickBooks Payroll Customer Service Number helps you to resolve all your valuable technical and functional problems while looking after this well known extensive, premium and end-to-end business accounting and payroll management software. Our experts team at QuickBooks Payroll Tech Support Number will make you understand its advanced functions and assists anyone to lift up your company growth.

    ReplyDelete
  55. Looking financial QuickBooks Payroll Tech Support Phone Number of a business is the most important and inconvenient task. As soon as you might take good care of the running business and want to bring your online business to another height then maintaining the payroll budgetary info is essential. If you wish to help and get the capacity about.

    ReplyDelete
  56. The principal intent behind QuickBooks Support Phone Number would be to give you the technical help 24*7 so as with order in order to prevent wasting your productivity hours.

    ReplyDelete

  57. The QuickBooks Tech Support Phone Number is present 24/7 to provide much-needed integration related support and also to promptly make use of QuickBooks Premier with other Microsoft Office software programs.

    ReplyDelete
  58. The team working behind the QuickBooks customer support number are known to be the best engineers in the entire industry and with their timely advice, you are about to find a reliable solution that is worthy enough for the money you spend on them. The engineers and technicians are working hard to provide a friendly QuickBooks Support Phone Number that you desire to have for reaching them at any given situation.

    ReplyDelete
  59. Dial QuickBooks Tech Support Phone Number 1-855-236-7529 and get effective solutions for QuickBooks Error 6000 308. QuickBooks is popular accounting software that is capable of performing accounting tasks like payroll management and time tracking. The simplicity of this software makes it easy for any user to work on it. Despite being laced with such amazing features, this software sometimes gets entangled with some nasty errors like QuickBooks Error 6000 308. The team at QuickBooks Tech Support Phone Number 1-855-236-7529 provides simple solutions for the resolution of QuickBooks Error 6000 308.
    Read more: https://tinyurl.com/y3kahnzm

    ReplyDelete
  60. QuickBooks desktop enterprise comes with tracking of upto one-million items, vendors and buyers. It has advance and additional features than its two subsidiaries. Desktop enterprise has several advantages with disadvantages in the form of error. To get troubleshooting methods for any error, call us on QuickBooks Enterprise Support Phone Number +1-888-238-7409. Read more: - https://www.enetquickbookenterprise.com/ Visit us:- QuickBooks Error Support Phone Number

    ReplyDelete
  61. QuickBooks Prominent Features and Excellent QuickBooks Customer Support Phone Number +1 (855)-907-0605 QuickBooks is a world-class accounting software for small and medium sizes business. This accounting software has made the task of business owners quite easy by simplifying the management of accounting and finance

    ReplyDelete
  62. Hi! Amazing Write-up. Your blog contains a fabulous quality of content. I feel good to be here reading your magnificent post. If you are searching for accounting software that has lots of features for managing business accounts, then try using QuickBooks software. It is a leading accounting software that manages your business accounts effectively and efficiently.
    To get support for QuickBooks errors, call us immediately at our QuickBooks Helpline Number +1-844-232-O2O2 .
    visit us:-http://www.authorstream.com/Presentation/QBPAYROLL1234-4133537-quickbooks-helpline-number/

    ReplyDelete
  63. Thank you so much for this nice information. Hope so many people will get aware of this and useful as well. And please keep update like this.

    Big Data Consulting Services

    Data Lake Solutions

    Advanced Analytics Services

    Full Stack Development Solutions

    ReplyDelete
  64. Greate explanation! Thank you so much.

    ReplyDelete
  65. Runtime errors are generally caused by incompatible programs running at the same time. It may also occur because of memory problem, a bad graphics driver or virus infection. If you would like to learn How To Fix Quickbooks Error 9999, you can continue reading this blog.

    ReplyDelete
  66. I am coming here from the Udacity data engineer nano degree program, which has a section on Cassandra. Udacity was very vague and did not explain primary, compound, and clustering keys in the level of detail you did. Thanks for the great write up.

    ReplyDelete
  67. Very informative thank you So much :)

    ReplyDelete
  68. Nice blog has been shared by you. before i read this blog i didn't have any knowledge about this but now i got some knowledge.
    so keep on sharing such kind of an interesting blogs visit Casandra Tutorails

    ReplyDelete
  69. I read your post. It is very informative and helpful to me. I admire the message valuable information you provided in your article.
    power bi training

    ReplyDelete
  70. I am inspired with your post writing style & how continuously you describe this topic.I want to share about top 10 micronutrients company in india

    ReplyDelete
  71. Awesome article. Glad I found it. Concepts are clear to understand.

    ReplyDelete